From d220ebd708a6893fdb68b8548a30990d99ca1c02 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Mon, 21 Apr 2014 12:06:51 -0400
Subject: [PATCH] Describe Selenium testing setup and provide a function to clear the SQL database

---
 tests/Selenium/bootstrap.php  |   61 ++++++++++++++++++--
 tests/Selenium/README.md      |   49 ++++++++++++++++
 index-test.php                |   27 +++++++++
 tests/Selenium/data/mysql.sql |    1 
 tests/Selenium/Login.php      |    6 ++
 5 files changed, 138 insertions(+), 6 deletions(-)

diff --git a/index-test.php b/index-test.php
new file mode 100644
index 0000000..b880f7c
--- /dev/null
+++ b/index-test.php
@@ -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';
+
diff --git a/tests/Selenium/Login.php b/tests/Selenium/Login.php
index a3f0ab6..65b0828 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 0000000..5610fae
--- /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'] = '<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/
diff --git a/tests/Selenium/bootstrap.php b/tests/Selenium/bootstrap.php
index e8b186a..ed9c2eb 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 @@
     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);
diff --git a/tests/Selenium/data/mysql.sql b/tests/Selenium/data/mysql.sql
new file mode 100644
index 0000000..fe6741a
--- /dev/null
+++ b/tests/Selenium/data/mysql.sql
@@ -0,0 +1 @@
+-- empty
\ No newline at end of file

--
Gitblit v1.9.1