diff --git a/tests/TestBaseClassWeb.php b/tests/TestBaseClassWeb.php index d5a1bab3927..b5fa5e0333e 100644 --- a/tests/TestBaseClassWeb.php +++ b/tests/TestBaseClassWeb.php @@ -60,33 +60,10 @@ public static function setUpBeforeClass() self::$domain = getenv('DOMAIN'); - // NB: Travis might be slow, better try more than once to connect. - $tries = 0; - $success = false; - do { - try { - $host = 'http://localhost:4444/wd/hub'; // this is the default - $capabilities = DesiredCapabilities::firefox(); - $profile = new FirefoxProfile(); - $profile->setPreference(FirefoxPreferences::READER_PARSE_ON_LOAD_ENABLED, false); - // Open target="_blank" in new tab. - $profile->setPreference('browser.link.open_newwindow', 3); - $capabilities->setCapability(FirefoxDriver::PROFILE, $profile); - self::$webDriver = RemoteWebDriver::create($host, $capabilities, 5000); - $success = true; - } catch (WebDriverCurlException $ex) { - $tries++; - sleep(1); - } - } while (!$success && $tries < 5); + self::$webDriver = self::$testHelper->getWebDriver(); if (empty(self::$webDriver)) { - throw new \Exception( - sprintf( - 'Could not connect to remote web driver, tried %d times.', - $tries - ) - ); + throw new \Exception('Could not connect to remote web driver'); } // Implicit timout so we don't have to wait manually. diff --git a/tests/TestHelper.php b/tests/TestHelper.php index bf5983eee0d..140e05ce0f1 100644 --- a/tests/TestHelper.php +++ b/tests/TestHelper.php @@ -3,7 +3,19 @@ namespace ls\tests; use PHPUnit\Framework\TestCase; +use Facebook\WebDriver\Remote\DesiredCapabilities; +use Facebook\WebDriver\Remote\RemoteWebDriver; +use Facebook\WebDriver\WebDriver; +use Facebook\WebDriver\WebDriverBy; +use Facebook\WebDriver\WebDriverExpectedCondition; +use Facebook\WebDriver\Chrome\ChromeDriver; +use Facebook\WebDriver\Chrome\ChromeOptions; +use Facebook\WebDriver\Firefox\FirefoxDriver; +use Facebook\WebDriver\Firefox\FirefoxProfile; +use Facebook\WebDriver\Firefox\FirefoxPreferences; +use Facebook\WebDriver\Exception\WebDriverCurlException; use Facebook\WebDriver\Exception\NoSuchDriverException; +use Facebook\WebDriver\Exception\TimeOutException; class TestHelper extends TestCase { @@ -311,7 +323,7 @@ public function takeScreenshot($webDriver, $name) $folder = $tempFolder.'/screenshots/'; try { $screenshot = $webDriver->takeScreenshot(); - $filename = $folder . $name . date('YmdHis') . '.png'; + $filename = $folder . $name . '_' . date('Ymd_His') . '.png'; $result = file_put_contents($filename, $screenshot); $this->assertTrue($result > 0, 'Could not write screenshot to file ' . $filename); } catch (NoSuchDriverException $ex) { @@ -373,4 +385,33 @@ public function javaTrace($ex, $seen = null) return $result; } + + /** + * @return WebDriver|null + */ + public function getWebDriver() + { + // NB: Travis might be slow, better try more than once to connect. + $tries = 0; + $success = false; + $webDriver = null; + do { + try { + $host = 'http://localhost:4444/wd/hub'; // this is the default + $capabilities = DesiredCapabilities::firefox(); + $profile = new FirefoxProfile(); + $profile->setPreference(FirefoxPreferences::READER_PARSE_ON_LOAD_ENABLED, false); + // Open target="_blank" in new tab. + $profile->setPreference('browser.link.open_newwindow', 3); + $capabilities->setCapability(FirefoxDriver::PROFILE, $profile); + $webDriver = RemoteWebDriver::create($host, $capabilities, 5000); + $success = true; + } catch (WebDriverCurlException $ex) { + $tries++; + sleep(1); + } + } while (!$success && $tries < 5); + + return $webDriver; + } } diff --git a/tests/controllers/InstallationControllerTest.php b/tests/controllers/InstallationControllerTest.php index aa624095cbb..253fdd6798e 100644 --- a/tests/controllers/InstallationControllerTest.php +++ b/tests/controllers/InstallationControllerTest.php @@ -22,7 +22,17 @@ class InstallationControllerTest extends TestBaseClassWeb */ public static function setupBeforeClass() { - parent::setUpBeforeClass(); + // NB: Does not call parent, because there might not + // be a database (happens if this test is run multiple + // times). + self::$testHelper = new TestHelper(); + self::$webDriver = self::$testHelper->getWebDriver(); + self::$domain = getenv('DOMAIN'); + } + + public static function teardownAfterClass() + { + self::$testHelper->connectToOriginalDatabase(); } /** @@ -77,66 +87,86 @@ public function testBasic() $urlMan->setBaseUrl('http://' . self::$domain . '/index.php'); $url = $urlMan->createUrl(''); - // Installer start page. - self::$webDriver->get($url); - - // Click "Start installation". - $start = self::$webDriver->findElement(WebDriverBy::id('ls-start-installation')); - $start->click(); - - // Accept license. - $accept = self::$webDriver->findElement(WebDriverBy::id('ls-accept-license')); - $accept->click(); - - // Click next at pre-check. - $next = self::$webDriver->findElement(WebDriverBy::id('ls-next')); - $next->click(); - - // Fill in database form. - $dbuserInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbuser]"]')); - $dbpwdInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbpwd]"]')); - $dbnameInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbname]"]')); - $dbuserInput->clear()->sendKeys($dbuser); - $dbpwdInput->clear()->sendKeys($dbpwd); - $dbnameInput->sendKeys($databaseName); - - // Click next. - $next = self::$webDriver->findElement(WebDriverBy::id('ls-next')); - $next->click(); - - // Click "Create database". - $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); - $button->click(); - - // Click "Populate". - $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); - $button->click(); - - // Fill in admin username/password. - $adminLoginName = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[adminLoginName]"]')); - $adminLoginPwd = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[adminLoginPwd]"]')); - $confirmPwd = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[confirmPwd]"]')); - $adminLoginName->clear()->sendKeys($username); - $adminLoginPwd->clear()->sendKeys($password); - $confirmPwd->clear()->sendKeys($password); - - // Confirm optional settings (admin password etc). - $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); - $button->click(); - - // Go to administration. - $button = self::$webDriver->findElement(WebDriverBy::id('ls-administration')); - $button->click(); - - // Reset urlManager to adapt to latest config. - $configFile = \Yii::app()->getBasePath() . '/config/config.php'; - $config = require($configFile); - $urlMan = \Yii::app()->urlManager; - $urlMan->setUrlFormat($config['components']['urlManager']['urlFormat']); - - // Login. - self::adminLogin($username, $password); - - self::$testHelper->connectToOriginalDatabase(); + try { + + // Installer start page. + self::$webDriver->get($url); + + // Click "Start installation". + $start = self::$webDriver->findElement(WebDriverBy::id('ls-start-installation')); + $start->click(); + + // Accept license. + $accept = self::$webDriver->findElement(WebDriverBy::id('ls-accept-license')); + $accept->click(); + + // Click next at pre-check. + $next = self::$webDriver->findElement(WebDriverBy::id('ls-next')); + $next->click(); + + // Fill in database form. + $dbuserInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbuser]"]')); + $dbpwdInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbpwd]"]')); + $dbnameInput = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[dbname]"]')); + $dbuserInput->clear()->sendKeys($dbuser); + $dbpwdInput->clear()->sendKeys($dbpwd); + $dbnameInput->sendKeys($databaseName); + + // Click next. + $next = self::$webDriver->findElement(WebDriverBy::id('ls-next')); + $next->click(); + + // Click "Create database". + $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); + $button->click(); + + // Click "Populate". + $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); + $button->click(); + + // Fill in admin username/password. + $adminLoginName = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[adminLoginName]"]')); + $adminLoginPwd = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[adminLoginPwd]"]')); + $confirmPwd = self::$webDriver->findElement(WebDriverBy::cssSelector('input[name="InstallerConfigForm[confirmPwd]"]')); + $adminLoginName->clear()->sendKeys($username); + $adminLoginPwd->clear()->sendKeys($password); + $confirmPwd->clear()->sendKeys($password); + + // Confirm optional settings (admin password etc). + $button = self::$webDriver->findElement(WebDriverBy::cssSelector('input[type="submit"]')); + $button->click(); + + // Go to administration. + $button = self::$webDriver->findElement(WebDriverBy::id('ls-administration')); + $button->click(); + + // Set debug=2 + /* TODO: Can't write to config.php after installation. + $configFile = \Yii::app()->getBasePath() . '/config/config.php'; + $data = file($configFile); + $data = array_map(function($data) { + return stristr($data, "'debug'=>0") ? "'debug'=>2," : $data; + }, $data); + $output = []; + exec('chmod 777 ' . $configFile, $output); + var_dump($output); + $result = file_put_contents($configFile, implode('', $data)); + $this->assertTrue($result > 0, 'Wrote config'); + */ + + // Reset urlManager to adapt to latest config. + $config = require($configFile); + $urlMan = \Yii::app()->urlManager; + $urlMan->setUrlFormat($config['components']['urlManager']['urlFormat']); + + // Login. + self::adminLogin($username, $password); + } catch (NoSuchElementException $ex) { + self::$testHelper->takeScreenshot(self::$webDriver, (new \ReflectionClass($this))->getShortName() . '_' . __FUNCTION__); + $this->assertFalse( + true, + self::$testHelper->javaTrace($ex) + ); + } } }