search_api-8.x-1.15/tests/src/Kernel/Datasource/DatasourceTaskTest.php
tests/src/Kernel/Datasource/DatasourceTaskTest.php
<?php namespace Drupal\Tests\search_api\Kernel\Datasource; use Drupal\entity_test\Entity\EntityTestMulRevChanged; use Drupal\KernelTests\KernelTestBase; use Drupal\language\Entity\ConfigurableLanguage; use Drupal\search_api\Entity\Index; use Drupal\search_api\Entity\Server; use Drupal\search_api\Utility\Utility; /** * Tests task integration of the content entity datasource. * * @group search_api */ class DatasourceTaskTest extends KernelTestBase { /** * {@inheritdoc} */ public static $modules = [ 'search_api', 'search_api_test', 'language', 'user', 'system', 'entity_test', ]; /** * The test entity type used in the test. * * @var string */ protected $testEntityTypeId = 'entity_test_mulrev_changed'; /** * The search server used for testing. * * @var \Drupal\search_api\ServerInterface */ protected $server; /** * The search index used for testing. * * @var \Drupal\search_api\IndexInterface */ protected $index; /** * The task manager to use for the tests. * * @var \Drupal\search_api\Task\TaskManagerInterface */ protected $taskManager; /** * {@inheritdoc} */ public function setUp() { parent::setUp(); // Enable translation for the entity_test module. \Drupal::state()->set('entity_test.translation', TRUE); // Define the bundles for our test entity type. (Should happen before we // install its entity schema.) $bundles = [ 'article' => [ 'label' => 'Article', ], 'item' => [ 'label' => 'Item', ], ]; \Drupal::state()->set($this->testEntityTypeId . '.bundles', $bundles); $this->installSchema('search_api', ['search_api_item']); $this->installSchema('system', ['sequences']); $this->installEntitySchema('entity_test_mulrev_changed'); $this->installEntitySchema('search_api_task'); $this->taskManager = $this->container->get('search_api.task_manager'); // Create some languages. $this->installConfig(['language']); for ($i = 0; $i < 3; ++$i) { /** @var \Drupal\language\ConfigurableLanguageInterface $language */ $language = ConfigurableLanguage::create([ 'id' => 'l' . $i, 'label' => 'language - ' . $i, 'weight' => $i, ]); $language->save(); } $this->installConfig('search_api'); // Create a test server. $this->server = Server::create([ 'name' => 'Test Server', 'id' => 'test_server', 'status' => 1, 'backend' => 'search_api_test', ]); $this->server->save(); // Create a test index. $this->index = Index::create([ 'name' => 'Test Index', 'id' => 'test_index', 'status' => 1, 'datasource_settings' => [ 'entity:' . $this->testEntityTypeId => [], ], 'tracker_settings' => [ 'default' => [], ], 'server' => $this->server->id(), 'options' => ['index_directly' => FALSE], ]); $this->index->save(); $this->taskManager->deleteTasks(); } /** * Tests that datasource config changes are reflected correctly. */ public function testItemTranslations() { // Test retrieving language and translations when no translations are // available. /** @var \Drupal\entity_test\Entity\EntityTestMulRevChanged $entity_1 */ $uid = $this->container->get('current_user')->id(); $entity_1 = EntityTestMulRevChanged::create([ 'id' => 1, 'name' => 'test 1', 'user_id' => $uid, 'type' => 'item', 'langcode' => 'l0', ]); $entity_1->save(); $entity_1->addTranslation('l1')->save(); $entity_1->addTranslation('l2')->save(); /** @var \Drupal\entity_test\Entity\EntityTestMulRevChanged $entity_2 */ $entity_2 = EntityTestMulRevChanged::create([ 'id' => 2, 'name' => 'test 2', 'user_id' => $uid, 'type' => 'article', 'langcode' => 'l1', ]); $entity_2->save(); $entity_2->addTranslation('l0')->save(); $entity_2->addTranslation('l2')->save(); $index = $this->index; $tracker = $index->getTrackerInstance(); $datasource_id = 'entity:' . $this->testEntityTypeId; $datasource = $index->getDatasource($datasource_id); $get_ids = function (array $raw_ids) use ($datasource_id) { foreach ($raw_ids as $i => $id) { $raw_ids[$i] = Utility::createCombinedId($datasource_id, $id); } return $raw_ids; }; $this->assertEquals(6, $tracker->getTotalItemsCount()); $this->assertEquals(6, $tracker->getRemainingItemsCount()); $configuration = [ 'bundles' => [ 'default' => TRUE, 'selected' => [ 'item', ], ], 'languages' => [ 'default' => FALSE, 'selected' => [ 'l0', 'l2', ], ], ]; $datasource->setConfiguration($configuration); $index->save(); $this->runBatch(); $expected = $get_ids(['2:l0', '2:l2']); $this->assertEquals(count($expected), $tracker->getTotalItemsCount()); $remaining = $tracker->getRemainingItems(); sort($remaining); $this->assertEquals($expected, $remaining); $configuration['bundles']['default'] = FALSE; $configuration['bundles']['selected'][] = 'article'; $configuration['languages']['selected'] = ['l0']; $datasource->setConfiguration($configuration); $index->save(); $this->runBatch(); $expected = $get_ids(['1:l0', '2:l0']); $this->assertEquals(count($expected), $tracker->getTotalItemsCount()); $remaining = $tracker->getRemainingItems(); sort($remaining); $this->assertEquals($expected, $remaining); $configuration['languages']['selected'][] = 'l1'; $datasource->setConfiguration($configuration); $index->save(); $this->runBatch(); $expected = $get_ids(['1:l0', '1:l1', '2:l0', '2:l1']); $this->assertEquals(count($expected), $tracker->getTotalItemsCount()); $remaining = $tracker->getRemainingItems(); sort($remaining); $this->assertEquals($expected, $remaining); $configuration['bundles']['selected'] = ['article']; $datasource->setConfiguration($configuration); $index->save(); $this->runBatch(); $expected = $get_ids(['2:l0', '2:l1']); $this->assertEquals(count($expected), $tracker->getTotalItemsCount()); $remaining = $tracker->getRemainingItems(); sort($remaining); $this->assertEquals($expected, $remaining); } /** * Runs the currently set batch, if any. */ protected function runBatch() { $batch = &batch_get(); if ($batch) { $batch['progressive'] = FALSE; batch_process(); } } }