2008-08-09 05:54:55 +02:00
|
|
|
<?php
|
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
namespace SilverStripe\ORM\Tests\Search;
|
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\Dev\SapphireTest;
|
|
|
|
use SilverStripe\Forms\TextField;
|
|
|
|
use SilverStripe\Forms\TextareaField;
|
|
|
|
use SilverStripe\Forms\NumericField;
|
|
|
|
use SilverStripe\Forms\FieldList;
|
|
|
|
use SilverStripe\ORM\Filters\PartialMatchFilter;
|
|
|
|
|
2008-08-09 05:54:55 +02:00
|
|
|
class SearchContextTest extends SapphireTest {
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2013-03-21 19:48:54 +01:00
|
|
|
protected static $fixture_file = 'SearchContextTest.yml';
|
2008-08-11 01:29:30 +02:00
|
|
|
|
2010-04-12 04:03:16 +02:00
|
|
|
protected $extraDataObjects = array(
|
2016-10-14 03:30:05 +02:00
|
|
|
SearchContextTest\Person::class,
|
|
|
|
SearchContextTest\Book::class,
|
|
|
|
SearchContextTest\Company::class,
|
|
|
|
SearchContextTest\Project::class,
|
|
|
|
SearchContextTest\Deadline::class,
|
|
|
|
SearchContextTest\Action::class,
|
|
|
|
SearchContextTest\AllFilterTypes::class,
|
2010-04-12 04:03:16 +02:00
|
|
|
);
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testResultSetFilterReturnsExpectedCount() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$person = SearchContextTest\Person::singleton();
|
2008-08-09 05:54:55 +02:00
|
|
|
$context = $person->getDefaultSearchContext();
|
2008-08-09 06:38:44 +02:00
|
|
|
$results = $context->getResults(array('Name'=>''));
|
2008-08-09 05:54:55 +02:00
|
|
|
$this->assertEquals(5, $results->Count());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:38:44 +02:00
|
|
|
$results = $context->getResults(array('EyeColor'=>'green'));
|
2008-08-09 05:54:55 +02:00
|
|
|
$this->assertEquals(2, $results->Count());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:38:44 +02:00
|
|
|
$results = $context->getResults(array('EyeColor'=>'green', 'HairColor'=>'black'));
|
2008-08-09 05:54:55 +02:00
|
|
|
$this->assertEquals(1, $results->Count());
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testSummaryIncludesDefaultFieldsIfNotDefined() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$person = SearchContextTest\Person::singleton();
|
2008-08-09 08:29:50 +02:00
|
|
|
$this->assertContains('Name', $person->summaryFields());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
$book = SearchContextTest\Book::singleton();
|
2008-08-09 08:29:50 +02:00
|
|
|
$this->assertContains('Title', $book->summaryFields());
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testAccessDefinedSummaryFields() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$company = SearchContextTest\Company::singleton();
|
2008-08-09 08:29:50 +02:00
|
|
|
$this->assertContains('Industry', $company->summaryFields());
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testPartialMatchUsedByDefaultWhenNotExplicitlySet() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$person = SearchContextTest\Person::singleton();
|
2012-12-08 12:20:20 +01:00
|
|
|
$context = $person->getDefaultSearchContext();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-12-08 12:20:20 +01:00
|
|
|
$this->assertEquals(
|
|
|
|
array(
|
|
|
|
"Name" => new PartialMatchFilter("Name"),
|
|
|
|
"HairColor" => new PartialMatchFilter("HairColor"),
|
|
|
|
"EyeColor" => new PartialMatchFilter("EyeColor")
|
|
|
|
),
|
|
|
|
$context->getFilters()
|
|
|
|
);
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testDefaultFiltersDefinedWhenNotSetInDataObject() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$book = SearchContextTest\Book::singleton();
|
2008-08-09 06:06:52 +02:00
|
|
|
$context = $book->getDefaultSearchContext();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-12-08 12:20:20 +01:00
|
|
|
$this->assertEquals(
|
|
|
|
array(
|
|
|
|
"Title" => new PartialMatchFilter("Title")
|
|
|
|
),
|
|
|
|
$context->getFilters()
|
|
|
|
);
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testUserDefinedFiltersAppearInSearchContext() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$company = SearchContextTest\Company::singleton();
|
2008-08-09 06:38:44 +02:00
|
|
|
$context = $company->getDefaultSearchContext();
|
2012-12-08 12:20:20 +01:00
|
|
|
|
2008-08-09 06:38:44 +02:00
|
|
|
$this->assertEquals(
|
2008-08-09 06:06:52 +02:00
|
|
|
array(
|
|
|
|
"Name" => new PartialMatchFilter("Name"),
|
2012-12-08 12:20:20 +01:00
|
|
|
"Industry" => new PartialMatchFilter("Industry"),
|
|
|
|
"AnnualProfit" => new PartialMatchFilter("AnnualProfit")
|
2008-08-09 06:06:52 +02:00
|
|
|
),
|
|
|
|
$context->getFilters()
|
2008-08-09 06:38:44 +02:00
|
|
|
);
|
2008-08-09 05:54:55 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testUserDefinedFieldsAppearInSearchContext() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$company = SearchContextTest\Company::singleton();
|
2008-08-11 01:29:30 +02:00
|
|
|
$context = $company->getDefaultSearchContext();
|
|
|
|
$fields = $context->getFields();
|
|
|
|
$this->assertEquals(
|
2011-05-11 09:51:54 +02:00
|
|
|
new FieldList(
|
2008-11-02 22:24:56 +01:00
|
|
|
new TextField("Name", 'Name'),
|
2012-12-08 12:20:20 +01:00
|
|
|
new TextareaField("Industry", 'Industry'),
|
|
|
|
new NumericField("AnnualProfit", 'The Almighty Annual Profit')
|
2008-08-11 01:29:30 +02:00
|
|
|
),
|
|
|
|
$context->getFields()
|
|
|
|
);
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testRelationshipObjectsLinkedInSearch() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$action3 = $this->objFromFixture(SearchContextTest\Action::class, 'action3');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
$project = singleton(SearchContextTest\Project::class);
|
2008-08-09 06:38:44 +02:00
|
|
|
$context = $project->getDefaultSearchContext();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:53:34 +02:00
|
|
|
$params = array("Name"=>"Blog Website", "Actions__SolutionArea"=>"technical");
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:53:34 +02:00
|
|
|
$results = $context->getResults($params);
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:53:34 +02:00
|
|
|
$this->assertEquals(1, $results->Count());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2008-08-09 06:53:34 +02:00
|
|
|
$project = $results->First();
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
$this->assertInstanceOf(SearchContextTest\Project::class, $project);
|
2008-08-09 06:53:34 +02:00
|
|
|
$this->assertEquals("Blog Website", $project->Name);
|
|
|
|
$this->assertEquals(2, $project->Actions()->Count());
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-10-02 02:05:19 +02:00
|
|
|
$this->assertEquals(
|
2014-08-15 08:53:05 +02:00
|
|
|
"Get RSS feeds working",
|
2009-10-02 02:05:19 +02:00
|
|
|
$project->Actions()->find('ID', $action3->ID)->Description
|
|
|
|
);
|
2008-08-09 06:06:52 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testCanGenerateQueryUsingAllFilterTypes() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$all = SearchContextTest\AllFilterTypes::singleton();
|
2008-08-09 06:06:52 +02:00
|
|
|
$context = $all->getDefaultSearchContext();
|
|
|
|
$params = array(
|
2009-10-02 02:05:19 +02:00
|
|
|
"ExactMatch" => "Match me exactly",
|
2008-08-09 06:06:52 +02:00
|
|
|
"PartialMatch" => "partially",
|
2016-10-14 03:30:05 +02:00
|
|
|
"CollectionMatch" => array(
|
|
|
|
"ExistingCollectionValue",
|
|
|
|
"NonExistingCollectionValue",
|
|
|
|
4,
|
|
|
|
"Inline'Quotes'"
|
|
|
|
),
|
2008-08-09 08:40:50 +02:00
|
|
|
"StartsWith" => "12345",
|
2009-05-24 23:27:48 +02:00
|
|
|
"EndsWith" => "ijkl",
|
|
|
|
"Fulltext" => "two"
|
2008-08-09 06:06:52 +02:00
|
|
|
);
|
2009-10-02 02:05:19 +02:00
|
|
|
|
2008-08-09 06:06:52 +02:00
|
|
|
$results = $context->getResults($params);
|
|
|
|
$this->assertEquals(1, $results->Count());
|
|
|
|
$this->assertEquals("Filtered value", $results->First()->HiddenValue);
|
|
|
|
}
|
2012-03-14 16:05:28 +01:00
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testStartsWithFilterCaseInsensitive() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$all = SearchContextTest\AllFilterTypes::singleton();
|
2012-03-14 16:05:28 +01:00
|
|
|
$context = $all->getDefaultSearchContext();
|
|
|
|
$params = array(
|
|
|
|
"StartsWith" => "12345-6789 camelcase", // spelled lowercase
|
|
|
|
);
|
|
|
|
|
|
|
|
$results = $context->getResults($params);
|
|
|
|
$this->assertEquals(1, $results->Count());
|
|
|
|
$this->assertEquals("Filtered value", $results->First()->HiddenValue);
|
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testEndsWithFilterCaseInsensitive() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$all = SearchContextTest\AllFilterTypes::singleton();
|
2012-03-14 16:05:28 +01:00
|
|
|
$context = $all->getDefaultSearchContext();
|
|
|
|
$params = array(
|
|
|
|
"EndsWith" => "IJKL", // spelled uppercase
|
|
|
|
);
|
|
|
|
|
|
|
|
$results = $context->getResults($params);
|
|
|
|
$this->assertEquals(1, $results->Count());
|
|
|
|
$this->assertEquals("Filtered value", $results->First()->HiddenValue);
|
|
|
|
}
|
2008-08-09 05:54:55 +02:00
|
|
|
}
|
|
|
|
|
2012-02-12 21:22:11 +01:00
|
|
|
|