-
Notifications
You must be signed in to change notification settings - Fork 824
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Write unit test for testing Hierarchy caching.
- Loading branch information
Maxime Rainville
committed
Sep 23, 2018
1 parent
cc7769a
commit dd436f5
Showing
1 changed file
with
150 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
<?php | ||
|
||
namespace SilverStripe\Versioned\Tests; | ||
|
||
use SilverStripe\Dev\SapphireTest; | ||
use SilverStripe\ORM\Hierarchy\Hierarchy; | ||
use SilverStripe\Versioned\Versioned; | ||
use SilverStripe\ORM\Tests\HierarchyTest\TestObject; | ||
use SilverStripe\ORM\Tests\HierarchyTest\HideTestObject; | ||
use SilverStripe\ORM\Tests\HierarchyTest\HideTestSubObject; | ||
|
||
/** | ||
* @internal Only test the right values are returned, not that the cache is actually used. | ||
*/ | ||
class HierachyCacheTest extends SapphireTest | ||
{ | ||
|
||
protected static $fixture_file = 'HierarchyTest.yml'; | ||
|
||
protected static $extra_dataobjects = array( | ||
TestObject::class, | ||
HideTestObject::class, | ||
HideTestSubObject::class, | ||
); | ||
|
||
public function setUp() | ||
{ | ||
parent::setUp(); | ||
TestObject::singleton()->flushCache(); | ||
} | ||
|
||
public static function setUpBeforeClass() | ||
{ | ||
parent::setUpBeforeClass(); | ||
HideTestObject::config()->update( | ||
'hide_from_hierarchy', | ||
[ HideTestSubObject::class ] | ||
); | ||
} | ||
|
||
public function cacheNumChildrenDataProvider() | ||
{ | ||
return [ | ||
[TestObject::class, 'obj1', false, 0, 'childless object should have a numChildren of 0'], | ||
[TestObject::class, 'obj1', true, 0, 'childless object should have a numChildren of 0 when cache'], | ||
[TestObject::class, 'obj2', false, 2, 'Root object numChildren should count direct children'], | ||
[TestObject::class, 'obj2', true, 2, 'Root object numChildren should count direct children when cache'], | ||
[TestObject::class, 'obj3a', false, 2, 'Sub object numChildren should count direct children'], | ||
[TestObject::class, 'obj3a', false, 2, 'Sub object numChildren should count direct children when cache'], | ||
[TestObject::class, 'obj3d', false, 0, 'Childess Sub object numChildren should be 0'], | ||
[TestObject::class, 'obj3d', true, 0, 'Childess Sub object numChildren should be 0 when cache'], | ||
[HideTestObject::class, 'obj4', false, 1, 'Hidden object should not be included in count'], | ||
[HideTestObject::class, 'obj4', true, 1, 'Hidden object should not be included in couunt when cache'] | ||
]; | ||
} | ||
|
||
|
||
/** | ||
* @dataProvider cacheNumChildrenDataProvider | ||
*/ | ||
public function testNumChildrenCache($className, $identifier, $cache, $expected, $message) | ||
{ | ||
$node = $this->objFromFixture($className, $identifier); | ||
|
||
$actual = $node->numChildren($cache); | ||
|
||
$this->assertEquals($expected, $actual, $message); | ||
|
||
if ($cache) { | ||
// When caching is eanbled, try re-accessing the numChildren value to make sure it doesn't change. | ||
$actual = $node->numChildren($cache); | ||
$this->assertEquals($expected, $actual, $message); | ||
} | ||
} | ||
|
||
public function prepopulateCacheNumChildrenDataProvider() | ||
{ | ||
return [ | ||
[ | ||
TestObject::class, 'Stage', [], | ||
TestObject::class, 'obj1', false, 0, 'childless object should have a numChildren of 0' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [], | ||
TestObject::class, 'obj1', true, 0, 'childless object should have a numChildren of 0 when cache' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [2], | ||
TestObject::class, 'obj1', false, 0, 'childless object should have a numChildren of 0' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [2], | ||
TestObject::class, 'obj1', true, 0, 'childless object should have a numChildren of 0 when cache' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [], | ||
TestObject::class, 'obj2', false, 2, 'Root object numChildren should count direct children' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [], | ||
TestObject::class, 'obj2', true, 2, 'Root object numChildren should count direct children when cache' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [2], | ||
TestObject::class, 'obj2', false, 2, 'Root object numChildren should count direct children' | ||
], | ||
[ | ||
TestObject::class, 'Stage', [2], | ||
TestObject::class, 'obj2', true, 2, 'Root object numChildren should count direct children when cache' | ||
], | ||
[ | ||
HideTestObject::class, 'Stage', [], | ||
HideTestObject::class, 'obj4', false, 1, 'Hidden object should not be included in count' | ||
], | ||
[ | ||
HideTestObject::class, 'Stage', [], | ||
HideTestObject::class, 'obj4', true, 1, 'Hidden object should not be included in count when cache' | ||
], | ||
[ | ||
HideTestObject::class, 'Stage', [2], | ||
HideTestObject::class, 'obj4', false, 1, 'Hidden object should not be included in count' | ||
], | ||
[ | ||
HideTestObject::class, 'Stage', [2], | ||
HideTestObject::class, 'obj4', true, 1, 'Hidden object should not be included in count when cache' | ||
] | ||
]; | ||
} | ||
|
||
/** | ||
* @dataProvider prepopulateCacheNumChildrenDataProvider | ||
*/ | ||
public function testPrepopulatedNumChildrenCache( | ||
$baseClass, | ||
$stage, | ||
$idList, | ||
$className, | ||
$identifier, | ||
$cache, | ||
$expected, | ||
$message | ||
) { | ||
Hierarchy::prepopulate_numchildren_cache($baseClass, $stage, $idList); | ||
$node = $this->objFromFixture($className, $identifier); | ||
|
||
$actual = $node->numChildren($cache); | ||
|
||
$this->assertEquals($expected, $actual, $message); | ||
} | ||
} |