View source
<?php
namespace Drupal\Tests\search_api\Kernel\Processor;
use Drupal\node\Entity\NodeType;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\node\Entity\Node;
use Drupal\search_api\Item\Field;
use Drupal\search_api\Utility\Utility;
use Drupal\Tests\search_api\Kernel\PostRequestIndexingTrait;
class LanguageWithFallbackTest extends ProcessorTestBase {
use PostRequestIndexingTrait;
public static $modules = [
'language',
'search_api_test_language_fallback',
'language_fallback_fix',
];
protected $node;
public function setUp($processor = NULL) {
parent::setUp('language_with_fallback');
foreach ([
'de',
'fr',
'es',
] as $langcode) {
ConfigurableLanguage::createFromLangcode($langcode)
->enable()
->save();
}
NodeType::create([
'type' => 'article',
])
->save();
$lwf_field = new Field($this->index, 'language_with_fallback');
$lwf_field
->setType('string');
$lwf_field
->setPropertyPath('language_with_fallback');
$lwf_field
->setLabel('Language (with fallback)');
$this->index
->addField($lwf_field);
$this->index
->setOption('index_directly', TRUE);
$this->index
->save();
}
public function testIndexing() {
$nodeValues = [
'title' => 'Test',
'type' => 'article',
];
$node = Node::create($nodeValues + [
'langcode' => 'de',
]);
$node
->save();
$this->node = $node;
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('de')] = [
'de',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added default translation is indexed correctly.');
$node
->addTranslation('es', $nodeValues);
$node
->save();
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added translation with fallback is indexed correctly.');
$node
->addTranslation('fr', $nodeValues);
$node
->save();
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
];
$expected[$this
->getItemIdForLanguage('fr')] = [
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added translation is indexed correctly and former fallback removed.');
$node
->removeTranslation('fr');
$node
->save();
$this
->triggerPostRequestIndexing();
unset($expected[$this
->getItemIdForLanguage('fr')]);
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed translation is unindexed correctly and fallback re-added.');
$node
->removeTranslation('es');
$node
->save();
$this
->triggerPostRequestIndexing();
unset($expected[$this
->getItemIdForLanguage('es')]);
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed translation is unindexed correctly.');
$node
->delete();
$this
->triggerPostRequestIndexing();
$expected = [];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed default translation is unindexed correctly.');
$node = Node::create($nodeValues + [
'langcode' => 'es',
]);
$node
->save();
$this->node = $node;
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added default translation with fallback is indexed correctly.');
$node
->addTranslation('de', $nodeValues);
$node
->save();
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('de')] = [
'de',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added translation is indexed correctly.');
$node
->addTranslation('fr', $nodeValues);
$node
->save();
$this
->triggerPostRequestIndexing();
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
];
$expected[$this
->getItemIdForLanguage('fr')] = [
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Added translation is indexed correctly and former fallback removed.');
$node
->removeTranslation('de');
$node
->save();
$this
->triggerPostRequestIndexing();
unset($expected[$this
->getItemIdForLanguage('de')]);
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed translation is unindexed correctly.');
$node
->removeTranslation('fr');
$node
->save();
$this
->triggerPostRequestIndexing();
unset($expected[$this
->getItemIdForLanguage('fr')]);
$expected[$this
->getItemIdForLanguage('es')] = [
'es',
'fr',
];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed translation is unindexed correctly and fallback re-added.');
$node
->delete();
$this
->triggerPostRequestIndexing();
$expected = [];
$this
->assertEquals($expected, $this
->getLanguageWithFallbackValues(), 'Removed default translation is unindexed correctly.');
}
protected function getLanguageWithFallbackValues() {
$query = $this->index
->query();
$results = $query
->execute();
$values = [];
foreach ($results as $result) {
$fieldValues = $result
->getField('language_with_fallback')
->getValues();
sort($fieldValues);
$values[$result
->getId()] = $fieldValues;
}
return $values;
}
protected function getItemIdForLanguage($langcode) {
$nid = $this->node
->id();
return Utility::createCombinedId('entity:node', "{$nid}:{$langcode}");
}
}