LayoutBuilderFormModeTest.php

Same filename and directory in other branches
  1. 10 core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php
  2. 11.x core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php

Namespace

Drupal\Tests\layout_builder\Functional

File

core/modules/layout_builder/tests/src/Functional/LayoutBuilderFormModeTest.php

View source
<?php

namespace Drupal\Tests\layout_builder\Functional;

use Drupal\Core\Entity\Entity\EntityFormDisplay;
use Drupal\Core\Entity\Entity\EntityFormMode;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
use Drupal\Tests\BrowserTestBase;

/**
 * Tests Layout Builder forms.
 *
 * @group layout_builder
 */
class LayoutBuilderFormModeTest extends BrowserTestBase {
  
  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'field',
    'entity_test',
    'layout_builder',
  ];
  
  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    // Set up a field with a validation constraint.
    $field_storage = FieldStorageConfig::create([
      'field_name' => 'foo',
      'entity_type' => 'entity_test',
      'type' => 'string',
    ]);
    $field_storage->save();
    FieldConfig::create([
      'field_storage' => $field_storage,
      'bundle' => 'entity_test',
      // Expecting required value.
'required' => TRUE,
    ])->save();
    // Enable layout builder custom layouts.
    LayoutBuilderEntityViewDisplay::create([
      'targetEntityType' => 'entity_test',
      'bundle' => 'entity_test',
      'mode' => 'default',
      'status' => TRUE,
    ])->enable()
      ->enableLayoutBuilder()
      ->setOverridable()
      ->save();
    // Add the form mode and show the field with a constraint.
    EntityFormMode::create([
      'id' => 'entity_test.layout_builder',
      'targetEntityType' => 'entity_test',
    ])->save();
    EntityFormDisplay::create([
      'targetEntityType' => 'entity_test',
      'bundle' => 'entity_test',
      'mode' => 'layout_builder',
      'status' => TRUE,
    ])->setComponent('foo', [
      'type' => 'string_textfield',
    ])
      ->save();
    $this->drupalLogin($this->drupalCreateUser([
      'view test entity',
      'configure any layout',
      'configure all entity_test entity_test layout overrides',
    ]));
    EntityTest::create()->setName($this->randomMachineName())
      ->save();
  }
  
  /**
   * Tests that the 'Discard changes' button skips validation and ignores input.
   */
  public function testDiscardValidation() {
    $page = $this->getSession()
      ->getPage();
    $assert_session = $this->assertSession();
    // When submitting the form normally, a validation error should be shown.
    $this->drupalGet('entity_test/1/layout');
    $assert_session->fieldExists('foo[0][value]');
    $assert_session->elementAttributeContains('named', [
      'field',
      'foo[0][value]',
    ], 'required', 'required');
    $page->pressButton('Save layout');
    $assert_session->pageTextContains('foo field is required.');
    // When Discarding changes, a validation error will not be shown.
    // Reload the form for fresh state.
    $this->drupalGet('entity_test/1/layout');
    $page->pressButton('Discard changes');
    $assert_session->pageTextNotContains('foo field is required.');
    $assert_session->addressEquals('entity_test/1/layout/discard-changes');
    // Submit the form to ensure no invalid form state retained.
    $page->pressButton('Confirm');
    $assert_session->pageTextContains('The changes to the layout have been discarded.');
  }

}

Classes

Title Deprecated Summary
LayoutBuilderFormModeTest Tests Layout Builder forms.

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