Add basic browser tests for message menu and open in new window feature
parent
a9abe62d58
commit
31b0275573
@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Browser\Components;
|
||||
|
||||
use Tests\Browser\Browser;
|
||||
use Laravel\Dusk\Component;
|
||||
|
||||
class Popupmenu extends Component
|
||||
{
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*/
|
||||
public function __construct($id)
|
||||
{
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the root selector for the component.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function selector()
|
||||
{
|
||||
return '#' . $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the browser page contains the component.
|
||||
*
|
||||
* @param Browser $browser
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function assert($browser)
|
||||
{
|
||||
$browser->waitFor($this->selector());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the element shortcuts for the component.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function elements()
|
||||
{
|
||||
return [
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert popup menu state
|
||||
*/
|
||||
public function assertMenuState($browser, $active, $disabled = [], $missing = [])
|
||||
{
|
||||
foreach ($active as $option) {
|
||||
// Print action is disabled on phones
|
||||
if ($option == 'print' && $browser->isPhone()) {
|
||||
$browser->assertMissing("a.print");
|
||||
}
|
||||
else {
|
||||
$browser->assertVisible("a.{$option}:not(.disabled)");
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($disabled as $option) {
|
||||
if ($option == 'print' && $browser->isPhone()) {
|
||||
$browser->assertMissing("a.print");
|
||||
}
|
||||
else {
|
||||
$browser->assertVisible("a.{$option}.disabled");
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($missing as $option) {
|
||||
$browser->assertMissing("a.{$option}");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Close popup menu
|
||||
*/
|
||||
public function closeMenu($browser)
|
||||
{
|
||||
// hide the menu back
|
||||
$browser->withinBody(function ($browser) {
|
||||
$browser->script("window.UI.menu_hide('{$this->id}')");
|
||||
$browser->waitUntilMissing($this->selector());
|
||||
if ($browser->isPhone()) {
|
||||
// FIXME: For some reason sometimes .popover-overlay does not close,
|
||||
// we have to remove it manually
|
||||
$browser->script(
|
||||
"Array.from(document.getElementsByClassName('popover-overlay')).forEach(function(elem) { elem.parentNode.removeChild(elem); })"
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Select popup menu item
|
||||
*/
|
||||
public function clickMenuItem($browser, $name, $dropdown_action = null)
|
||||
{
|
||||
$selector = "a.{$name}" . ($dropdown_action ? " + a.dropdown" : '');
|
||||
|
||||
$browser->click($selector);
|
||||
|
||||
if ($dropdown_action) {
|
||||
$popup_id = $browser->attribute($selector, 'data-popup');
|
||||
$browser->withinBody(function ($browser) use ($popup_id, $dropdown_action) {
|
||||
$browser->click("#{$popup_id} li a.{$dropdown_action}");
|
||||
});
|
||||
}
|
||||
|
||||
$this->closeMenu($browser);
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Browser\Mail;
|
||||
|
||||
use Tests\Browser\Components\App;
|
||||
use Tests\Browser\Components\Popupmenu;
|
||||
|
||||
class Open extends \Tests\Browser\TestCase
|
||||
{
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
\bootstrap::init_imap();
|
||||
\bootstrap::purge_mailbox('INBOX');
|
||||
|
||||
// import email messages
|
||||
foreach (glob(TESTS_DIR . 'data/mail/list_00.eml') as $f) {
|
||||
\bootstrap::import_message($f, 'INBOX');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Open in New Window action
|
||||
*/
|
||||
public function testOpenInNewWindow()
|
||||
{
|
||||
$this->browse(function ($browser) {
|
||||
if ($browser->isPhone()) {
|
||||
$this->markTestSkipped();
|
||||
return;
|
||||
}
|
||||
|
||||
$browser->go('mail');
|
||||
|
||||
$browser->waitFor('#messagelist tbody tr:first-child')
|
||||
->ctrlClick('#messagelist tbody tr:first-child');
|
||||
|
||||
$browser->clickToolbarMenuItem('more');
|
||||
|
||||
$browser->with(new Popupmenu('message-menu'), function ($browser) {
|
||||
$uids = $browser->driver->executeScript('return rcmail.message_list.get_selection()');
|
||||
|
||||
$this->assertCount(1, $uids);
|
||||
$this->assertTrue(is_int($uids[0]) && $uids[0] > 0);
|
||||
|
||||
$uid = $uids[0];
|
||||
|
||||
list($current_window, $new_window) = $browser->openWindow(function ($browser) {
|
||||
$browser->clickMenuItem('extwin');
|
||||
});
|
||||
|
||||
$browser->driver->switchTo()->window($new_window);
|
||||
|
||||
$browser->with(new App(), function ($browser) use ($uid) {
|
||||
$browser->assertEnv([
|
||||
'task' => 'mail',
|
||||
'action' => 'show',
|
||||
'uid' => $uid,
|
||||
]);
|
||||
|
||||
// TODO: werify the toolbar, which is different here than in the preview frame
|
||||
});
|
||||
|
||||
$browser->driver->close();
|
||||
$browser->driver->switchTo()->window($current_window);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue