class LayoutBuilderTranslationTest

Same name and namespace in other branches
  1. 11.x core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php \Drupal\Tests\layout_builder\Functional\LayoutBuilderTranslationTest

Tests that the Layout Builder works with translated content.

@group layout_builder

Hierarchy

Expanded class hierarchy of LayoutBuilderTranslationTest

File

core/modules/layout_builder/tests/src/Functional/LayoutBuilderTranslationTest.php, line 14

Namespace

Drupal\Tests\layout_builder\Functional
View source
class LayoutBuilderTranslationTest extends ContentTranslationTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'content_translation',
    'contextual',
    'entity_test',
    'layout_builder',
    'block',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * The entity used for testing.
   *
   * @var \Drupal\Core\Entity\EntityInterface
   */
  protected $entity;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    $this->setUpViewDisplay();
    $this->setUpEntities();
  }
  
  /**
   * Tests that layout overrides work when created after a translation.
   */
  public function testTranslationBeforeLayoutOverride() {
    $assert_session = $this->assertSession();
    $this->addEntityTranslation();
    $entity_url = $this->entity
      ->toUrl()
      ->toString();
    $language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
    $translated_entity_url = $this->entity
      ->toUrl('canonical', [
      'language' => $language,
    ])
      ->toString();
    $translated_layout_url = $translated_entity_url . '/layout';
    $this->drupalGet($entity_url);
    $assert_session->pageTextNotContains('The translated field value');
    $assert_session->pageTextContains('The untranslated field value');
    $assert_session->linkExists('Layout');
    $this->drupalGet($translated_entity_url);
    $assert_session->pageTextNotContains('The untranslated field value');
    $assert_session->pageTextContains('The translated field value');
    $assert_session->linkNotExists('Layout');
    $this->drupalGet($translated_layout_url);
    $assert_session->pageTextContains('Access denied');
    $this->addLayoutOverride();
    $this->drupalGet($entity_url);
    $assert_session->pageTextNotContains('The translated field value');
    $assert_session->pageTextContains('The untranslated field value');
    $assert_session->pageTextContains('Powered by Drupal');
    // Ensure that the layout change propagates to the translated entity.
    $this->drupalGet($translated_entity_url);
    $assert_session->pageTextNotContains('The untranslated field value');
    $assert_session->pageTextContains('The translated field value');
    $assert_session->pageTextContains('Powered by Drupal');
  }
  
  /**
   * Tests that layout overrides work when created before a translation.
   */
  public function testLayoutOverrideBeforeTranslation() {
    $assert_session = $this->assertSession();
    $entity_url = $this->entity
      ->toUrl()
      ->toString();
    $language = \Drupal::languageManager()->getLanguage($this->langcodes[2]);
    $this->addLayoutOverride();
    $this->drupalGet($entity_url);
    $assert_session->pageTextNotContains('The translated field value');
    $assert_session->pageTextContains('The untranslated field value');
    $assert_session->pageTextContains('Powered by Drupal');
    $assert_session->linkExists('Layout');
    $this->addEntityTranslation();
    $translated_entity_url = $this->entity
      ->toUrl('canonical', [
      'language' => $language,
    ])
      ->toString();
    $translated_layout_url = $translated_entity_url . '/layout';
    $this->drupalGet($entity_url);
    $assert_session->pageTextNotContains('The translated field value');
    $assert_session->pageTextContains('The untranslated field value');
    $assert_session->pageTextContains('Powered by Drupal');
    $assert_session->linkExists('Layout');
    $this->drupalGet($translated_entity_url);
    $assert_session->pageTextNotContains('The untranslated field value');
    $assert_session->pageTextContains('The translated field value');
    $assert_session->pageTextContains('Powered by Drupal');
    $assert_session->linkNotExists('Layout');
    $this->drupalGet($translated_layout_url);
    $assert_session->pageTextContains('Access denied');
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getTranslatorPermissions() {
    $permissions = parent::getTranslatorPermissions();
    $permissions[] = 'view test entity translations';
    $permissions[] = 'view test entity';
    $permissions[] = 'configure any layout';
    return $permissions;
  }
  
  /**
   * Setup translated entity with layouts.
   */
  protected function setUpEntities() {
    $this->drupalLogin($this->administrator);
    // @todo The Layout Builder UI relies on local tasks; fix in
    //   https://www.drupal.org/project/drupal/issues/2917777.
    $this->drupalPlaceBlock('local_tasks_block');
    // Create a test entity.
    $id = $this->createEntity([
      $this->fieldName => [
        [
          'value' => 'The untranslated field value',
        ],
      ],
      'name' => 'Test entity',
    ], $this->langcodes[0]);
    $storage = $this->container
      ->get('entity_type.manager')
      ->getStorage($this->entityTypeId);
    $storage->resetCache([
      $id,
    ]);
    $this->entity = $storage->load($id);
  }
  
  /**
   * Set up the View Display.
   */
  protected function setUpViewDisplay() {
    EntityViewDisplay::create([
      'targetEntityType' => $this->entityTypeId,
      'bundle' => $this->bundle,
      'mode' => 'default',
      'status' => TRUE,
    ])
      ->setComponent($this->fieldName, [
      'type' => 'string',
    ])
      ->enableLayoutBuilder()
      ->setOverridable()
      ->save();
  }
  
  /**
   * Adds an entity translation.
   */
  protected function addEntityTranslation() {
    $user = $this->loggedInUser;
    $this->drupalLogin($this->translator);
    $add_translation_url = Url::fromRoute("entity.{$this->entityTypeId}.content_translation_add", [
      $this->entityTypeId => $this->entity
        ->id(),
      'source' => $this->langcodes[0],
      'target' => $this->langcodes[2],
    ]);
    $this->drupalGet($add_translation_url);
    $this->submitForm([
      "{$this->fieldName}[0][value]" => 'The translated field value',
    ], 'Save');
    $this->drupalLogin($user);
  }
  
  /**
   * Adds a layout override.
   */
  protected function addLayoutOverride() {
    $assert_session = $this->assertSession();
    $page = $this->getSession()
      ->getPage();
    $entity_url = $this->entity
      ->toUrl()
      ->toString();
    $layout_url = $entity_url . '/layout';
    $this->drupalGet($layout_url);
    $assert_session->pageTextNotContains('The translated field value');
    $assert_session->pageTextContains('The untranslated field value');
    // Adjust the layout.
    $assert_session->linkExists('Add block');
    $this->clickLink('Add block');
    $assert_session->linkExists('Powered by Drupal');
    $this->clickLink('Powered by Drupal');
    $page->pressButton('Add block');
    $assert_session->pageTextContains('Powered by Drupal');
    $assert_session->buttonExists('Save layout');
    $page->pressButton('Save layout');
  }

}

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