diff --git a/index-test.php b/index-test.php new file mode 100644 index 000000000..b880f7c1f --- /dev/null +++ b/index-test.php @@ -0,0 +1,27 @@ + | + +-----------------------------------------------------------------------+ +*/ + +define('INSTALL_PATH', realpath(__DIR__) . '/'); + +$GLOBALS['env'] = 'test'; + +// include index.php from application root directory +include INSTALL_PATH . 'index.php'; + diff --git a/tests/Selenium/Login.php b/tests/Selenium/Login.php index a3f0ab6b4..65b082851 100644 --- a/tests/Selenium/Login.php +++ b/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 diff --git a/tests/Selenium/README.md b/tests/Selenium/README.md new file mode 100644 index 000000000..5610fae71 --- /dev/null +++ b/tests/Selenium/README.md @@ -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'] = ''; + $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 /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/ diff --git a/tests/Selenium/bootstrap.php b/tests/Selenium/bootstrap.php index e8b186a1e..ed9c2eb32 100644 --- a/tests/Selenium/bootstrap.php +++ b/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 @@ if (set_include_path($include_path) === false) { 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 @@ define('TESTS_SLEEP', $rcmail->config->get('tests_sleep', 5)); 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 @@ class Selenium_Test extends PHPUnit_Extensions_Selenium2TestCase { 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 @@ class Selenium_Test extends PHPUnit_Extensions_Selenium2TestCase 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); diff --git a/tests/Selenium/data/mysql.sql b/tests/Selenium/data/mysql.sql new file mode 100644 index 000000000..fe6741a02 --- /dev/null +++ b/tests/Selenium/data/mysql.sql @@ -0,0 +1 @@ +-- empty \ No newline at end of file