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