Mercurial > hg > isophonics-drupal-site
diff vendor/instaclick/php-webdriver/test/Test/WebDriver/WebDriverTest.php @ 14:1fec387a4317
Update Drupal core to 8.5.2 via Composer
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:46:53 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/instaclick/php-webdriver/test/Test/WebDriver/WebDriverTest.php Mon Apr 23 09:46:53 2018 +0100 @@ -0,0 +1,267 @@ +<?php +/** + * Copyright 2014-2017 Anthon Pang. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @package WebDriver + * + * @author Anthon Pang <apang@softwaredevelopment.ca> + * @author Damian Mooyman <damian@silverstripe.com> + */ + +namespace Test\WebDriver; + +use WebDriver\ServiceFactory; +use WebDriver\WebDriver; + +/** + * Test WebDriver\WebDriver class + * + * @package WebDriver + * + * @group Functional + */ +class WebDriverTest extends \PHPUnit_Framework_TestCase +{ + private $driver; + private $session; + private $testDocumentRootUrl = 'http://localhost'; + private $testSeleniumRootUrl = 'http://localhost:4444/wd/hub'; + + /** + * {@inheritdoc} + */ + protected function setUp() + { + ServiceFactory::getInstance()->setServiceClass('service.curl', '\\WebDriver\\Service\\CurlService'); + + if ($url = getenv('ROOT_URL')) { + $this->testDocumentRootUrl = $url; + } + + if ($url = getenv('SELENIUM_URL')) { + $this->testSeleniumRootUrl = $url; + } + + $this->driver = new WebDriver($this->getTestSeleniumRootUrl()); + $this->session = null; + } + + /** + * {@inheritdoc} + */ + protected function tearDown() + { + if ($this->session) { + $this->session->close(); + } + } + + /** + * Returns the full url to the test site (corresponding to the root dir of the library). + * You can set this via env var ROOT_URL + * + * @return string + */ + protected function getTestDocumentRootUrl() + { + return $this->testDocumentRootUrl; + } + + /** + * Returns the full url to the Selenium server used for functional tests + * + * @return string + * + * @todo make this configurable via env var + */ + protected function getTestSeleniumRootUrl() + { + return $this->testSeleniumRootUrl; + } + + /** + * Is Selenium down? + * + * @param \Exception $exception + * + * @return boolean + */ + protected function isSeleniumDown($exception) + { + return preg_match('/Failed to connect to .* Connection refused/', $exception->getMessage()) != false + || strpos($exception->getMessage(), 'couldn\'t connect to host') !== false + || strpos($exception->getMessage(), 'Unable to connect to host') !== false; + } + + /** + * Test driver sessions + */ + public function testSessions() + { + try { + $this->assertCount(0, $this->driver->sessions()); + + $this->session = $this->driver->session(); + } catch (\Exception $e) { + if ($this->isSeleniumDown($e)) { + $this->markTestSkipped('selenium server not running'); + + return; + } + + throw $e; + } + + $this->assertCount(1, $this->driver->sessions()); + $this->assertEquals($this->getTestSeleniumRootUrl(), $this->driver->getUrl()); + } + + /** + * Test driver status + */ + public function testStatus() + { + try { + $status = $this->driver->status(); + } catch (\Exception $e) { + if ($this->isSeleniumDown($e)) { + $this->markTestSkipped('selenium server not running'); + + return; + } + + throw $e; + } + + $this->assertCount(3, $status); + $this->assertTrue(isset($status['java'])); + $this->assertTrue(isset($status['os'])); + $this->assertTrue(isset($status['build'])); + } + + /** + * Checks that an error connecting to Selenium gives back the expected exception + */ + public function testSeleniumError() + { + try { + $this->driver = new WebDriver($this->getTestSeleniumRootUrl() . '/../invalidurl'); + + $status = $this->driver->status(); + + $this->fail('Exception not thrown while connecting to invalid Selenium url'); + } catch (\Exception $e) { + if ($this->isSeleniumDown($e)) { + $this->markTestSkipped('selenium server not running'); + + return; + } + + $this->assertEquals('WebDriver\Exception\CurlExec', get_class($e)); + } + } + + /** + * Checks that a successful command to Selenium which returns an http error response gives back the expected exception + */ + public function testSeleniumErrorResponse() + { + try { + $status = $this->driver->status(); + } catch (\Exception $e) { + if ($this->isSeleniumDown($e)) { + $this->markTestSkipped('selenium server not running'); + + return; + } + + throw $e; + } + + try { + $this->session = $this->driver->session(); + $this->session->open($this->getTestDocumentRootUrl().'/test/Assets/index.html'); + + $element = $this->session->element('id', 'a-quite-unlikely-html-element-id'); + + $this->fail('Exception not thrown while looking for missing element in page'); + } catch (\Exception $e) { + $this->assertEquals('WebDriver\Exception\NoSuchElement', get_class($e)); + } + } + + /** + * Checks that a successful command to Selenium which returns 'nothing' according to spec does not raise an error + */ + public function testSeleniumNoResponse() + { + try { + $status = $this->driver->status(); + } catch (\Exception $e) { + if ($this->isSeleniumDown($e)) { + $this->markTestSkipped('selenium server not running'); + + return; + } + + throw $e; + } + + $this->session = $this->driver->session(); + $timeouts = $this->session->timeouts(); + $out = $timeouts->async_script(array('type' => 'implicit', 'ms' => 1000)); + + $this->assertEquals(null, $out); + } + + /** + * Assert that empty response does not trigger exception, but invalid JSON does + */ + public function testNonJsonResponse() + { + $mockCurlService = $this->createMock('WebDriver\Service\CurlService'); + $mockCurlService->expects($this->once()) + ->method('execute') + ->will($this->returnCallback(function ($requestMethod, $url) { + $info = array( + 'url' => $url, + 'request_method' => $requestMethod, + 'http_code' => 200, + ); + + $result = preg_match('#.*session$#', $url) + ? $result = 'some invalid json' + : $result = ''; + + return array($result, $info); + })); + + ServiceFactory::getInstance()->setService('service.curl', $mockCurlService); + + $result = $this->driver->status(); + + $this->assertNull($result); + + // Test /session should error + $this->setExpectedException( + 'WebDriver\Exception\CurlExec', + 'Payload received from webdriver is not valid json: some invalid json' + ); + + $result = $this->driver->session(); + + $this->assertNull($result); + } +}