Source of file SearchFilterableArrayListTest.php
Size: 13,800 Bytes - Last Modified: 2021-12-23T10:20:32+00:00
/var/www/docs.ssmods.com/process/src/tests/SearchFilterableArrayListTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 | <?php namespace Signify\Tests; use SilverStripe\Dev\SapphireTest; use Signify\ORM\SearchFilterableArrayList; class SearchFilterableArrayListTest extends SapphireTest { protected $usesDatabase = false; protected $objects; protected function setUp() { parent::setUp(); $this->objects = [ $this->createDummyObject([ 'Title' => 'First Object', 'NoCase' => 'CaSe SeNsItIvE', 'CaseSensitive' => 'Case Sensitive', 'StartsWithTest' => 'Test Value', 'GreaterThan100' => 300, 'LessThan100' => 50, ]), $this->createDummyObject([ 'Title' => 'Second Object', 'NoCase' => 'case sensitive', 'CaseSensitive' => 'case sensitive', 'StartsWithTest' => 'Not Starts With Test', 'GreaterThan100' => 101, 'LessThan100' => 99, ]), $this->createDummyObject([ 'Title' => 'Third Object', 'NoCase' => null, 'StartsWithTest' => 'Does not start with test', 'GreaterThan100' => 99, 'LessThan100' => 99, ]), $this->createDummyObject([ 'Title' => 'Fourth Object', 'StartsWithTest' => 'test value, but lower case', 'GreaterThan100' => 100, 'LessThan100' => 100, ]), ]; } /** * @useDatabase false */ public function testFind() { $list = new SearchFilterableArrayList($this->objects); // These should all find the object indicated in the variable name. $findFirst = $list->find('Title', 'First Object'); $findFirst2 = $list->find('StartsWithTest:StartsWith:nocase', 'Test'); $findSecond = $list->find('StartsWithTest:StartsWith:not', 'Test'); $findThird = $list->find('GreaterThan100:LessThan', 100); self::assertEquals('First Object', $findFirst->Title); self::assertEquals('First Object', $findFirst2->Title); self::assertEquals('Second Object', $findSecond->Title); self::assertEquals('Third Object', $findThird->Title); // These should not find any result. $noFind1 = $list->find('Title', 'No Results'); $noFind2 = $list->find('LessThan100:GreaterThan', 1000); $noFind3 = $list->find('LessThan100:LessThan:not', 1000); self::assertNull($noFind1); self::assertNull($noFind2); self::assertNull($noFind3); } /** * @useDatabase false */ public function testFilter() { $list = new SearchFilterableArrayList($this->objects); // Filter using the "not" modifier which retains 3 objects. $notFilter1 = $list->filter('Title:not', 'First Object'); $notFilter1Retained = $notFilter1->column('Title'); self::assertCount(3, $notFilter1Retained, 'Three objects remain in the list.'); self::assertNotContains('First Object', $notFilter1Retained); // Filter using the "not" modifier which retains 2 objects. $notFilter2 = $list->filter([ 'Title:not' => 'First Object', 'Title:ExactMatch:not' => 'Second Object', ]); $notFilter2Retained = $notFilter2->column('Title'); self::assertCount(2, $notFilter2Retained, 'Two objects remain in the list.'); self::assertContains('Third Object', $notFilter2Retained); self::assertContains('Fourth Object', $notFilter2Retained); // Filter using the "not" modifier which retains 4 objects. $notFilter3 = $list->filter('Title:not', 'No Object'); self::assertCount(4, $notFilter3->toArray(), 'All objects are retained.'); // Filter to test multiple value arguments which retains two objects. $basicFilter1 = $list->filter('Title', ['First Object', 'Second Object']); $basicFilter1Retained = $basicFilter1->column('Title'); self::assertCount(2, $basicFilter1Retained, 'Two objects remain in the list.'); self::assertContains('First Object', $basicFilter1Retained); self::assertContains('Second Object', $basicFilter1Retained); // Simple filter which returns an empty list. $basicFilter2 = $list->filter([ 'Title', 'No Object', ]); self::assertEmpty($basicFilter2->toArray(), 'All objects are filtered out.'); } /** * @useDatabase false */ public function testFilterAdvanced() { $list = new SearchFilterableArrayList($this->objects); // Filter testing case sensitivity which retains 1 object. $caseFilter1 = $list->filter('NoCase', 'case sensitive'); $caseFilter1Retained = $caseFilter1->column('Title'); self::assertCount(1, $caseFilter1Retained, 'One object remains in the list.'); self::assertContains('Second Object', $caseFilter1Retained); // Filter testing case sensitivity which retains 2 objects. $caseFilter2 = $list->filter(['NoCase:nocase' => 'case sensitive']); $caseFilter2Retained = $caseFilter2->column('Title'); self::assertCount(2, $caseFilter2Retained, 'Two objects remain in the list.'); self::assertContains('First Object', $caseFilter2Retained); self::assertContains('Second Object', $caseFilter2Retained); // Filter testing case sensitivity which retains 1 object. $caseFilter3 = $list->filter([ 'NoCase:nocase' => 'case sensitive', 'CaseSensitive' => 'case sensitive', ]); $caseFilter3Retained = $caseFilter3->column('Title'); self::assertCount(1, $caseFilter3Retained, 'One object remains in the list.'); self::assertContains('Second Object', $caseFilter3Retained); // Filter to test case sensitivity which returns an empty list. $caseFilter4 = $list->filter('NoCase', 'Case Sensitive'); self::assertEmpty($caseFilter4->toArray(), 'All objects are filtered out.'); // Filter to test the GreaterThan filter which retains 2 objects. $greaterLesserFilter1 = $list->filter('GreaterThan100:GreaterThan', 100); $greaterLesserFilter1Retained = $greaterLesserFilter1->column('Title'); self::assertCount(2, $greaterLesserFilter1Retained, 'Two objects remain in the list.'); self::assertContains('First Object', $greaterLesserFilter1Retained); self::assertContains('Second Object', $greaterLesserFilter1Retained); // Filter to test the LessThan filter which retains 3 objects. $greaterLesserFilter2 = $list->filter('LessThan100:LessThan', 100); $greaterLesserFilter2Retained = $greaterLesserFilter2->column('Title'); self::assertCount(3, $greaterLesserFilter2Retained, 'Three objects remain in the list.'); self::assertNotContains('Fourth Object', $greaterLesserFilter2Retained); // Filter to test the LessThan filter and not modifier which retains 1 object. $greaterLesserFilter3 = $list->filter('LessThan100:LessThan:not', 100); $greaterLesserFilter3Retained = $greaterLesserFilter3->column('Title'); self::assertCount(1, $greaterLesserFilter3Retained, 'One object remains in the list.'); self::assertContains('Fourth Object', $greaterLesserFilter3Retained); // Filter to test the GreaterThan and LessThan filters which retains 1 object. $greaterLesserFilter4 = $list->filter([ 'LessThan100:LessThan' => 100, 'GreaterThan100:GreaterThan:not' => 100, ]); $greaterLesserFilter4Retained = $greaterLesserFilter4->column('Title'); self::assertCount(1, $greaterLesserFilter4Retained, 'One object remains in the list.'); self::assertContains('Third Object', $greaterLesserFilter4Retained); // A filter using the GreaterThan and LesserThan filters which returns an empty list. $greaterLesserFilter5 = $list->filter([ 'LessThan100:LessThan' => 1, 'GreaterThan100:GreaterThan' => 100, ]); self::assertEmpty($greaterLesserFilter5->toArray(), 'All objects are filtered out.'); } /** * @useDatabase false */ public function testFilterMultipleRequirements() { $list = new SearchFilterableArrayList($this->objects); // Filter testing multiple filter items which retains 1 object. $multiFilter1 = $list->filter([ 'NoCase:nocase' => 'CASE SENSITIVE', 'StartsWithTest:StartsWith' => 'Not', ]); $multiFilter1Retained = $multiFilter1->column('Title'); self::assertCount(1, $multiFilter1Retained, 'One object remains in the list.'); self::assertContains('Second Object', $multiFilter1Retained); // Filter testing multiple filter items which retains 0 objects. $multiFilter2 = $list->filter([ 'NoCase:case' => 'CASE SENSITIVE', 'StartsWithTest:StartsWith' => 'Not', ]); self::assertEmpty($multiFilter2->toArray(), 'All objects are excluded.'); } /** * @useDatabase false */ public function testFilterAny() { $list = new SearchFilterableArrayList($this->objects); // FilterAny test that retains 3 objects. $filterAny1 = $list->filterAny([ 'GreaterThan100:GreaterThan' => 100, 'GreaterThan100:LessThan' => 100, ]); $filterAny1Retained = $filterAny1->column('Title'); self::assertCount(3, $filterAny1Retained, 'Three objects remain in the list.'); self::assertNotContains('Fourth Object', $filterAny1Retained); // FilterAny test that retains 3 objects. $filterAny2 = $list->filterAny([ 'NoCase:not' => null, 'LessThan100' => 100, ]); $filterAny2Retained = $filterAny2->column('Title'); self::assertCount(3, $filterAny2Retained, 'Three objects remain in the list.'); self::assertNotContains('Third Object', $filterAny2Retained); // FilterAny test that retains 2 objects. $filterAny3 = $list->filterAny([ 'StartsWithTest:StartsWith:case' => 'test', 'StartsWithTest:EndsWith:case' => 'test', ]); $filterAny3Retained = $filterAny3->column('Title'); self::assertCount(2, $filterAny3Retained, 'Two objects remain in the list.'); self::assertContains('Third Object', $filterAny3Retained); self::assertContains('Fourth Object', $filterAny3Retained); } /** * @useDatabase false */ public function testExclude() { $list = new SearchFilterableArrayList($this->objects); // Exclude using the "not" modifier which retains 1 object. $notExclude1 = $list->exclude('Title:not', 'First Object'); $notExclude1Retained = $notExclude1->column('Title'); self::assertCount(1, $notExclude1Retained, 'One object remains in the list.'); self::assertContains('First Object', $notExclude1Retained); // Exclude using the "not" modifier which returns two items. $notExclude2 = $list->exclude([ 'Title:not' => 'First Object', 'Title:ExactMatch:not' => 'Second Object', ]); $notExclude2Retained = $notExclude2->column('Title'); self::assertCount(2, $notExclude2Retained, 'Two objects remain in the list.'); self::assertContains('First Object', $notExclude2Retained); self::assertContains('Second Object', $notExclude2Retained); // Exclude using the "not" modifier which returns an empty list. $notExclude3 = $list->exclude('Title:not', 'No Object'); self::assertEmpty($notExclude3->toArray(), 'All objects are excluded.'); // Simple exclude which retains 4 objects. $notExclude4 = $list->exclude([ 'Title' => 'No Object', ]); self::assertCount(4, $notExclude4->toArray(), 'No objects are excluded.'); } /** * @useDatabase false */ public function testExcludeAny() { $list = new SearchFilterableArrayList($this->objects); // ExcludeAny test that retains 1 object. $excludeAny1 = $list->excludeAny([ 'GreaterThan100:GreaterThan' => 100, 'GreaterThan100:LessThan' => 100, ]); $excludeAny1Retained = $excludeAny1->column('Title'); self::assertCount(1, $excludeAny1Retained, 'One object remains in the list.'); self::assertContains('Fourth Object', $excludeAny1Retained); // ExcludeAny test that retains 1 object. $excludeAny2 = $list->excludeAny([ 'NoCase:not' => null, 'LessThan100' => 100, ]); $excludeAny2Retained = $excludeAny2->column('Title'); self::assertCount(1, $excludeAny2Retained, 'One object remains in the list.'); self::assertContains('Third Object', $excludeAny2Retained); // ExcludeAny test that retains 2 objects. $excludeAny3 = $list->excludeAny([ 'StartsWithTest:StartsWith:case' => 'test', 'StartsWithTest:EndsWith:case' => 'test', ]); $excludeAny3Retained = $excludeAny3->column('Title'); self::assertCount(2, $excludeAny3Retained, 'Two objects remain in the list.'); self::assertContains('First Object', $excludeAny3Retained); self::assertContains('Second Object', $excludeAny3Retained); } protected function createDummyObject($fields) { $dummyObject = new \stdClass(); foreach ($fields as $name => $value) { $dummyObject->$name = $value; } return $dummyObject; } } |