examples-3.x-dev/modules/ajax_example/tests/src/FunctionalJavascript/DependentDropdownTest.php
modules/ajax_example/tests/src/FunctionalJavascript/DependentDropdownTest.php
<?php
namespace Drupal\Tests\ajax_example\FunctionalJavascript;
use Drupal\Core\Url;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
/**
* Functional test of dependent dropdown example.
*
* @group ajax_example
*
* @see \Drupal\Tests\ajax_example\FunctionalJavascript\DependentDropdownTest
*/
class DependentDropdownTest extends WebDriverTestBase {
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected static $modules = ['ajax_example'];
/**
* Test the dependent dropdown form with AJAX.
*/
public function testDependentDropdown() {
// Get the Mink stuff.
$assert = $this->assertSession();
$page = $this->getSession()->getPage();
// Get a URL object for the form, specifying AJAX.
$dropdown_url = Url::fromRoute('ajax_example.dependent_dropdown');
// 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 families.
$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) {
// Select a family.
$family_dropdown = $assert->fieldExists('instrument_family_dropdown');
$family_dropdown->setValue($family);
$assert->assertWaitOnAjaxRequest();
// Get the instrument dropdown elements.
$instrument_options = $page->findAll('css', 'select[name="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.
foreach ($instruments as $instrument) {
$this->drupalGet($dropdown_url);
$assert->selectExists('instrument_family_dropdown')->selectOption($family);
$assert->assertWaitOnAjaxRequest();
$assert->selectExists('instrument_dropdown')->selectOption($instrument);
$assert->buttonExists('Submit')->press();
$assert->pageTextContains("Your values have been submitted. Instrument family: $family, Instrument: $instrument");
}
}
}
}
