You are here

public function ComplexSimpleWidgetTest::testSimpleInComplex in Inline Entity Form 8

Test a Simple IEF widget inside of Complex IEF widget.

File

tests/src/FunctionalJavascript/ComplexSimpleWidgetTest.php, line 46

Class

ComplexSimpleWidgetTest
IEF complex field widget containing an IEF simple field widget tests.

Namespace

Drupal\Tests\inline_entity_form\FunctionalJavascript

Code

public function testSimpleInComplex() {
  $page = $this
    ->getSession()
    ->getPage();
  $assert_session = $this
    ->assertSession();
  $outer_required_options = [
    TRUE,
    FALSE,
  ];
  $cardinality_options = [
    1 => 1,
    2 => 2,
    FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => 3,
  ];
  $first_title_field_xpath = $this
    ->getXpathForNthInputByLabelText('Title', 1);
  $outer_title_field_xpath = $this
    ->getXpathForNthInputByLabelText('Title', 2);
  $inner_title_field_xpath = $this
    ->getXpathForNthInputByLabelText('Title', 3);

  /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
  $field_storage = $this->fieldStorageConfigStorage
    ->load('node.ief_complex_outer');

  /** @var \Drupal\Core\Field\FieldConfigInterface $field_config */
  $field_config = $this->fieldConfigStorage
    ->load('node.ief_complex_simple.ief_complex_outer');
  foreach ($outer_required_options as $outer_required_option) {
    $field_config
      ->setRequired($outer_required_option);
    $field_config
      ->save();
    foreach ($cardinality_options as $cardinality => $limit) {
      $field_storage
        ->setCardinality($cardinality);
      $field_storage
        ->save();
      $this
        ->drupalGet('node/add/ief_complex_simple');
      if (!$outer_required_option) {
        $assert_session
          ->pageTextContains('Complex Outer');

        // Field should not be available before ajax submit.
        $assert_session
          ->elementNotExists('xpath', $outer_title_field_xpath);
        $assert_session
          ->elementExists('xpath', '//input[@type="submit" and @value="Add new node"]')
          ->press();
        $this
          ->assertNotEmpty($assert_session
          ->waitForElement('xpath', $outer_title_field_xpath));
      }
      $outer_title = $this
        ->randomMachineName();
      $inner_title = $this
        ->randomMachineName();
      $assert_session
        ->elementExists('xpath', $outer_title_field_xpath)
        ->setValue($outer_title);

      // Simple widget is required so should always show up. No need for
      // add submit.
      $assert_session
        ->elementExists('xpath', $inner_title_field_xpath)
        ->setValue($inner_title);
      $create_outer_button_selector = '//input[@type="submit" and @value="Create node"]';
      $assert_session
        ->elementExists('xpath', $create_outer_button_selector)
        ->press();

      // After Ajax submit the ief title fields should be gone.
      $this
        ->assertNotEmpty($assert_session
        ->waitForButton('Edit'));
      $assert_session
        ->elementNotExists('xpath', $outer_title_field_xpath);
      $assert_session
        ->elementNotExists('xpath', $inner_title_field_xpath);
      $assert_session
        ->elementNotExists('xpath', $create_outer_button_selector);

      // The nodes should not actually be saved at this point.
      $this
        ->assertNoNodeByTitle($outer_title, 'Outer node was not created when widget submitted.');
      $this
        ->assertNoNodeByTitle($inner_title, 'Inner node was not created when widget submitted.');
      $host_title = $this
        ->randomMachineName();
      $assert_session
        ->elementExists('xpath', $first_title_field_xpath)
        ->setValue($host_title);
      $page
        ->pressButton('Save');
      $assert_session
        ->pageTextContains("{$host_title} has been created.");
      $assert_session
        ->pageTextContains($outer_title);

      // Check the nodes were created correctly.
      $host_node = $this
        ->drupalGetNodeByTitle($host_title);
      $this
        ->assertNotNull($host_node->ief_complex_outer->entity, 'Outer node was created.');
      if (isset($host_node->ief_complex_outer->entity)) {
        $outer_node = $host_node->ief_complex_outer->entity;
        $this
          ->assertEquals($outer_title, $outer_node
          ->label(), "Outer node's title looks correct.");
        $this
          ->assertEquals('ief_simple_single', $outer_node
          ->bundle(), "Outer node's type looks correct.");
        $this
          ->assertNotNull($outer_node->single->entity, 'Inner node was created');
        if (isset($outer_node->single->entity)) {
          $inner_node = $outer_node->single->entity;
          $this
            ->assertEquals($inner_title, $inner_node
            ->label(), "Inner node's title looks correct.");
          $this
            ->assertEquals('ief_test_custom', $inner_node
            ->bundle(), "Inner node's type looks correct.");
        }
      }
    }
  }
}