Mercurial > hg > cmmr2012-drupal-site
diff core/modules/locale/tests/src/Kernel/LocaleStringTest.php @ 5:12f9dff5fda9 tip
Update to Drupal core 8.7.1
author | Chris Cannam |
---|---|
date | Thu, 09 May 2019 15:34:47 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/locale/tests/src/Kernel/LocaleStringTest.php Thu May 09 15:34:47 2019 +0100 @@ -0,0 +1,237 @@ +<?php + +namespace Drupal\Tests\locale\Kernel; + +use Drupal\KernelTests\KernelTestBase; +use Drupal\language\Entity\ConfigurableLanguage; +use Drupal\locale\StringInterface; + +/** + * Tests the locale string storage, string objects and data API. + * + * @group locale + */ +class LocaleStringTest extends KernelTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'language', + 'locale', + ]; + + /** + * The locale storage. + * + * @var \Drupal\locale\StringStorageInterface + */ + protected $storage; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + // Add a default locale storage for all these tests. + $this->storage = $this->container->get('locale.storage'); + // Create two languages: Spanish and German. + foreach (['es', 'de'] as $langcode) { + ConfigurableLanguage::createFromLangcode($langcode)->save(); + } + $this->installSchema('locale', [ + 'locales_location', + 'locales_source', + 'locales_target', + ]); + } + + /** + * Test CRUD API. + */ + public function testStringCrudApi() { + // Create source string. + $source = $this->buildSourceString()->save(); + $this->assertTrue($source->lid); + + // Load strings by lid and source. + $string1 = $this->storage->findString(['lid' => $source->lid]); + $this->assertEquals($source, $string1); + $string2 = $this->storage->findString(['source' => $source->source, 'context' => $source->context]); + $this->assertEquals($source, $string2); + $string3 = $this->storage->findString(['source' => $source->source, 'context' => '']); + $this->assertFalse($string3); + + // Check version handling and updating. + $this->assertEquals('none', $source->version); + $string = $this->storage->findTranslation(['lid' => $source->lid]); + $this->assertEquals(\Drupal::VERSION, $string->version); + + // Create translation and find it by lid and source. + $langcode = 'es'; + $translation = $this->createTranslation($source, $langcode); + $this->assertEquals(LOCALE_NOT_CUSTOMIZED, $translation->customized); + $string1 = $this->storage->findTranslation(['language' => $langcode, 'lid' => $source->lid]); + $this->assertEquals($translation->translation, $string1->translation); + $string2 = $this->storage->findTranslation(['language' => $langcode, 'source' => $source->source, 'context' => $source->context]); + $this->assertEquals($translation->translation, $string2->translation); + $translation + ->setCustomized() + ->save(); + $translation = $this->storage->findTranslation(['language' => $langcode, 'lid' => $source->lid]); + $this->assertEquals(LOCALE_CUSTOMIZED, $translation->customized); + + // Delete translation. + $translation->delete(); + $deleted = $this->storage->findTranslation(['language' => $langcode, 'lid' => $source->lid]); + $this->assertNull($deleted->translation); + + // Create some translations and then delete string and all of its + // translations. + $lid = $source->lid; + $this->createAllTranslations($source); + $search = $this->storage->getTranslations(['lid' => $source->lid]); + $this->assertCount(3, $search); + + $source->delete(); + $string = $this->storage->findString(['lid' => $lid]); + $this->assertFalse($string); + $deleted = $search = $this->storage->getTranslations(['lid' => $lid]); + $this->assertFalse($deleted); + + // Tests that locations of different types and arbitrary lengths can be + // added to a source string. Too long locations will be cut off. + $source_string = $this->buildSourceString(); + $source_string->addLocation('javascript', $this->randomString(8)); + $source_string->addLocation('configuration', $this->randomString(50)); + $source_string->addLocation('code', $this->randomString(100)); + $source_string->addLocation('path', $location = $this->randomString(300)); + $source_string->save(); + + $rows = $this->container->get('database')->select('locales_location') + ->fields('locales_location') + ->condition('sid', $source_string->lid) + ->execute() + ->fetchAllAssoc('type'); + $this->assertCount(4, $rows); + $this->assertEquals(substr($location, 0, 255), $rows['path']->name); + } + + /** + * Test Search API loading multiple objects. + */ + public function testStringSearchApi() { + $language_count = 3; + // Strings 1 and 2 will have some common prefix. + // Source 1 will have all translations, not customized. + // Source 2 will have all translations, customized. + // Source 3 will have no translations. + $prefix = $this->randomMachineName(100); + $source1 = $this->buildSourceString(['source' => $prefix . $this->randomMachineName(100)])->save(); + $source2 = $this->buildSourceString(['source' => $prefix . $this->randomMachineName(100)])->save(); + $source3 = $this->buildSourceString()->save(); + + // Load all source strings. + $strings = $this->storage->getStrings([]); + $this->assertCount(3, $strings); + // Load all source strings matching a given string. + $filter_options['filters'] = ['source' => $prefix]; + $strings = $this->storage->getStrings([], $filter_options); + $this->assertCount(2, $strings); + + // Not customized translations. + $translate1 = $this->createAllTranslations($source1); + // Customized translations. + $this->createAllTranslations($source2, ['customized' => LOCALE_CUSTOMIZED]); + // Try quick search function with different field combinations. + $langcode = 'es'; + $found = $this->storage->findTranslation(['language' => $langcode, 'source' => $source1->source, 'context' => $source1->context]); + $this->assertTrue($found && isset($found->language) && isset($found->translation) && !$found->isNew(), 'Translation not found searching by source and context.'); + $this->assertEquals($translate1[$langcode]->translation, $found->translation); + // Now try a translation not found. + $found = $this->storage->findTranslation(['language' => $langcode, 'source' => $source3->source, 'context' => $source3->context]); + $this->assertTrue($found && $found->lid == $source3->lid && !isset($found->translation) && $found->isNew()); + + // Load all translations. For next queries we'll be loading only translated + // strings. + $translations = $this->storage->getTranslations(['translated' => TRUE]); + $this->assertCount(2 * $language_count, $translations); + + // Load all customized translations. + $translations = $this->storage->getTranslations(['customized' => LOCALE_CUSTOMIZED, 'translated' => TRUE]); + $this->assertCount($language_count, $translations); + + // Load all Spanish customized translations. + $translations = $this->storage->getTranslations(['language' => 'es', 'customized' => LOCALE_CUSTOMIZED, 'translated' => TRUE]); + $this->assertCount(1, $translations); + + // Load all source strings without translation (1). + $translations = $this->storage->getStrings(['translated' => FALSE]); + $this->assertCount(1, $translations); + + // Load Spanish translations using string filter. + $filter_options['filters'] = ['source' => $prefix]; + $translations = $this->storage->getTranslations(['language' => 'es'], $filter_options); + $this->assertCount(2, $translations); + } + + /** + * Creates random source string object. + * + * @param array $values + * The values array. + * + * @return \Drupal\locale\StringInterface + * A locale string. + */ + protected function buildSourceString(array $values = []) { + return $this->storage->createString($values += [ + 'source' => $this->randomMachineName(100), + 'context' => $this->randomMachineName(20), + ]); + } + + /** + * Creates translations for source string and all languages. + * + * @param \Drupal\locale\StringInterface $source + * The source string. + * @param array $values + * The values array. + * + * @return array + * Translation list. + */ + protected function createAllTranslations(StringInterface $source, array $values = []) { + $list = []; + /* @var $language_manager \Drupal\Core\Language\LanguageManagerInterface */ + $language_manager = $this->container->get('language_manager'); + foreach ($language_manager->getLanguages() as $language) { + $list[$language->getId()] = $this->createTranslation($source, $language->getId(), $values); + } + return $list; + } + + /** + * Creates single translation for source string. + * + * @param \Drupal\locale\StringInterface $source + * The source string. + * @param string $langcode + * The language code. + * @param array $values + * The values array. + * + * @return \Drupal\locale\StringInterface + * The translated string object. + */ + protected function createTranslation(StringInterface $source, $langcode, array $values = []) { + return $this->storage->createTranslation($values + [ + 'lid' => $source->lid, + 'language' => $langcode, + 'translation' => $this->randomMachineName(100), + ])->save(); + } + +}