Skip to content

Commit

Permalink
Populate IMAP test account with sample message and test its listing i…
Browse files Browse the repository at this point in the history
…n Selenium tests
  • Loading branch information
thomascube committed May 7, 2015
1 parent 585ee9e commit f7c5f44
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 15 deletions.
1 change: 1 addition & 0 deletions tests/Selenium/Login.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class Selenium_Login extends Selenium_Test
protected function setUp()
{
bootstrap::init_db();
bootstrap::init_imap();
parent::setUp();
}

Expand Down
16 changes: 14 additions & 2 deletions tests/Selenium/Mail/List.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

class Selenium_Mail_List extends Selenium_Test
{
public function testCheckRecent()
public function testList()
{
$this->go('mail');

Expand All @@ -13,13 +13,25 @@ public function testCheckRecent()
$this->assertRegExp('/this\.set_unread_count/', $res['exec']);
$this->assertRegExp('/this\.set_rowcount/', $res['exec']);
$this->assertRegExp('/this\.set_message_coltypes/', $res['exec']);
// $this->assertRegExp('/this\.add_message_row/', $res['exec']);

$this->assertContains('current_page', $res['env']);
$this->assertContains('exists', $res['env']);
$this->assertContains('pagecount', $res['env']);
$this->assertContains('pagesize', $res['env']);
$this->assertContains('messagecount', $res['env']);
$this->assertContains('mailbox', $res['env']);

$this->assertEquals($res['env']['mailbox'], 'INBOX');
$this->assertEquals($res['env']['messagecount'], 1);

// check message list
$row = $this->byCssSelector('.messagelist tbody tr:first-child');
$this->assertHasClass('unread', $row);

$subject = $this->byCssSelector('.messagelist tbody tr:first-child td.subject');
$this->assertEquals('Lines', $subject->text());

$icon = $this->byCssSelector('.messagelist tbody tr:first-child td.status span');
$this->assertHasClass('unread', $icon);
}
}
3 changes: 2 additions & 1 deletion tests/Selenium/Settings/About.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ class Selenium_Settings_About extends Selenium_Test
{
public function testAbout()
{
$this->url(TESTS_URL . '/?_task=settings&_action=about');
$this->url(TESTS_URL . '?_task=settings&_action=about');
sleep(TESTS_SLEEP);

// check task and action
$env = $this->get_env();
Expand Down
65 changes: 57 additions & 8 deletions tests/Selenium/bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

if (!defined('INSTALL_PATH')) define('INSTALL_PATH', realpath(__DIR__ . '/../../') . '/' );

define('TESTS_DIR', __DIR__ . '/');
define('TESTS_DIR', realpath(__DIR__ . '/../') . '/');

if (@is_dir(TESTS_DIR . 'config')) {
define('RCUBE_CONFIG_DIR', TESTS_DIR . 'config');
Expand Down Expand Up @@ -77,7 +77,7 @@ public static function init_db()
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'),
realpath(TESTS_DIR . 'Selenium/data/mysql.sql'),
escapeshellarg($dsn['host']),
escapeshellarg($dsn['user']),
escapeshellarg($dsn['pass']),
Expand All @@ -94,7 +94,43 @@ public static function init_imap()
if (!TESTS_USER)
return false;

// TBD.
$rcmail = rcmail::get_instance();
$imap = $rcmail->get_storage();

$imap_host = $rcmail->config->get('default_host');
$a_host = parse_url($args['host']);
if ($a_host['host']) {
$imap_host = $a_host['host'];
$imap_ssl = isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'));
$imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
}
else {
$imap_port = 143;
$imap_ssl = false;
}

if (!$imap->connect($imap_host, TESTS_USER, TESTS_PASS, $imap_port, $imap_ssl)) {
die("IMAP error: unable to authenticate with user " . TESTS_USER);
}

// create Archive mailbox
$folders = $imap->list_folders();
if (!in_array('Archive', $folders)) {
$imap->create_folder('Archive', true);
}
else {
$imap->delete_message('*', 'Archive');
}

// 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();
}
}

Expand All @@ -118,8 +154,11 @@ protected function setUp()

protected function login()
{
$this->go('mail');
$this->go('mail', null, true);
}

protected function do_login()
{
$user_input = $this->byCssSelector('form input[name="_user"]');
$pass_input = $this->byCssSelector('form input[name="_pass"]');
$submit = $this->byCssSelector('form input[type="submit"]');
Expand All @@ -134,24 +173,29 @@ protected function login()
sleep(TESTS_SLEEP);
}

protected function go($task = 'mail', $action = null)
protected function go($task = 'mail', $action = null, $login = true)
{
$this->url(TESTS_URL . '?_task=' . $task);

// wait for interface load (initial ajax requests, etc.)
sleep(TESTS_SLEEP);

// check if we have a valid session
$env = $this->get_env();
if ($login && $env['task'] == 'login') {
$this->do_login();
}

if ($action) {
$this->click_button($action);

sleep(TESTS_SLEEP);
}
}

protected function get_env()
{
return $this->execute(array(
'script' => 'return rcmail.env;',
'script' => 'return window.rcmail ? rcmail.env : {};',
'args' => array(),
));
}
Expand Down Expand Up @@ -225,10 +269,15 @@ function test_ajax_response(response)

// get response
$response = $this->execute(array(
'script' => "return window.test_ajax_response_object['$action'];",
'script' => "return window.test_ajax_response_object ? test_ajax_response_object['$action'] : {};",
'args' => array(),
));

return $response;
}

