Thomas Bruederli
2015-05-12 0d4d43375c114075ab4315824b7bd276be45ec44
tests/Selenium/bootstrap.php
@@ -54,35 +54,39 @@
 */
class bootstrap
{
    static $imap_ready = null;
    /**
     * Wipe and re-initialize (mysql) database
     */
    public static function init_db()
    {
        $rcmail = rcmail::get_instance();
        $dsn = rcube_db::parse_dsn($rcmail->config->get('db_dsnw'));
        // 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");
        }
        if ($dsn['phptype'] == 'mysql' || $dsn['phptype'] == 'mysqli') {
            // 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') {
            // init database with schema
            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)
                escapeshellarg($dsn['database'])
            ));
        }
        else if ($dsn['phptype'] == 'sqlite') {
            // delete database file -- will be re-initialized on first access
            system(sprintf('rm -f %s', escapeshellarg($dsn['database'])));
        }
    }
@@ -91,8 +95,12 @@
     */
    public static function init_imap()
    {
        if (!TESTS_USER)
        if (!TESTS_USER) {
            return false;
        }
        else if (self::$imap_ready !== null) {
            return self::$imap_ready;
        }
        $rcmail = rcmail::get_instance();
        $imap = $rcmail->get_storage();
@@ -110,27 +118,62 @@
        }
        if (!$imap->connect($imap_host, TESTS_USER, TESTS_PASS, $imap_port, $imap_ssl)) {
            self::$imap_ready = false;
            die("IMAP error: unable to authenticate with user " . TESTS_USER);
        }
        // create Archive mailbox
        self::$imap_ready = true;
        self::purge_mailbox('INBOX');
        self::ensure_mailbox('Archive', true);
        return self::$imap_ready;
    }
    /**
     * Import the given file into IMAP
     */
    public static function import_message($filename, $mailbox = 'INBOX')
    {
        if (!self::init_imap()) {
            die(__METHOD__ . ': IMAP connection unavailable');
        }
        $imap = rcmail::get_instance()->get_storage();
        $imap->save_message($mailbox, file_get_contents($filename));
    }
    /**
     * Delete all messages from the given mailbox
     */
    public static function purge_mailbox($mailbox)
    {
        if (!self::init_imap()) {
            die(__METHOD__ . ': IMAP connection unavailable');
        }
        $imap = rcmail::get_instance()->get_storage();
        $imap->delete_message('*', $mailbox);
    }
    /**
     * Make sure the given mailbox exists in IMAP
     */
    public static function ensure_mailbox($mailbox, $empty = false)
    {
        if (!self::init_imap()) {
            die(__METHOD__ . ': IMAP connection unavailable');
        }
        $imap = rcmail::get_instance()->get_storage();
        $folders = $imap->list_folders();
        if (!in_array('Archive', $folders)) {
            $imap->create_folder('Archive', true);
        if (!in_array($mailbox, $folders)) {
            $imap->create_folder($mailbox, true);
        }
        else {
            $imap->delete_message('*', 'Archive');
        else if ($empty) {
            $imap->delete_message('*', $mailbox);
        }
        // empty Inbox
        $imap->delete_message('*', 'INBOX');
        // import email messages
        foreach (glob(TESTS_DIR . 'Selenium/data/mail/*.eml') as $f) {
            $imap->save_message('INBOX', file_get_contents($f));
        }
        $imap->close();
    }
}