You are here

WebformElementTableTest.php in Webform 8.5

Same filename and directory in other branches
  1. 6.x tests/src/Functional/Element/WebformElementTableTest.php

File

tests/src/Functional/Element/WebformElementTableTest.php
View source
<?php

namespace Drupal\Tests\webform\Functional\Element;

use Drupal\webform\Entity\Webform;

/**
 * Tests for table elements.
 *
 * @group webform
 */
class WebformElementTableTest extends WebformElementBrowserTestBase {

  /**
   * Modules to enable.
   *
   * @var array
   */
  public static $modules = [
    'webform',
    'webform_ui',
    'file',
  ];

  /**
   * Webforms to load.
   *
   * @var array
   */
  protected static $testWebforms = [
    'test_element_table',
  ];

  /**
   * Tests table elements.
   */
  public function testTable() {
    global $base_path;
    $webform = Webform::load('test_element_table');
    $this
      ->drupalGet('/webform/test_element_table');

    /**************************************************************************/

    // Rendering.

    /**************************************************************************/

    // Check default table rendering.
    $this
      ->assertRaw('<table class="js-form-wrapper responsive-enabled" data-drupal-selector="edit-table" id="edit-table" data-striping="1">');
    $this
      ->assertPattern('#<th>First Name</th>\\s+<th>Last Name</th>\\s+<th>Gender</th>#');
    $this
      ->assertRaw('<tr data-drupal-selector="edit-table-1">');
    $this
      ->assertRaw('<td><div class="js-form-item form-item js-form-type-textfield form-item-table__1__first-name js-form-item-table__1__first-name form-no-label">');
    $this
      ->assertRaw('<input data-drupal-selector="edit-table-1-first-name" type="text" id="edit-table-1-first-name" name="table__1__first_name" value="John" size="20" maxlength="255" class="form-text" />');

    // Check webform table basic rendering.
    $this
      ->assertRaw('<table data-drupal-selector="edit-table-basic" class="webform-table responsive-enabled" id="edit-table-basic" data-striping="1">');
    $this
      ->assertRaw('<tr data-drupal-selector="edit-table-basic-01" class="webform-table-row">');
    $this
      ->assertRaw('<input data-drupal-selector="edit-table-basic-01-first-name" type="text" id="edit-table-basic-01-first-name" name="table_basic_01_first_name" value="" size="60" maxlength="255" class="form-text" />');

    // Check webform table advanced rendering.
    $this
      ->assertRaw('<table data-drupal-selector="edit-table-advanced" class="webform-table sticky-enabled responsive-enabled" id="edit-table-advanced" data-striping="1">');
    $this
      ->assertPattern('#<th width="50%">Composite</th>\\s+<th width="50%">Nested</th>#');

    // Check webform table states rendering.
    $this
      ->assertRaw('<table data-drupal-selector="edit-table-states" class="webform-table responsive-enabled" id="edit-table-states" data-drupal-states="{&quot;invisible&quot;:{&quot;.webform-submission-test-element-table-add-form :input[name=\\u0022table_rows\\u0022]&quot;:{&quot;value&quot;:&quot;&quot;}}}" data-striping="1">');
    $this
      ->assertRaw('<tr data-drupal-selector="edit-table-states-01" class="webform-table-row js-form-item" data-drupal-states="{&quot;visible&quot;:{&quot;.webform-submission-test-element-table-add-form :input[name=\\u0022table_rows\\u0022]&quot;:{&quot;value&quot;:{&quot;greater&quot;:&quot;0&quot;}}}}">');

    /**************************************************************************/

    // Display.

    /**************************************************************************/
    $edit = [
      'table_basic_01_first_name' => 'Ringo',
      'table_basic_01_last_name' => 'Starr',
      'table_basic_01_gender' => 'Male',
      'table_advanced_01_first_name' => 'John',
      'table_advanced_01_last_name' => 'Lennon',
      'table_advanced_01_gender' => 'Male',
    ];
    $this
      ->drupalPostForm('/webform/test_element_table', $edit, 'Preview');

    // Check data.
    $this
      ->assertRaw("table__1__first_name: John\ntable__1__last_name: Smith\ntable__1__gender: Male\ntable__2__first_name: Jane\ntable__2__last_name: Doe\ntable__2__gender: Female\ntable_basic_01_first_name: Ringo\ntable_basic_01_last_name: Starr\ntable_basic_01_gender: Male\ntable_advanced_01_address: null\ntable_advanced_01_first_name: John\ntable_advanced_01_last_name: Lennon\ntable_advanced_01_gender: Male\ntable_advanced_01_managed_file: null\ntable_rows: '1'\ntable_advanced_01_textfield: ''\ntable_advanced_02_textfield: ''\ntable_advanced_03_textfield: ''\ntable_advanced_04_textfield: ''");

    // Check default table display.
    $this
      ->assertPattern('#<th>First Name</th>\\s+<th>Last Name</th>\\s+<th>Gender</th>\\s+<th>Markup</th>#');
    $this
      ->assertPattern('#<td>John</td>\\s+<td>Smith</td>\\s+<td>Male</td>\\s+<td>{markup_1}</td>#');
    $this
      ->assertPattern('#<td>Jane</td>\\s+<td>Doe</td>\\s+<td>Female</td>\\s+<td>{markup_2}</td>#');

    // Check basic table display.
    $this
      ->assertPattern('#<label>table_basic</label>\\s+<table class="responsive-enabled" data-striping="1">#');
    $this
      ->assertPattern('#<tr>\\s+<td>Ringo</td>\\s+<td>Starr</td>\\s+<td>Male</td>\\s+<td>{markup_1}</td>\\s+</tr>#');

    // Check advanced table display.
    $this
      ->assertPattern('#<label>table_advanced</label>\\s+<div><details class="webform-container webform-container-type-details#');
    $this
      ->assertRaw('<section class="js-form-item form-item js-form-wrapper form-wrapper webform-section" id="test_element_table--table_advanced_01_container">');

    // Check states table display.
    $this
      ->assertPattern('<div class="webform-element webform-element-type-webform-table js-form-item form-item js-form-type-item form-item-table-states js-form-item-table-states" id="test_element_table--table_states">');

    /**************************************************************************/

    // User interface.

    /**************************************************************************/
    $this
      ->drupalLogin($this->rootUser);

    // Check that add table row is not displayed in select element.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add');
    $this
      ->assertNoRaw('Table row');

    // Check that add table row link is displayed.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table');
    $this
      ->assertLinkByHref("{$base_path}admin/structure/webform/manage/test_element_table/element/add/webform_table_row?parent=table_basic");

    // Check that add table row without a parent table returns a 404 error.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row');
    $this
      ->assertResponse(404);

    // Check default table row element key and title.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [
      'query' => [
        'parent' => 'table_basic',
      ],
    ]);
    $this
      ->assertFieldByName('properties[title]', 'Basic Person (2)');
    $this
      ->assertFieldByName('key', 'table_basic_02');

    // Check table row element can duplicate sub elements from the
    // first table row.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [
      'query' => [
        'parent' => 'table_basic',
      ],
    ]);
    $this
      ->assertFieldByName('properties[duplicate]', TRUE);

    // Check table row element sub elements are duplicated.
    $this
      ->drupalPostForm('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [], 'Save', [
      'query' => [
        'parent' => 'table_basic',
      ],
    ]);
    $this
      ->assertRaw('>table_basic_02<');
    $this
      ->assertRaw('>table_basic_02_first_name<');
    $this
      ->assertRaw('>table_basic_02_last_name<');
    $this
      ->assertRaw('>table_basic_02_gender<');
    $this
      ->assertRaw('>table_basic_02_markup<');

    // Check table row element sub elements are NOT duplicated.
    $this
      ->drupalPostForm('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [
      'properties[duplicate]' => FALSE,
    ], 'Save', [
      'query' => [
        'parent' => 'table_basic',
      ],
    ]);
    $this
      ->assertRaw('>table_basic_03<');
    $this
      ->assertNoRaw('>table_basic_03_first_name<');
    $this
      ->assertNoRaw('>table_basic_03_last_name<');
    $this
      ->assertNoRaw('>table_basic_03_gender<');
    $this
      ->assertNoRaw('>table_basic_03_markup<');

    // Check default table row element key and title.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/textfield', [
      'query' => [
        'parent' => 'table_basic_01',
      ],
    ]);
    $this
      ->assertRaw("Element keys are automatically prefixed with parent row's key.");
    $this
      ->assertRaw('<span class="field-prefix">table_basic_01_</span>');

    // Check that elements are prefixed with row key.
    $edit = [
      'key' => 'testing',
      'properties[title]' => 'Testing',
    ];
    $options = [
      'query' => [
        'parent' => 'table_basic_01',
      ],
    ];
    $this
      ->drupalPostForm('/admin/structure/webform/manage/test_element_table/element/add/textfield', $edit, 'Save', $options);
    $this
      ->assertRaw('>table_basic_01_testing<');

    // Check table row element can NOT duplicate sub elements from the
    // first table row.
    $webform
      ->setElementProperties('textfield', [
      '#type' => 'textfield',
      'title' => 'textfield',
    ], 'table_basic_01')
      ->save();
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [
      'query' => [
        'parent' => 'table_basic',
      ],
    ]);
    $this
      ->assertNoFieldByName('properties[duplicate]');

    // Check prefix children disabled for table row.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/webform_table_row', [
      'query' => [
        'parent' => 'table_prefix_children_false',
      ],
    ]);
    $this
      ->assertFieldByName('properties[title]', '');
    $this
      ->assertFieldByName('key', '');

    // Check prefix children disabled for table row element.
    $this
      ->drupalGet('/admin/structure/webform/manage/test_element_table/element/add/textfield', [
      'query' => [
        'parent' => 'table_prefix_children_false_01',
      ],
    ]);
    $this
      ->assertNoRaw("Element keys are automatically prefixed with parent row's key.");
    $this
      ->assertNoRaw('<span class="field-prefix">table_basic_01_</span>');
  }

}

Classes

Namesort descending Description
WebformElementTableTest Tests for table elements.