Skip to content

Commit

Permalink
Dev: Fixes to installation test
Browse files Browse the repository at this point in the history
  • Loading branch information
olleharstedt committed Dec 21, 2017
1 parent 782839a commit 5bcbccd
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 88 deletions.
27 changes: 2 additions & 25 deletions tests/TestBaseClassWeb.php
Expand Up @@ -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.
Expand Down
43 changes: 42 additions & 1 deletion tests/TestHelper.php
Expand Up @@ -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
{
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
}
154 changes: 92 additions & 62 deletions tests/controllers/InstallationControllerTest.php
Expand Up @@ -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();
}

/**
Expand Down Expand Up @@ -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)
);
}
}
}

0 comments on commit 5bcbccd

Please sign in to comment.