Security update for permissions_by_term
[yaffs-website] / vendor / instaclick / php-webdriver / test / Test / WebDriver / WebDriverTest.php
diff --git a/vendor/instaclick/php-webdriver/test/Test/WebDriver/WebDriverTest.php b/vendor/instaclick/php-webdriver/test/Test/WebDriver/WebDriverTest.php
new file mode 100644 (file)
index 0000000..056b8e7
--- /dev/null
@@ -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);
+    }
+}