public function ParagraphsGridLayoutPluginTest::testGridLayoutPlugin

Tests the grid layout plugin settings and functionality.

File

paragraphs_collection/tests/src/Functional/ParagraphsGridLayoutPluginTest.php, line 26

Class

ParagraphsGridLayoutPluginTest
Tests the grid layout plugin.

Namespace

Drupal\Tests\paragraphs_collection\Functional

Code

public function testGridLayoutPlugin() {
  $this
    ->loginAsAdmin([
    'edit behavior plugin settings',
  ]);

  // Paragraph types add form.
  $this
    ->drupalGet('admin/structure/paragraphs_type/add');
  $this
    ->assertSession()
    ->pageTextContains('Grid layout');

  // Paragraph type edit form.
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid');
  $this
    ->assertSession()
    ->checkboxChecked('edit-behavior-plugins-grid-layout-enabled');
  $this
    ->assertSession()
    ->pageTextContains('Grid field');
  $this
    ->assertSession()
    ->optionExists('edit-behavior-plugins-grid-layout-settings-paragraph-reference-field', 'paragraphs_container_paragraphs');
  $this
    ->assertSession()
    ->pageTextContains('Grid layouts');
  $this
    ->assertSession()
    ->pageTextContains('2 columns');

  // Test that entity reference field is also an option if cardinality is
  // greater than 1.
  static::fieldUIAddNewField('admin/structure/paragraphs_type/grid', 'user_reference', 'User', 'entity_reference', [
    'settings[target_type]' => 'user',
  ], []);
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid');
  $this
    ->assertSession()
    ->optionNotExists('edit-behavior-plugins-grid-layout-settings-paragraph-reference-field', 'field_user_reference');
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid/fields/paragraph.grid.field_user_reference/storage');
  $edit = [
    'cardinality' => '-1',
  ];
  $this
    ->submitForm($edit, t('Save field settings'));
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid');
  $this
    ->assertSession()
    ->optionExists('edit-behavior-plugins-grid-layout-settings-paragraph-reference-field', 'field_user_reference');
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid/fields/paragraph.grid.field_user_reference/delete');
  $this
    ->submitForm([], t('Delete'));
  $this
    ->assertSession()
    ->pageTextContains('The field User has been deleted from the Grid content type.');

  // Node creation.
  $this
    ->addParagraphedContentType('paragraphed_test', 'paragraphs_container');
  $this
    ->drupalGet('node/add/paragraphed_test');
  $this
    ->submitForm([], 'paragraphs_container_grid_add_more');

  // Check that the grid layout options are sorted alphabetically.
  $options = $this
    ->xpath('//select[contains(@id, :id)]/option', [
    ':id' => 'edit-paragraphs-container-0-behavior-plugins-grid-layout-layout',
  ]);
  $this
    ->assertEquals('- None -', $options[0]
    ->getText());
  $this
    ->assertEquals('2 columns', $options[1]
    ->getText());
  $this
    ->assertEquals('3 columns', $options[2]
    ->getText());
  $this
    ->assertEquals('4 columns', $options[3]
    ->getText());

  // Create a grid of paragraphs.
  $this
    ->submitForm([], 'paragraphs_container_0_subform_paragraphs_container_paragraphs_container_add_more');
  $this
    ->submitForm([], 'paragraphs_container_0_subform_paragraphs_container_paragraphs_container_add_more');
  $this
    ->submitForm([], 'paragraphs_container_0_subform_paragraphs_container_paragraphs_container_add_more');
  $edit = [
    'title[0][value]' => 'Grid',
    'paragraphs_container[0][behavior_plugins][grid_layout][layout_wrapper][layout]' => 'paragraphs_collection_test_two_column',
  ];
  $this
    ->submitForm($edit, 'Save');
  $this
    ->assertSession()
    ->pageTextContains('paragraphed_test Grid has been created.');
  $this
    ->assertSession()
    ->responseContains('paragraphs_collection_test/css/grid-layout.css');
  $this
    ->drupalGet('node/1');

  // We ship with the grid container label hidden, so we don't have the
  // field__items wrapper.
  $grid_columns[] = '//div[contains(@class, "paragraphs-behavior-grid-layout-row")]/div[1][contains(@class, "paragraphs-behavior-grid-layout-col-8")]';
  $grid_columns[] = '//div[contains(@class, "paragraphs-behavior-grid-layout-row")]/div[2][contains(@class, "paragraphs-behavior-grid-layout-col-4")]';
  $grid_columns[] = '//div[contains(@class, "paragraphs-behavior-grid-layout-row")]/div[3][contains(@class, "paragraphs-behavior-grid-layout-col-8")]';
  foreach ($grid_columns as $key => $column) {
    $xpath = $column;
    $this
      ->assertSession()
      ->elementTextContains('xpath', $xpath, NULL);
  }

  // Check alphabetical order with a subset of enabled layouts
  // by disabling one layout.
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid');
  $enabled_layouts = [
    'behavior_plugins[grid_layout][settings][available_grid_layouts][paragraphs_collection_test_three_column]' => TRUE,
    'behavior_plugins[grid_layout][settings][available_grid_layouts][paragraphs_collection_test_four_column]' => TRUE,
  ];
  $this
    ->submitForm($enabled_layouts, t('Save'));
  $this
    ->drupalGet('node/add/paragraphed_test');
  $this
    ->submitForm([], 'paragraphs_container_grid_add_more');

  // Check that the grid layout options are sorted alphabetically.
  $options = $this
    ->xpath('//select[contains(@id, :id)]/option', [
    ':id' => 'edit-paragraphs-container-0-behavior-plugins-grid-layout-layout',
  ]);
  $this
    ->assertEquals('- None -', $options[0]
    ->getText());
  $this
    ->assertEquals('3 columns', $options[1]
    ->getText());
  $this
    ->assertEquals('4 columns', $options[2]
    ->getText());
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid/fields/paragraph.grid.paragraphs_container_paragraphs/delete');
  $this
    ->submitForm([], t('Delete'));
  $this
    ->assertSession()
    ->pageTextContains('The field Paragraphs has been deleted from the Grid content type.');
  $node = $this
    ->getNodeByTitle('Grid');
  $this
    ->drupalGet('node/' . $node
    ->id());
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  $this
    ->drupalGet('admin/structure/paragraphs_type/grid');
  $this
    ->assertSession()
    ->statusCodeEquals(200);
  $this
    ->assertSession()
    ->pageTextContains('No paragraph reference field type available. Please add at least one in the Manage fields page.');
  $this
    ->submitForm([
    'behavior_plugins[grid_layout][enabled]' => TRUE,
  ], t('Save'));
  $this
    ->assertSession()
    ->pageTextContains('The grid layout plugin cannot be enabled if the paragraph reference field is missing.');
}