silverstripe-fulltextsearch/tests/SearchUpdaterTest.php

176 lines
5.4 KiB
PHP
Raw Permalink Normal View History

<?php
namespace SilverStripe\FullTextSearch\Tests;
2017-04-21 06:34:04 +02:00
use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Dev\SapphireTest;
2017-04-21 06:34:04 +02:00
use SilverStripe\FullTextSearch\Search\FullTextSearch;
use SilverStripe\FullTextSearch\Search\Processors\SearchUpdateProcessor;
use SilverStripe\FullTextSearch\Search\Processors\SearchUpdateImmediateProcessor;
use SilverStripe\FullTextSearch\Search\Services\SearchableService;
use SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater;
2017-04-21 06:34:04 +02:00
use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_Container;
use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_HasOne;
use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_HasMany;
use SilverStripe\FullTextSearch\Tests\SearchUpdaterTest\SearchUpdaterTest_Index;
2015-11-21 07:19:20 +01:00
class SearchUpdaterTest extends SapphireTest
{
protected $usesDatabase = true;
2015-11-21 07:19:20 +01:00
private static $index = null;
2021-11-02 02:48:12 +01:00
protected function setUp(): void
2015-11-21 07:19:20 +01:00
{
parent::setUp();
2013-09-02 00:10:14 +02:00
2015-11-21 07:19:20 +01:00
if (self::$index === null) {
2017-04-21 06:34:04 +02:00
self::$index = SearchUpdaterTest_Index::singleton();
2015-11-21 07:19:20 +01:00
} else {
self::$index->reset();
}
Config::modify()->set(Injector::class, SearchUpdateProcessor::class, array(
'class' => SearchUpdateImmediateProcessor::class
2015-11-21 07:19:20 +01:00
));
2015-11-21 07:19:20 +01:00
FullTextSearch::force_index_list(self::$index);
SearchUpdater::clear_dirty_indexes();
}
2015-11-21 07:19:20 +01:00
public function testBasic()
{
$item = new SearchUpdaterTest_Container();
$item->write();
2021-11-02 02:48:12 +01:00
$this->assertTrue(true);
2015-11-21 07:19:20 +01:00
// TODO: Make sure changing field1 updates item.
// TODO: Get updating just field2 to not update item (maybe not possible - variants complicate)
}
2015-11-21 07:19:20 +01:00
public function testHasOneHook()
{
$classesToSkip = [SearchUpdaterTest_Container::class];
Config::modify()->set(SearchableService::class, 'indexing_canview_exclude_classes', $classesToSkip);
2015-11-21 07:19:20 +01:00
$hasOne = new SearchUpdaterTest_HasOne();
$hasOne->write();
2015-11-21 07:19:20 +01:00
$alternateHasOne = new SearchUpdaterTest_HasOne();
$alternateHasOne->write();
2015-11-21 07:19:20 +01:00
$container1 = new SearchUpdaterTest_Container();
$container1->HasOneObjectID = $hasOne->ID;
$container1->write();
2015-11-21 07:19:20 +01:00
$container2 = new SearchUpdaterTest_Container();
$container2->HasOneObjectID = $hasOne->ID;
$container2->write();
2015-11-21 07:19:20 +01:00
$container3 = new SearchUpdaterTest_Container();
$container3->HasOneObjectID = $alternateHasOne->ID;
$container3->write();
2015-11-21 07:19:20 +01:00
// Check the default "writing a document updates the document"
SearchUpdater::flush_dirty_indexes();
$added = self::$index->getAdded(['ID']);
2015-11-21 07:19:20 +01:00
// Some databases don't output $added in a consistent order; that's okay
usort($added, function ($a, $b) {
return $a['ID']-$b['ID'];
});
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
['ID' => $container3->ID],
], $added);
2015-11-21 07:19:20 +01:00
// Check writing a has_one tracks back to the origin documents
2015-11-21 07:19:20 +01:00
self::$index->reset();
2015-11-21 07:19:20 +01:00
$hasOne->Field1 = "Updated";
$hasOne->write();
2015-11-21 07:19:20 +01:00
SearchUpdater::flush_dirty_indexes();
$added = self::$index->getAdded(['ID']);
2015-11-21 07:19:20 +01:00
// Some databases don't output $added in a consistent order; that's okay
usort($added, function ($a, $b) {
return $a['ID']-$b['ID'];
});
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
], $added);
2015-11-21 07:19:20 +01:00
// Check updating an unrelated field doesn't track back
2015-11-21 07:19:20 +01:00
self::$index->reset();
2015-11-21 07:19:20 +01:00
$hasOne->Field2 = "Updated";
$hasOne->write();
2015-11-21 07:19:20 +01:00
SearchUpdater::flush_dirty_indexes();
$this->assertEquals([], self::$index->getAdded(['ID']));
2015-11-21 07:19:20 +01:00
// Check writing a has_one tracks back to the origin documents
2015-11-21 07:19:20 +01:00
self::$index->reset();
2015-11-21 07:19:20 +01:00
$alternateHasOne->Field1= "Updated";
$alternateHasOne->write();
2015-11-21 07:19:20 +01:00
SearchUpdater::flush_dirty_indexes();
$this->assertEquals([
['ID' => $container3->ID],
], self::$index->getAdded(['ID']));
2015-11-21 07:19:20 +01:00
}
2015-11-21 07:19:20 +01:00
public function testHasManyHook()
{
$classesToSkip = [SearchUpdaterTest_Container::class];
Config::modify()->set(SearchableService::class, 'indexing_canview_exclude_classes', $classesToSkip);
2015-11-21 07:19:20 +01:00
$container1 = new SearchUpdaterTest_Container();
$container1->write();
2015-11-21 07:19:20 +01:00
$container2 = new SearchUpdaterTest_Container();
$container2->write();
2015-11-21 07:19:20 +01:00
//self::$index->reset();
//SearchUpdater::clear_dirty_indexes();
2015-11-21 07:19:20 +01:00
$hasMany1 = new SearchUpdaterTest_HasMany();
$hasMany1->HasManyContainerID = $container1->ID;
$hasMany1->write();
2015-11-21 07:19:20 +01:00
$hasMany2 = new SearchUpdaterTest_HasMany();
$hasMany2->HasManyContainerID = $container1->ID;
$hasMany2->write();
2015-11-21 07:19:20 +01:00
SearchUpdater::flush_dirty_indexes();
$this->assertEquals([
['ID' => $container1->ID],
['ID' => $container2->ID],
], self::$index->getAdded(['ID']));
2015-11-21 07:19:20 +01:00
self::$index->reset();
2015-11-21 07:19:20 +01:00
$hasMany1->Field1 = 'Updated';
$hasMany1->write();
2015-11-21 07:19:20 +01:00
$hasMany2->Field1 = 'Updated';
$hasMany2->write();
2015-11-21 07:19:20 +01:00
SearchUpdater::flush_dirty_indexes();
$this->assertEquals([
['ID' => $container1->ID],
], self::$index->getAdded(['ID']));
2015-11-21 07:19:20 +01:00
}
}