Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\media\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Render\FormattableMarkup;
|
Chris@0
|
6 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Tests multilanguage fields logic.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @group media
|
Chris@0
|
12 */
|
Chris@0
|
13 class MediaTranslationTest extends MediaKernelTestBase {
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * Modules to install.
|
Chris@0
|
17 *
|
Chris@0
|
18 * @var array
|
Chris@0
|
19 */
|
Chris@0
|
20 public static $modules = ['language'];
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The test media translation type.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var \Drupal\media\MediaTypeInterface
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $testTranslationMediaType;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * {@inheritdoc}
|
Chris@0
|
31 */
|
Chris@0
|
32 protected function setUp() {
|
Chris@0
|
33 parent::setUp();
|
Chris@0
|
34
|
Chris@0
|
35 $this->installConfig(['language']);
|
Chris@0
|
36
|
Chris@0
|
37 // Create a test media type for translations.
|
Chris@0
|
38 $this->testTranslationMediaType = $this->createMediaType('test_translation');
|
Chris@0
|
39
|
Chris@0
|
40 for ($i = 0; $i < 3; ++$i) {
|
Chris@0
|
41 $language_id = 'l' . $i;
|
Chris@0
|
42 ConfigurableLanguage::create([
|
Chris@0
|
43 'id' => $language_id,
|
Chris@0
|
44 'label' => $this->randomString(),
|
Chris@0
|
45 ])->save();
|
Chris@0
|
46 file_put_contents('public://' . $language_id . '.png', '');
|
Chris@0
|
47 }
|
Chris@0
|
48 }
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * Test translatable fields storage/retrieval.
|
Chris@0
|
52 */
|
Chris@0
|
53 public function testTranslatableFieldSaveLoad() {
|
Chris@0
|
54 /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
|
Chris@0
|
55 $entity_type = $this->container->get('entity_type.manager')->getDefinition('media');
|
Chris@0
|
56 $this->assertTrue($entity_type->isTranslatable(), 'Media is translatable.');
|
Chris@0
|
57
|
Chris@0
|
58 // Prepare the field translations.
|
Chris@0
|
59 $source_field_definition = $this->testTranslationMediaType->getSource()->getSourceFieldDefinition($this->testTranslationMediaType);
|
Chris@0
|
60 $source_field_storage = $source_field_definition->getFieldStorageDefinition();
|
Chris@0
|
61 /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */
|
Chris@0
|
62 $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
|
Chris@0
|
63 /** @var \Drupal\media\Entity\Media $media */
|
Chris@0
|
64 $media = $media_storage->create([
|
Chris@0
|
65 'bundle' => $this->testTranslationMediaType->id(),
|
Chris@0
|
66 'name' => 'Unnamed',
|
Chris@0
|
67 ]);
|
Chris@0
|
68
|
Chris@0
|
69 $field_translations = [];
|
Chris@0
|
70 $available_langcodes = array_keys($this->container->get('language_manager')->getLanguages());
|
Chris@0
|
71 $media->set('langcode', reset($available_langcodes));
|
Chris@0
|
72 foreach ($available_langcodes as $langcode) {
|
Chris@0
|
73 $values = [];
|
Chris@0
|
74 for ($i = 0; $i < $source_field_storage->getCardinality(); $i++) {
|
Chris@0
|
75 $values[$i]['value'] = $this->randomString();
|
Chris@0
|
76 }
|
Chris@0
|
77 $field_translations[$langcode] = $values;
|
Chris@0
|
78 $translation = $media->hasTranslation($langcode) ? $media->getTranslation($langcode) : $media->addTranslation($langcode);
|
Chris@0
|
79 $translation->{$source_field_definition->getName()}->setValue($field_translations[$langcode]);
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 // Save and reload the field translations.
|
Chris@0
|
83 $media->save();
|
Chris@0
|
84 $media_storage->resetCache();
|
Chris@0
|
85 $media = $media_storage->load($media->id());
|
Chris@0
|
86
|
Chris@0
|
87 // Check if the correct source field values were saved/loaded.
|
Chris@0
|
88 foreach ($field_translations as $langcode => $items) {
|
Chris@0
|
89 /** @var \Drupal\media\MediaInterface $media_translation */
|
Chris@0
|
90 $media_translation = $media->getTranslation($langcode);
|
Chris@0
|
91 $result = TRUE;
|
Chris@0
|
92 foreach ($items as $delta => $item) {
|
Chris@0
|
93 $result = $result && $item['value'] == $media_translation->{$source_field_definition->getName()}[$delta]->value;
|
Chris@0
|
94 }
|
Chris@0
|
95 $this->assertTrue($result, new FormattableMarkup('%language translation field value not correct.', ['%language' => $langcode]));
|
Chris@17
|
96 $this->assertSame('public://' . $langcode . '.png', $media_translation->getSource()->getMetadata($media_translation, 'thumbnail_uri'), new FormattableMarkup('%language translation thumbnail metadata attribute is not correct.', ['%language' => $langcode]));
|
Chris@17
|
97 $this->assertSame('public://' . $langcode . '.png', $media_translation->get('thumbnail')->entity->getFileUri(), new FormattableMarkup('%language translation thumbnail value is not correct.', ['%language' => $langcode]));
|
Chris@0
|
98 $this->assertEquals('Test Thumbnail ' . $langcode, $media_translation->getSource()->getMetadata($media_translation, 'test_thumbnail_alt'), new FormattableMarkup('%language translation thumbnail alt metadata attribute is not correct.', ['%language' => $langcode]));
|
Chris@17
|
99 $this->assertSame('Test Thumbnail ' . $langcode, $media_translation->get('thumbnail')->alt, new FormattableMarkup('%language translation thumbnail alt value is not correct.', ['%language' => $langcode]));
|
Chris@0
|
100 }
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 }
|