You are here

public function DependentDropdownTest::testDependentDropdown in Examples for Developers 3.x

Same name in this branch
  1. 3.x modules/ajax_example/tests/src/Functional/DependentDropdownTest.php \Drupal\Tests\ajax_example\Functional\DependentDropdownTest::testDependentDropdown()
  2. 3.x modules/ajax_example/tests/src/FunctionalJavascript/DependentDropdownTest.php \Drupal\Tests\ajax_example\FunctionalJavascript\DependentDropdownTest::testDependentDropdown()
Same name and namespace in other branches
  1. 8 ajax_example/tests/src/Functional/DependentDropdownTest.php \Drupal\Tests\ajax_example\Functional\DependentDropdownTest::testDependentDropdown()

Test the dependent dropdown form without AJAX.

File

modules/ajax_example/tests/src/Functional/DependentDropdownTest.php, line 33

Class

DependentDropdownTest
Functional test of non-AJAX dependent dropdown example.

Namespace

Drupal\Tests\ajax_example\Functional

Code

public function testDependentDropdown() {

  // Get the Mink stuff.
  $session = $this
    ->getSession();
  $assert = $this
    ->assertSession();
  $page = $session
    ->getPage();

  // Get a URL object for the form, specifying no JS.
  $dropdown_url = Url::fromRoute('ajax_example.dependent_dropdown', [
    'nojs' => 'nojs',
  ]);

  // Get the form.
  $this
    ->drupalGet($dropdown_url);

  // Check for the initial state.
  $assert
    ->fieldDisabled('instrument_dropdown');
  $assert
    ->fieldValueEquals('instrument_dropdown', 'none');
  $submit_button = $page
    ->findButton('edit-submit');
  $this
    ->assertTrue($submit_button
    ->hasAttribute('disabled'));

  // Run through the matrix of form submissions.
  $families = [
    'String' => [
      'Violin',
      'Viola',
      'Cello',
      'Double Bass',
    ],
    'Woodwind' => [
      'Flute',
      'Clarinet',
      'Oboe',
      'Bassoon',
    ],
    'Brass' => [
      'Trumpet',
      'Trombone',
      'French Horn',
      'Euphonium',
    ],
    'Percussion' => [
      'Bass Drum',
      'Timpani',
      'Snare Drum',
      'Tambourine',
    ],
  ];
  foreach ($families as $family => $instruments) {

    // Post the form for the instrument family.
    $this
      ->drupalPostForm($dropdown_url, [
      'instrument_family_dropdown' => $family,
    ], 'Choose');

    // Get the instrument dropdown elements.
    $instrument_options = $page
      ->findAll('css', '#edit-instrument-dropdown option');
    $this
      ->assertCount(count($instruments), $instrument_options);

    // Make sure all the instruments are in the select dropdown.
    foreach ($instrument_options as $instrument) {
      $this
        ->assertContains($instrument
        ->getAttribute('value'), $instruments);
    }

    // Post each instrument. We have to 'choose' again in order to unlock the
    // instrument dropdown.
    foreach ($instruments as $instrument) {
      $this
        ->drupalPostForm($dropdown_url, [
        'instrument_family_dropdown' => $family,
      ], 'Choose');
      $this
        ->drupalPostForm(NULL, [
        'instrument_dropdown' => $instrument,
      ], 'Submit');
      $assert
        ->pageTextContains("Your values have been submitted. Instrument family: {$family}, Instrument: {$instrument}");
    }
  }
}