Upgraded drupal core with security updates
[yaffs-website] / web / core / modules / simpletest / tests / src / Unit / WebTestBaseTest.php
1 <?php
2
3 namespace Drupal\Tests\simpletest\Unit;
4
5 use Drupal\Tests\UnitTestCase;
6
7 /**
8  * @requires extension curl
9  * @coversDefaultClass \Drupal\simpletest\WebTestBase
10  * @group simpletest
11  */
12 class WebTestBaseTest extends UnitTestCase {
13
14   /**
15    * Provides data for testing the assertFieldByName() helper.
16    *
17    * @return array
18    *   An array of values passed to the test method.
19    */
20   public function providerAssertFieldByName() {
21     $data = [];
22     $data[] = ['select_2nd_selected', 'test', '1', FALSE];
23     $data[] = ['select_2nd_selected', 'test', '2', TRUE];
24     $data[] = ['select_none_selected', 'test', '', FALSE];
25     $data[] = ['select_none_selected', 'test', '1', TRUE];
26     $data[] = ['select_none_selected', 'test', NULL, TRUE];
27
28     return $data;
29   }
30
31   /**
32    * Tests the assertFieldByName() helper.
33    *
34    * @param string $filename
35    *   Name of file containing the output to test.
36    * @param string $name
37    *   Name of field to assert.
38    * @param string $value
39    *   Value of the field to assert.
40    * @param bool $expected
41    *   The expected result of the assert.
42    *
43    * @see \Drupal\simpletest\WebTestBase::assertFieldByName()
44    *
45    * @dataProvider providerAssertFieldByName
46    * @covers ::assertFieldByName
47    */
48   public function testAssertFieldByName($filename, $name, $value, $expected) {
49     $content = file_get_contents(__DIR__ . '/../../fixtures/' . $filename . '.html');
50
51     $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
52       ->disableOriginalConstructor()
53       ->setMethods(['getRawContent', 'assertTrue', 'pass'])
54       ->getMock();
55
56     $web_test->expects($this->any())
57       ->method('getRawContent')
58       ->will($this->returnValue($content));
59
60     $web_test->expects($this->once())
61       ->method('assertTrue')
62       ->with($this->identicalTo($expected),
63              $this->identicalTo('message'),
64              $this->identicalTo('Browser'));
65
66     $test_method = new \ReflectionMethod('Drupal\simpletest\WebTestBase', 'assertFieldByName');
67     $test_method->setAccessible(TRUE);
68     $test_method->invokeArgs($web_test, [$name, $value, 'message']);
69   }
70
71   /**
72    * Data provider for testClickLink().
73    *
74    * In the test method, we mock drupalGet() to return a known string:
75    * 'This Text Returned By drupalGet()'. Since clickLink() can only return
76    * either the value of drupalGet() or FALSE, our expected return value is the
77    * same as this mocked return value when we expect a link to be found.
78    *
79    * @see https://www.drupal.org/node/1452896
80    *
81    * @return array
82    *   Array of arrays of test data. Test data is structured as follows:
83    *   - Expected return value of clickLink().
84    *   - Parameter $label to clickLink().
85    *   - Parameter $index to clickLink().
86    *   - Test data to be returned by mocked xpath(). Return an empty array here
87    *     to mock no link found on the page.
88    */
89   public function providerTestClickLink() {
90     return [
91       // Test for a non-existent label.
92       [
93         FALSE,
94         'does_not_exist',
95         0,
96         [],
97       ],
98       // Test for an existing label.
99       [
100         'This Text Returned By drupalGet()',
101         'exists',
102         0,
103         [0 => ['href' => 'this_is_a_url']],
104       ],
105       // Test for an existing label that isn't the first one.
106       [
107         'This Text Returned By drupalGet()',
108         'exists',
109         1,
110         [
111           0 => ['href' => 'this_is_a_url'],
112           1 => ['href' => 'this_is_another_url'],
113         ],
114       ],
115     ];
116   }
117
118   /**
119    * Test WebTestBase::clickLink().
120    *
121    * @param mixed $expected
122    *   Expected return value of clickLink().
123    * @param string $label
124    *   Parameter $label to clickLink().
125    * @param int $index
126    *   Parameter $index to clickLink().
127    * @param array $xpath_data
128    *   Test data to be returned by mocked xpath().
129    *
130    * @dataProvider providerTestClickLink
131    * @covers ::clickLink
132    */
133   public function testClickLink($expected, $label, $index, $xpath_data) {
134     // Mock a WebTestBase object and some of its methods.
135     $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
136       ->disableOriginalConstructor()
137       ->setMethods([
138         'pass',
139         'fail',
140         'getUrl',
141         'xpath',
142         'drupalGet',
143         'getAbsoluteUrl',
144       ])
145       ->getMock();
146
147     // Mocked getUrl() is only used for reporting so we just return a string.
148     $web_test->expects($this->any())
149       ->method('getUrl')
150       ->will($this->returnValue('url_before'));
151
152     // Mocked xpath() should return our test data.
153     $web_test->expects($this->any())
154       ->method('xpath')
155       ->will($this->returnValue($xpath_data));
156
157     if ($expected === FALSE) {
158       // If link does not exist clickLink() will not try to do a drupalGet() or
159       // a getAbsoluteUrl()
160       $web_test->expects($this->never())
161         ->method('drupalGet');
162       $web_test->expects($this->never())
163         ->method('getAbsoluteUrl');
164       // The test should fail and not pass.
165       $web_test->expects($this->never())
166         ->method('pass');
167       $web_test->expects($this->once())
168         ->method('fail')
169         ->will($this->returnValue(NULL));
170     }
171     else {
172       // Mocked getAbsoluteUrl() should return whatever comes in.
173       $web_test->expects($this->once())
174         ->method('getAbsoluteUrl')
175         ->with($xpath_data[$index]['href'])
176         ->will($this->returnArgument(0));
177       // We're only testing clickLink(), so drupalGet() always returns a string.
178       $web_test->expects($this->once())
179         ->method('drupalGet')
180         ->with($xpath_data[$index]['href'])
181         ->will($this->returnValue('This Text Returned By drupalGet()'));
182       // The test should pass and not fail.
183       $web_test->expects($this->never())
184         ->method('fail');
185       $web_test->expects($this->once())
186         ->method('pass')
187         ->will($this->returnValue(NULL));
188     }
189
190     // Set the clickLink() method to public so we can test it.
191     $clicklink_method = new \ReflectionMethod($web_test, 'clickLink');
192     $clicklink_method->setAccessible(TRUE);
193
194     $this->assertSame($expected, $clicklink_method->invoke($web_test, $label, $index));
195   }
196
197   /**
198    * @dataProvider providerTestGetAbsoluteUrl
199    */
200   public function testGetAbsoluteUrl($href, $expected_absolute_path) {
201     $web_test = $this->getMockBuilder('Drupal\simpletest\WebTestBase')
202       ->disableOriginalConstructor()
203       ->setMethods(['getUrl'])
204       ->getMock();
205
206     $web_test->expects($this->any())
207       ->method('getUrl')
208       ->willReturn('http://example.com/drupal/current-path?foo=baz');
209
210     $GLOBALS['base_url'] = 'http://example.com';
211     $GLOBALS['base_path'] = 'drupal';
212
213     $get_absolute_url_method = new \ReflectionMethod($web_test, 'getAbsoluteUrl');
214     $get_absolute_url_method->setAccessible(TRUE);
215
216     $this->assertSame($expected_absolute_path, $get_absolute_url_method->invoke($web_test, $href));
217     unset($GLOBALS['base_url'], $GLOBALS['base_path']);
218   }
219
220   /**
221    * Provides test data for testGetAbsoluteUrl.
222    *
223    * @return array
224    */
225   public function providerTestGetAbsoluteUrl() {
226     $data = [];
227     $data['host'] = ['http://example.com/drupal/test-example', 'http://example.com/drupal/test-example'];
228     $data['path'] = ['/drupal/test-example', 'http://example.com/drupal/test-example'];
229     $data['path-with-query'] = ['/drupal/test-example?foo=bar', 'http://example.com/drupal/test-example?foo=bar'];
230     $data['just-query'] = ['?foo=bar', 'http://example.com/drupal/current-path?foo=bar'];
231
232     return $data;
233   }
234
235 }