diff core/modules/search/tests/src/Functional/SearchTestBase.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/search/tests/src/Functional/SearchTestBase.php	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,92 @@
+<?php
+
+namespace Drupal\Tests\search\Functional;
+
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Component\Utility\SafeMarkup;
+
+/**
+ * Defines the common search test code.
+ */
+abstract class SearchTestBase extends BrowserTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['node', 'search', 'dblog'];
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Create Basic page and Article node types.
+    if ($this->profile != 'standard') {
+      $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
+      $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
+    }
+  }
+
+  /**
+   * Simulates submission of a form using GET instead of POST.
+   *
+   * Forms that use the GET method cannot be submitted with
+   * WebTestBase::drupalPostForm(), which explicitly uses POST to submit the
+   * form. So this method finds the form, verifies that it has input fields and
+   * a submit button matching the inputs to this method, and then calls
+   * WebTestBase::drupalGet() to simulate the form submission to the 'action'
+   * URL of the form (if set, or the current URL if not).
+   *
+   * See WebTestBase::drupalPostForm() for more detailed documentation of the
+   * function parameters.
+   *
+   * @param string $path
+   *   Location of the form to be submitted: either a Drupal path, absolute
+   *   path, or NULL to use the current page.
+   * @param array $edit
+   *   Form field data to submit. Unlike drupalPostForm(), this does not support
+   *   file uploads.
+   * @param string $submit
+   *   Value of the submit button to submit clicking. Unlike drupalPostForm(),
+   *   this does not support AJAX.
+   * @param string $form_html_id
+   *   (optional) HTML ID of the form, to disambiguate.
+   */
+  protected function submitGetForm($path, $edit, $submit, $form_html_id = NULL) {
+    if (isset($path)) {
+      $this->drupalGet($path);
+    }
+
+    if ($this->parse()) {
+      // Iterate over forms to find one that matches $edit and $submit.
+      $edit_save = $edit;
+      $xpath = '//form';
+      if (!empty($form_html_id)) {
+        $xpath .= "[@id='" . $form_html_id . "']";
+      }
+      $forms = $this->xpath($xpath);
+      foreach ($forms as $form) {
+        // Try to set the fields of this form as specified in $edit.
+        $edit = $edit_save;
+        $post = [];
+        $upload = [];
+        $submit_matches = $this->handleForm($post, $edit, $upload, $submit, $form);
+        if (!$edit && $submit_matches) {
+          // Everything matched, so "submit" the form.
+          $action = isset($form['action']) ? $this->getAbsoluteUrl((string) $form['action']) : NULL;
+          $this->drupalGet($action, ['query' => $post]);
+          return;
+        }
+      }
+
+      // We have not found a form which contained all fields of $edit and
+      // the submit button.
+      foreach ($edit as $name => $value) {
+        $this->fail(SafeMarkup::format('Failed to set field @name to @value', ['@name' => $name, '@value' => $value]));
+      }
+      $this->assertTrue($submit_matches, format_string('Found the @submit button', ['@submit' => $submit]));
+      $this->fail(format_string('Found the requested form fields at @path', ['@path' => $path]));
+    }
+  }
+
+}