protected function assertHasClass($classname, $element)
{
$this->assertContains($classname, $element->attribute('class'));
}
}
45 changes: 45 additions & 0 deletions tests/Selenium/data/mail/lines.eml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
Return-Path: <thomas@roundcube.net>
X-Original-To: tb@tester.local
To: Tom Tester <tb@tester.local>
Subject: Lines
X-PHP-Originating-Script: 501:rcmail.php
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="=_8853bfb47b7da1852ac882e69cc724f3"
Date: Fri, 23 May 2014 19:44:50 +0200
From: "Thomas B." <thomas@roundcube.net>
Reply-To: hello@roundcube.net
Mail-Reply-To: hello@roundcube.net
Message-ID: <99839b8ec12482419372f1edafa9de75@woodcrest.local>
X-Sender: thomas@roundcube.net
User-Agent: Roundcube Webmail/1.0.1

--=_8853bfb47b7da1852ac882e69cc724f3
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=UTF-8;
format=flowed
Plain text message body.
--
Developer of Free Software
Sent with Roundcube Webmail - roundcube.net
--=_8853bfb47b7da1852ac882e69cc724f3
Content-Transfer-Encoding: base64
Content-Type: text/plain;
name=lines.txt
Content-Disposition: attachment;
filename=lines.txt;
size=13
Zm9vDQpiYXINCmduYQ==
--=_8853bfb47b7da1852ac882e69cc724f3
Content-Transfer-Encoding: base64
Content-Type: text/plain;
name=lines_lf.txt
Content-Disposition: attachment;
filename=lines_lf.txt;
size=11
Zm9vCmJhcgpnbmE=
--=_8853bfb47b7da1852ac882e69cc724f3--
16 changes: 12 additions & 4 deletions tests/Selenium/phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,28 @@
bootstrap="bootstrap.php"
colors="true">
<testsuites>
<testsuite name="All Tests">
<testsuite name="Mail">
<file>Login.php</file><!-- Login.php test must be first -->
<file>Addressbook/Addressbook.php</file>
<file>Addressbook/Import.php</file>
<file>Mail/Mail.php</file>
<file>Mail/CheckRecent.php</file>
<file>Mail/Compose.php</file>
<file>Mail/Getunread.php</file>
<file>Mail/List.php</file>
<file>Logout.php</file><!-- Logout.php test must be last -->
</testsuite>
<testsuite name="Addressbook">
<file>Login.php</file>
<file>Addressbook/Addressbook.php</file>
<file>Addressbook/Import.php</file>
<file>Logout.php</file>
</testsuite>
<testsuite name="Settings">
<file>Login.php</file>
<file>Settings/About.php</file>
<file>Settings/Folders.php</file>
<file>Settings/Identities.php</file>
<file>Settings/Settings.php</file>
<file>Logout.php</file><!-- Logout.php test must be last -->
<file>Logout.php</file>
</testsuite>
</testsuites>
</phpunit>

0 comments on commit f7c5f44

Please sign in to comment.