Mercurial > hg > isophonics-drupal-site
diff core/modules/simpletest/tests/src/Unit/WebTestBaseTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | af1871eacc83 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/simpletest/tests/src/Unit/WebTestBaseTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -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; + } + +}