Version 1
[yaffs-website] / web / core / modules / simpletest / tests / src / Unit / WebTestBaseTest.php
diff --git a/web/core/modules/simpletest/tests/src/Unit/WebTestBaseTest.php b/web/core/modules/simpletest/tests/src/Unit/WebTestBaseTest.php
new file mode 100644 (file)
index 0000000..df90956
--- /dev/null
@@ -0,0 +1,235 @@
+<?php
+
+namespace Drupal\Tests\simpletest\Unit;
+
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @requires extension curl
+ * @coversDefaultClass \Drupal\simpletest\WebTestBase
+ * @group simpletest
+ */
+class WebTestBaseTest extends UnitTestCase {
+
+  /**
+   * Provides data for testing the assertFieldByName() helper.
+   *
+   * @return array
+   *   An array of values passed to the test method.
+   */
+  public function providerAssertFieldByName() {
+    $data = [];
+    $data[] = ['select_2nd_selected', 'test', '1', FALSE];
+    $data[] = ['select_2nd_selected', 'test', '2', TRUE];
+    $data[] = ['select_none_selected', 'test', '', FALSE];
+    $data[] = ['select_none_selected', 'test', '1', TRUE];
+    $data[] = ['select_none_selected', 'test', NULL, TRUE];
+
+    return $data;
+  }
+
+  /**
+   * Tests the assertFieldByName() helper.
+   *
+   * @param string $filename
+   *   Name of file containing the output to test.
+   * @param string $name
+   *   Name of field to assert.
+   * @param string $value
+   *   Value of the field to assert.
+   * @param bool $expected
+   *   The expected result of the assert.
+   *
+   * @see \Drupal\simpletest\WebTestBase::assertFieldByName()
+   *
+   * @dataProvider providerAssertFieldByName
+   * @covers ::assertFieldByName
+   */
+  public function testAssertFieldByName($filename, $name, $value, $expected) {
+    $content = file_get_contents(__DIR__ . '/../../fixtures/' . $filename . '.html');
+
+    $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
+      ->disableOriginalConstructor()
+      ->setMethods(['getRawContent', 'assertTrue', 'pass'])
+      ->getMock();
+
+    $web_test->expects($this->any())
+      ->method('getRawContent')
+      ->will($this->returnValue($content));
+
+    $web_test->expects($this->once())
+      ->method('assertTrue')
+      ->with($this->identicalTo($expected),
+             $this->identicalTo('message'),
+             $this->identicalTo('Browser'));
+
+    $test_method = new \ReflectionMethod('Drupal\simpletest\WebTestBase', 'assertFieldByName');
+    $test_method->setAccessible(TRUE);
+    $test_method->invokeArgs($web_test, [$name, $value, 'message']);
+  }
+
+  /**
+   * Data provider for testClickLink().
+   *
+   * In the test method, we mock drupalGet() to return a known string:
+   * 'This Text Returned By drupalGet()'. Since clickLink() can only return
+   * either the value of drupalGet() or FALSE, our expected return value is the
+   * same as this mocked return value when we expect a link to be found.
+   *
+   * @see https://www.drupal.org/node/1452896
+   *
+   * @return array
+   *   Array of arrays of test data. Test data is structured as follows:
+   *   - Expected return value of clickLink().
+   *   - Parameter $label to clickLink().
+   *   - Parameter $index to clickLink().
+   *   - Test data to be returned by mocked xpath(). Return an empty array here
+   *     to mock no link found on the page.
+   */
+  public function providerTestClickLink() {
+    return [
+      // Test for a non-existent label.
+      [
+        FALSE,
+        'does_not_exist',
+        0,
+        [],
+      ],
+      // Test for an existing label.
+      [
+        'This Text Returned By drupalGet()',
+        'exists',
+        0,
+        [0 => ['href' => 'this_is_a_url']],
+      ],
+      // Test for an existing label that isn't the first one.
+      [
+        'This Text Returned By drupalGet()',
+        'exists',
+        1,
+        [
+          0 => ['href' => 'this_is_a_url'],
+          1 => ['href' => 'this_is_another_url'],
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * Test WebTestBase::clickLink().
+   *
+   * @param mixed $expected
+   *   Expected return value of clickLink().
+   * @param string $label
+   *   Parameter $label to clickLink().
+   * @param int $index
+   *   Parameter $index to clickLink().
+   * @param array $xpath_data
+   *   Test data to be returned by mocked xpath().
+   *
+   * @dataProvider providerTestClickLink
+   * @covers ::clickLink
+   */
+  public function testClickLink($expected, $label, $index, $xpath_data) {
+    // Mock a WebTestBase object and some of its methods.
+    $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
+      ->disableOriginalConstructor()
+      ->setMethods([
+        'pass',
+        'fail',
+        'getUrl',
+        'xpath',
+        'drupalGet',
+        'getAbsoluteUrl',
+      ])
+      ->getMock();
+
+    // Mocked getUrl() is only used for reporting so we just return a string.
+    $web_test->expects($this->any())
+      ->method('getUrl')
+      ->will($this->returnValue('url_before'));
+
+    // Mocked xpath() should return our test data.
+    $web_test->expects($this->any())
+      ->method('xpath')
+      ->will($this->returnValue($xpath_data));
+
+    if ($expected === FALSE) {
+      // If link does not exist clickLink() will not try to do a drupalGet() or
+      // a getAbsoluteUrl()
+      $web_test->expects($this->never())
+        ->method('drupalGet');
+      $web_test->expects($this->never())
+        ->method('getAbsoluteUrl');
+      // The test should fail and not pass.
+      $web_test->expects($this->never())
+        ->method('pass');
+      $web_test->expects($this->once())
+        ->method('fail')
+        ->will($this->returnValue(NULL));
+    }
+    else {
+      // Mocked getAbsoluteUrl() should return whatever comes in.
+      $web_test->expects($this->once())
+        ->method('getAbsoluteUrl')
+        ->with($xpath_data[$index]['href'])
+        ->will($this->returnArgument(0));
+      // We're only testing clickLink(), so drupalGet() always returns a string.
+      $web_test->expects($this->once())
+        ->method('drupalGet')
+        ->with($xpath_data[$index]['href'])
+        ->will($this->returnValue('This Text Returned By drupalGet()'));
+      // The test should pass and not fail.
+      $web_test->expects($this->never())
+        ->method('fail');
+      $web_test->expects($this->once())
+        ->method('pass')
+        ->will($this->returnValue(NULL));
+    }
+
+    // Set the clickLink() method to public so we can test it.
+    $clicklink_method = new \ReflectionMethod($web_test, 'clickLink');
+    $clicklink_method->setAccessible(TRUE);
+
+    $this->assertSame($expected, $clicklink_method->invoke($web_test, $label, $index));
+  }
+
+  /**
+   * @dataProvider providerTestGetAbsoluteUrl
+   */
+  public function testGetAbsoluteUrl($href, $expected_absolute_path) {
+    $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
+      ->disableOriginalConstructor()
+      ->setMethods(['getUrl'])
+      ->getMock();
+
+    $web_test->expects($this->any())
+      ->method('getUrl')
+      ->willReturn('http://example.com/drupal/current-path?foo=baz');
+
+    $GLOBALS['base_url'] = 'http://example.com';
+    $GLOBALS['base_path'] = 'drupal';
+
+    $get_absolute_url_method = new \ReflectionMethod($web_test, 'getAbsoluteUrl');
+    $get_absolute_url_method->setAccessible(TRUE);
+
+    $this->assertSame($expected_absolute_path, $get_absolute_url_method->invoke($web_test, $href));
+    unset($GLOBALS['base_url'], $GLOBALS['base_path']);
+  }
+
+  /**
+   * Provides test data for testGetAbsoluteUrl.
+   *
+   * @return array
+   */
+  public function providerTestGetAbsoluteUrl() {
+    $data = [];
+    $data['host'] = ['http://example.com/drupal/test-example', 'http://example.com/drupal/test-example'];
+    $data['path'] = ['/drupal/test-example', 'http://example.com/drupal/test-example'];
+    $data['path-with-query'] = ['/drupal/test-example?foo=bar', 'http://example.com/drupal/test-example?foo=bar'];
+    $data['just-query'] = ['?foo=bar', 'http://example.com/drupal/current-path?foo=bar'];
+
+    return $data;
+  }
+
+}