diff core/tests/Drupal/FunctionalJavascriptTests/Ajax/FormValuesTest.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/Drupal/FunctionalJavascriptTests/Ajax/FormValuesTest.php	Thu Feb 28 13:21:36 2019 +0000
@@ -0,0 +1,84 @@
+<?php
+
+namespace Drupal\FunctionalJavascriptTests\Ajax;
+
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+
+/**
+ * Tests that form values are properly delivered to AJAX callbacks.
+ *
+ * @group Ajax
+ */
+class FormValuesTest extends WebDriverTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['node', 'ajax_test', 'ajax_forms_test'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->drupalLogin($this->drupalCreateUser(['access content']));
+  }
+
+  /**
+   * Submits forms with select and checkbox elements via Ajax.
+   */
+  public function testSimpleAjaxFormValue() {
+
+    $this->drupalGet('ajax_forms_test_get_form');
+
+    $session = $this->getSession();
+    $assertSession = $this->assertSession();
+
+    // Verify form values of a select element.
+    foreach (['green', 'blue', 'red'] as $item) {
+      // Updating the field will trigger a AJAX request/response.
+      $session->getPage()->selectFieldOption('select', $item);
+
+      // The AJAX command in the response will update the DOM
+      $select = $assertSession->waitForElement('css', "div#ajax_selected_color:contains('$item')");
+      $this->assertNotNull($select, "DataCommand has updated the page with a value of $item.");
+    }
+
+    // Verify form values of a checkbox element.
+    $session->getPage()->checkField('checkbox');
+    $div0 = $this->assertSession()->waitForElement('css', "div#ajax_checkbox_value:contains('checked')");
+    $this->assertNotNull($div0, 'DataCommand updates the DOM as expected when a checkbox is selected');
+
+    $session->getPage()->uncheckField('checkbox');
+    $div1 = $this->assertSession()->waitForElement('css', "div#ajax_checkbox_value:contains('unchecked')");
+    $this->assertNotNull($div1, 'DataCommand updates the DOM as expected when a checkbox is de-selected');
+
+    // Verify that AJAX elements with invalid callbacks return error code 500.
+    // Ensure the test error log is empty before these tests.
+    $this->assertFalse(file_exists(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'), 'PHP error.log is empty.');
+    // We don't need to check for the X-Drupal-Ajax-Token header with these
+    // invalid requests.
+    $this->assertAjaxHeader = FALSE;
+    foreach (['null', 'empty', 'nonexistent'] as $key) {
+      $element_name = 'select_' . $key . '_callback';
+      // Updating the field will trigger a AJAX request/response.
+      $session->getPage()->selectFieldOption($element_name, 'green');
+
+      // The select element is disabled as the AJAX request is issued.
+      $this->assertSession()->waitForElement('css', "select[name=\"$element_name\"]:disabled");
+
+      // The select element is enabled as the response is receieved.
+      $this->assertSession()->waitForElement('css', "select[name=\"$element_name\"]:enabled");
+      $this->assertTrue(file_exists(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'), 'PHP error.log is not empty.');
+      $this->assertContains('"The specified #ajax callback is empty or not callable."', file_get_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'));
+      // The exceptions are expected. Do not interpret them as a test failure.
+      // Not using File API; a potential error must trigger a PHP warning.
+      unlink(\Drupal::root() . '/' . $this->siteDirectory . '/error.log');
+    }
+    // We need to reload the page to kill any unfinished AJAX calls before
+    // tearDown() is called.
+    $this->drupalGet('ajax_forms_test_get_form');
+  }
+
+}