function LayoutBuilderTest::testLayoutBuilderUi

Same name in this branch
  1. 10 core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderTest::testLayoutBuilderUi()
Same name and namespace in other branches
  1. 9 core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderTest::testLayoutBuilderUi()
  2. 9 core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php \Drupal\Tests\layout_builder\Functional\LayoutBuilderTest::testLayoutBuilderUi()
  3. 8.9.x core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderTest::testLayoutBuilderUi()
  4. 8.9.x core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php \Drupal\Tests\layout_builder\Functional\LayoutBuilderTest::testLayoutBuilderUi()
  5. 11.x core/modules/layout_builder/tests/src/FunctionalJavascript/LayoutBuilderTest.php \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderTest::testLayoutBuilderUi()
  6. 11.x core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php \Drupal\Tests\layout_builder\Functional\LayoutBuilderTest::testLayoutBuilderUi()

File

core/modules/layout_builder/tests/src/Functional/LayoutBuilderTest.php, line 106

Class

LayoutBuilderTest
Tests the Layout Builder UI.

Namespace

Drupal\Tests\layout_builder\Functional

Code

public function testLayoutBuilderUi() : void {
  $assert_session = $this->assertSession();
  $page = $this->getSession()
    ->getPage();
  $this->drupalLogin($this->drupalCreateUser([
    'configure any layout',
    'administer node display',
    'administer node fields',
  ]));
  $this->drupalGet('node/1');
  $assert_session->elementNotExists('css', '.layout-builder-block');
  $assert_session->pageTextContains('The first node body');
  $assert_session->pageTextNotContains('Powered by Drupal');
  $assert_session->linkNotExists('Layout');
  $field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field';
  // From the manage display page, go to manage the layout.
  $this->drupalGet("{$field_ui_prefix}/display/default");
  $assert_session->linkNotExists('Manage layout');
  $assert_session->fieldDisabled('layout[allow_custom]');
  $this->submitForm([
    'layout[enabled]' => TRUE,
  ], 'Save');
  $assert_session->linkExists('Manage layout');
  $this->clickLink('Manage layout');
  $assert_session->addressEquals("{$field_ui_prefix}/display/default/layout");
  $assert_session->elementTextContains('css', '.layout-builder__message.layout-builder__message--defaults', 'You are editing the layout template for all Bundle with section field content items.');
  // The body field is only present once.
  $assert_session->elementsCount('css', '.field--name-body', 1);
  // The extra field is only present once.
  $assert_session->pageTextContainsOnce('Placeholder for the "Extra label" field');
  // Blocks have layout builder specific block class.
  $assert_session->elementExists('css', '.layout-builder-block');
  // Save the defaults.
  $page->pressButton('Save layout');
  $assert_session->addressEquals("{$field_ui_prefix}/display/default");
  // Load the default layouts again after saving to confirm fields are only
  // added on new layouts.
  $this->drupalGet("{$field_ui_prefix}/display/default");
  $assert_session->linkExists('Manage layout');
  $this->clickLink('Manage layout');
  $assert_session->addressEquals("{$field_ui_prefix}/display/default/layout");
  // The body field is only present once.
  $assert_session->elementsCount('css', '.field--name-body', 1);
  // The extra field is only present once.
  $assert_session->pageTextContainsOnce('Placeholder for the "Extra label" field');
  // Add a new block.
  $assert_session->linkExists('Add block');
  $this->clickLink('Add block');
  $assert_session->linkExists('Powered by Drupal');
  $this->clickLink('Powered by Drupal');
  $page->fillField('settings[label]', 'This is the label');
  $page->checkField('settings[label_display]');
  $page->pressButton('Add block');
  $assert_session->pageTextContains('Powered by Drupal');
  $assert_session->pageTextContains('This is the label');
  $assert_session->addressEquals("{$field_ui_prefix}/display/default/layout");
  // Save the defaults.
  $page->pressButton('Save layout');
  $assert_session->pageTextContains('The layout has been saved.');
  $assert_session->addressEquals("{$field_ui_prefix}/display/default");
  // The node uses the defaults, no overrides available.
  $this->drupalGet('node/1');
  $assert_session->pageTextContains('The first node body');
  $assert_session->pageTextContains('Powered by Drupal');
  $assert_session->pageTextContains('Extra, Extra read all about it.');
  $assert_session->pageTextNotContains('Placeholder for the "Extra label" field');
  $assert_session->linkNotExists('Layout');
  $assert_session->pageTextContains(sprintf('Yes, I can access the %s', Node::load(1)->label()));
  // Enable overrides.
  $this->drupalGet("{$field_ui_prefix}/display/default");
  $this->submitForm([
    'layout[allow_custom]' => TRUE,
  ], 'Save');
  $this->drupalGet('node/1');
  // Remove the section from the defaults.
  $assert_session->linkExists('Layout');
  $this->clickLink('Layout');
  $assert_session->pageTextContains('Placeholder for the "Extra label" field');
  $assert_session->linkExists('Remove Section 1');
  $this->clickLink('Remove Section 1');
  $page->pressButton('Remove');
  // Add a new section.
  $this->clickLink('Add section');
  $this->assertCorrectLayouts();
  $assert_session->linkExists('Two column');
  $this->clickLink('Two column');
  $assert_session->buttonExists('Add section');
  $page->pressButton('Add section');
  $page->pressButton('Save');
  $assert_session->pageTextNotContains('The first node body');
  $assert_session->pageTextNotContains('Powered by Drupal');
  $assert_session->pageTextNotContains('Extra, Extra read all about it.');
  $assert_session->pageTextNotContains('Placeholder for the "Extra label" field');
  $assert_session->pageTextContains(sprintf('Yes, I can access the entity %s in two column', Node::load(1)->label()));
  // Assert that overrides cannot be turned off while overrides exist.
  $this->drupalGet("{$field_ui_prefix}/display/default");
  $assert_session->checkboxChecked('layout[allow_custom]');
  $assert_session->fieldDisabled('layout[allow_custom]');
  // Alter the defaults.
  $this->drupalGet("{$field_ui_prefix}/display/default/layout");
  $assert_session->linkExists('Add block');
  $this->clickLink('Add block');
  $assert_session->linkExists('Title');
  $this->clickLink('Title');
  $page->pressButton('Add block');
  // The title field is present.
  $assert_session->elementExists('css', '.field--name-title');
  $page->pressButton('Save layout');
  // View the other node, which is still using the defaults.
  $this->drupalGet('node/2');
  $assert_session->pageTextContains('The second node title');
  $assert_session->pageTextContains('The second node body');
  $assert_session->pageTextContains('Powered by Drupal');
  $assert_session->pageTextContains('Extra, Extra read all about it.');
  $assert_session->pageTextNotContains('Placeholder for the "Extra label" field');
  $assert_session->pageTextContains(sprintf('Yes, I can access the %s', Node::load(2)->label()));
  // The overridden node does not pick up the changes to defaults.
  $this->drupalGet('node/1');
  $assert_session->elementNotExists('css', '.field--name-title');
  $assert_session->pageTextNotContains('The first node body');
  $assert_session->pageTextNotContains('Powered by Drupal');
  $assert_session->pageTextNotContains('Extra, Extra read all about it.');
  $assert_session->pageTextNotContains('Placeholder for the "Extra label" field');
  $assert_session->linkExists('Layout');
  // Reverting the override returns it to the defaults.
  $this->clickLink('Layout');
  $assert_session->linkExists('Add block');
  $this->clickLink('Add block');
  $assert_session->linkExists('ID');
  $this->clickLink('ID');
  $page->pressButton('Add block');
  // The title field is present.
  $assert_session->elementExists('css', '.field--name-nid');
  $assert_session->pageTextContains('ID');
  $assert_session->pageTextContains('1');
  $page->pressButton('Revert to defaults');
  $page->pressButton('Revert');
  $assert_session->addressEquals('node/1');
  $assert_session->pageTextContains('The layout has been reverted back to defaults.');
  $assert_session->elementExists('css', '.field--name-title');
  $assert_session->elementNotExists('css', '.field--name-nid');
  $assert_session->pageTextContains('The first node body');
  $assert_session->pageTextContains('Powered by Drupal');
  $assert_session->pageTextContains('Extra, Extra read all about it.');
  $assert_session->pageTextNotContains(sprintf('Yes, I can access the entity %s in two column', Node::load(1)->label()));
  $assert_session->pageTextContains(sprintf('Yes, I can access the %s', Node::load(1)->label()));
  // Assert that overrides can be turned off now that all overrides are gone.
  $this->drupalGet("{$field_ui_prefix}/display/default");
  $this->submitForm([
    'layout[allow_custom]' => FALSE,
  ], 'Save');
  $this->drupalGet('node/1');
  $assert_session->linkNotExists('Layout');
  // Add a new field.
  $this->fieldUIAddNewField($field_ui_prefix, 'my_text', 'My text field', 'string');
  $this->drupalGet("{$field_ui_prefix}/display/default/layout");
  $assert_session->pageTextContains('My text field');
  $assert_session->elementExists('css', '.field--name-field-my-text');
  // Delete the field.
  $this->drupalGet("{$field_ui_prefix}/fields/node.bundle_with_section_field.field_my_text/delete");
  $this->submitForm([], 'Delete');
  $this->drupalGet("{$field_ui_prefix}/display/default/layout");
  $assert_session->pageTextNotContains('My text field');
  $assert_session->elementNotExists('css', '.field--name-field-my-text');
  $this->clickLink('Add section');
  $this->clickLink('One column');
  $page->fillField('layout_settings[label]', 'My Cool Section');
  $page->pressButton('Add section');
  $expected_labels = [
    'My Cool Section',
    'Content region in My Cool Section',
    'Section 2',
    'Content region in Section 2',
  ];
  $labels = [];
  foreach ($page->findAll('css', '[role="group"]') as $element) {
    $labels[] = $element->getAttribute('aria-label');
  }
  $this->assertSame($expected_labels, $labels);
}

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