Thomas Bruederli
2014-04-21 d220ebd708a6893fdb68b8548a30990d99ca1c02
Describe Selenium testing setup and provide a function to clear the SQL database
3 files added
2 files modified
144 ■■■■■ changed files
index-test.php 27 ●●●●● patch | view | raw | blame | history
tests/Selenium/Login.php 6 ●●●●● patch | view | raw | blame | history
tests/Selenium/README.md 49 ●●●●● patch | view | raw | blame | history
tests/Selenium/bootstrap.php 61 ●●●●● patch | view | raw | blame | history
tests/Selenium/data/mysql.sql 1 ●●●● patch | view | raw | blame | history
index-test.php
New file
@@ -0,0 +1,27 @@
<?php
/*
 +-----------------------------------------------------------------------+
 | Roundcube Webmail Selenium Tests Entry Point                          |
 |                                                                       |
 | Copyright (C) 2005-2014, The Roundcube Dev Team                       |
 |                                                                       |
 | Licensed under the GNU General Public License version 3 or            |
 | any later version with exceptions for skins & plugins.                |
 | See the README file for a full license statement.                     |
 |                                                                       |
 | PURPOSE:                                                              |
 |   This is the public entry point for all HTTP requests to the         |
 |   Roundcube webmail application loading the 'tests' environment.      |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <thomas@roundcube.net>                       |
 +-----------------------------------------------------------------------+
*/
define('INSTALL_PATH', realpath(__DIR__) . '/');
$GLOBALS['env'] = 'test';
// include index.php from application root directory
include INSTALL_PATH . 'index.php';
tests/Selenium/Login.php
@@ -2,6 +2,12 @@
class Selenium_Login extends Selenium_Test
{
    protected function setUp()
    {
        bootstrap::init_db();
        parent::setUp();
    }
    public function testLogin()
    {
        // first test, we're already on the login page
tests/Selenium/README.md
New file
@@ -0,0 +1,49 @@
Running Selenium Tests
======================
In order to run the Selenium-based web tests, some configuration for the
Roundcube test instance need to be created. Along with the default config for a
given Roundcube instance, you should provide a config specifically for running
tests. To do so, create a config file named `config-test.inc.php` in the
regular Roundcube config dir. That should provide specific `db_dsnw` and
`default_host` values for testing purposes as well as the credentials of a
valid IMAP user account used for running the tests with.
Add these config options used by the Selenium tests:
```php
  // Unit tests settings
  $config['tests_username'] = 'roundcube.test@example.org';
  $config['tests_password'] = '<test-account-password>';
  $config['tests_url'] = 'http://localhost/roundcube/index-test.php';
```
The `tests_url` should point to Roundcube's index-test.php file accessible by
the Selenium web browser.
WARNING
-------
Please note that the configured IMAP account as well as the Roundcube database
configred in `db_dsnw` will be wiped and filled with test data in every test
run. Under no circumstances you should use credentials of a production database
or email account!
Run the tests
-------------
First you need to start a Selenium server. We recommend to use the
[Selenium Standalone Server][selenium-server] but the tests will also run on a
Selenium  Grid. The tests are based in [PHPUnit_Selenium][phpunit] which can be
installed through [PEAR][pear-phpunit].
To start the test suite call `phpunit` from the Selenium directory:
```
  cd <roundcube-dir>/tests/Selenium
  phpunit
```
[phpunit]: http://phpunit.de/manual/4.0/en/selenium.html
[pear-phpunit]: http://pear.phpunit.de/
[selenium-server]: http://docs.seleniumhq.org/download/
tests/Selenium/bootstrap.php
@@ -5,7 +5,7 @@
 | tests/Selenium/bootstrap.php                                          |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2009-2013, The Roundcube Dev Team                       |
 | Copyright (C) 2009-2014, The Roundcube Dev Team                       |
 |                                                                       |
 | Licensed under the GNU General Public License version 3 or            |
 | any later version with exceptions for skins & plugins.                |
@@ -38,7 +38,7 @@
    die("Fatal error: ini_set/set_include_path does not work.");
}
$rcmail = rcube::get_instance('test');
$rcmail = rcmail::get_instance('test');
define('TESTS_URL',     $rcmail->config->get('tests_url'));
define('TESTS_BROWSER', $rcmail->config->get('tests_browser', 'firefox'));
@@ -48,7 +48,56 @@
PHPUnit_Extensions_Selenium2TestCase::shareSession(true);
// @TODO: remove user record from DB before running tests
/**
 * satisfy PHPUnit
 */
class bootstrap
{
    /**
     * Wipe and re-initialize (mysql) database
     */
    public static function init_db()
    {
        $rcmail = rcmail::get_instance();
        // drop all existing tables first
        $db = $rcmail->get_dbh();
        $db->query("SET FOREIGN_KEY_CHECKS=0");
        $sql_res = $db->query("SHOW TABLES");
        while ($sql_arr = $db->fetch_array($sql_res)) {
            $table = reset($sql_arr);
            $db->query("DROP TABLE $table");
        }
        // init database with schema
        $dsn = parse_url($rcmail->config->get('db_dsnw'));
        $db_name = trim($dsn['path'], '/');
        if ($dsn['scheme'] == 'mysql' || $dsn['scheme'] == 'mysqli') {
            system(sprintf('cat %s %s | mysql -h %s -u %s --password=%s %s',
                realpath(INSTALL_PATH . '/SQL/mysql.initial.sql'),
                realpath(TESTS_DIR . '/Selenium/data/mysql.sql'),
                escapeshellarg($dsn['host']),
                escapeshellarg($dsn['user']),
                escapeshellarg($dsn['pass']),
                escapeshellarg($db_name)
            ));
        }
    }
    /**
     * Wipe the configured IMAP account and fill with test data
     */
    public static function init_imap()
    {
        if (!TESTS_USER)
            return false;
        // TBD.
    }
}
// @TODO: make sure mailbox has some content (always the same) or is empty
// @TODO: plugins: enable all?
@@ -59,12 +108,12 @@
{
    protected function setUp()
    {
//        $this->rc = rcube::get_instance();
        $this->setBrowser(TESTS_BROWSER);
        // Set root to our index.html, for better performance
        // See https://github.com/sebastianbergmann/phpunit-selenium/issues/217
        $this->setBrowserUrl(TESTS_URL . '/tests/Selenium');
        $baseurl = preg_replace('!/index(-.+)?\.php^!', '', TESTS_URL);
        $this->setBrowserUrl($baseurl . '/tests/Selenium');
    }
    protected function login()
@@ -87,7 +136,7 @@
    protected function go($task = 'mail', $action = null)
    {
        $this->url(TESTS_URL . '/?_task=' . $task);
        $this->url(TESTS_URL . '?_task=' . $task);
        // wait for interface load (initial ajax requests, etc.)
        sleep(TESTS_SLEEP);
tests/Selenium/data/mysql.sql
New file
@@ -0,0 +1 @@
-- empty