TranslationsTest.php

Same filename and directory in other branches
  1. 8.9.x core/modules/media_library/tests/src/FunctionalJavascript/TranslationsTest.php
  2. 10 core/modules/media_library/tests/src/FunctionalJavascript/TranslationsTest.php
  3. 11.x core/modules/media_library/tests/src/FunctionalJavascript/TranslationsTest.php

Namespace

Drupal\Tests\media_library\FunctionalJavascript

File

core/modules/media_library/tests/src/FunctionalJavascript/TranslationsTest.php

View source
<?php

namespace Drupal\Tests\media_library\FunctionalJavascript;

use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\file\Entity\File;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\media\Entity\Media;
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
use Drupal\Tests\TestFileCreationTrait;

/**
 * Tests media library for translatable media.
 *
 * @group media_library
 */
class TranslationsTest extends WebDriverTestBase {
    use EntityReferenceTestTrait;
    use MediaTypeCreationTrait;
    use TestFileCreationTrait;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'content_translation',
        'field',
        'media',
        'media_library',
        'node',
        'views',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stark';
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        // Create some languages.
        foreach ([
            'nl',
            'es',
        ] as $langcode) {
            ConfigurableLanguage::createFromLangcode($langcode)->save();
        }
        // Create an image media type and article node type.
        $this->createMediaType('image', [
            'id' => 'image',
        ]);
        $this->drupalCreateContentType([
            'type' => 'article',
            'name' => 'Article',
        ]);
        // Make the media translatable and ensure the change is picked up.
        \Drupal::service('content_translation.manager')->setEnabled('media', 'image', TRUE);
        // Create a media reference field on articles.
        $this->createEntityReferenceField('node', 'article', 'field_media', 'Media', 'media', 'default', [
            'target_bundles' => [
                'image',
            ],
        ], FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
        // Add the media field to the form display.
        \Drupal::service('entity_display.repository')->getFormDisplay('node', 'article')
            ->setComponent('field_media', [
            'type' => 'media_library_widget',
        ])
            ->save();
        // Create a file to user for our images.
        $image = File::create([
            'uri' => $this->getTestFiles('image')[0]->uri,
        ]);
        $image->setPermanent();
        $image->save();
        // Create a translated and untranslated media item in each language.
        // cSpell:disable
        $media_items = [
            [
                'nl' => 'Eekhoorn',
                'es' => 'Ardilla',
            ],
            [
                'es' => 'Zorro',
                'nl' => 'Vos',
            ],
            [
                'nl' => 'Hert',
            ],
            [
                'es' => 'Tejón',
            ],
        ];
        // cSpell:enable
        foreach ($media_items as $translations) {
            $default_langcode = key($translations);
            $default_name = array_shift($translations);
            $media = Media::create([
                'name' => $default_name,
                'bundle' => 'image',
                'field_media_image' => $image,
                'langcode' => $default_langcode,
            ]);
            foreach ($translations as $langcode => $name) {
                $media->addTranslation($langcode, [
                    'name' => $name,
                ]);
            }
            $media->save();
        }
        $user = $this->drupalCreateUser([
            'access administration pages',
            'access content',
            'access media overview',
            'edit own article content',
            'create article content',
            'administer media',
        ]);
        $this->drupalLogin($user);
    }
    
    /**
     * Tests the media library widget shows all media only once.
     */
    public function testMediaLibraryTranslations() {
        $assert_session = $this->assertSession();
        $page = $this->getSession()
            ->getPage();
        // All translations should be shown in the administration overview,
        // regardless of the interface language.
        $this->drupalGet('nl/admin/content/media-grid');
        $assert_session->elementsCount('css', '.js-media-library-item', 6);
        $media_items = $page->findAll('css', '.js-media-library-item-preview + div');
        $media_names = [];
        foreach ($media_items as $media_item) {
            $media_names[] = $media_item->getText();
        }
        sort($media_names);
        // cSpell:disable-next-line
        $this->assertSame([
            'Ardilla',
            'Eekhoorn',
            'Hert',
            'Tejón',
            'Vos',
            'Zorro',
        ], $media_names);
        $this->drupalGet('es/admin/content/media-grid');
        $assert_session->elementsCount('css', '.js-media-library-item', 6);
        $media_items = $page->findAll('css', '.js-media-library-item-preview + div');
        $media_names = [];
        foreach ($media_items as $media_item) {
            $media_names[] = $media_item->getText();
        }
        sort($media_names);
        // cSpell:disable-next-line
        $this->assertSame([
            'Ardilla',
            'Eekhoorn',
            'Hert',
            'Tejón',
            'Vos',
            'Zorro',
        ], $media_names);
        // All media should only be shown once, and should be shown in the interface
        // language.
        $this->drupalGet('nl/node/add/article');
        $assert_session->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
            ->click();
        $assert_session->waitForText('Add or select media');
        $assert_session->elementsCount('css', '.js-media-library-item', 4);
        $media_items = $page->findAll('css', '.js-media-library-item-preview + div');
        $media_names = [];
        foreach ($media_items as $media_item) {
            $media_names[] = $media_item->getText();
        }
        sort($media_names);
        // cSpell:disable-next-line
        $this->assertSame([
            'Eekhoorn',
            'Hert',
            'Tejón',
            'Vos',
        ], $media_names);
        $this->drupalGet('es/node/add/article');
        $assert_session->elementExists('css', '.js-media-library-open-button[name^="field_media"]')
            ->click();
        $assert_session->waitForText('Add or select media');
        $assert_session->elementsCount('css', '.js-media-library-item', 4);
        $media_items = $page->findAll('css', '.js-media-library-item-preview + div');
        $media_names = [];
        foreach ($media_items as $media_item) {
            $media_names[] = $media_item->getText();
        }
        sort($media_names);
        // cSpell:disable-next-line
        $this->assertSame([
            'Ardilla',
            'Hert',
            'Tejón',
            'Zorro',
        ], $media_names);
    }

}

Classes

Title Deprecated Summary
TranslationsTest Tests media library for translatable media.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.