Skip to content

Commit

Permalink
Test UI controls also in developer fullstack test
Browse files Browse the repository at this point in the history
  • Loading branch information
Martchus committed Jun 25, 2018
1 parent 31b4e72 commit 393b7d8
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 56 deletions.
20 changes: 18 additions & 2 deletions t/33-developer_mode.t
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,24 @@ subtest 'developer session visible in live view' => sub {
$driver->find_element_by_link_text('Live View')->click();
wait_for_session_info(qr/opened by Demo/, 'user displayed');

my $developer_instructions_info = $driver->find_element('#developer-instructions')->get_text();
like($developer_instructions_info, qr/connect to .* at port 91/, 'developer instructions');
subtest 'UI controls in initial state' => sub {
element_visible('#developer-instructions', qr/connect to .* at port 91/);
element_visible('#developer-panel .card-header', qr/paused/);
element_hidden('#developer-panel .card-body');
};

subtest 'expand developer panel' => sub {
$driver->find_element('#developer-panel .card-header')->click();
element_visible(
'#developer-panel .card-body',
[qr/You started a developer session/, qr/Cancel job/, qr/Resume/, qr/Open console/,],
[qr/Confirm \& start developer session/,],
);

my @module_options = $driver->find_elements('#developer-pause-at-module option');
my @module_names = map { $_->get_text() } @module_options;
is_deeply(\@module_names, ['Do not pause', 'boot', 'shutdown',], 'module');
};
};

subtest 'session locked for other developers' => sub {
Expand Down
57 changes: 53 additions & 4 deletions t/lib/OpenQA/SeleniumTest.pm
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@ use strict;
require Mojolicious::Commands;
require OpenQA::Test::Database;

our @EXPORT = qw($drivermissing check_driver_modules
start_driver call_driver kill_driver wait_for_ajax
open_new_tab
javascript_console_has_no_warnings_or_errors);
our @EXPORT = qw($drivermissing check_driver_modules start_driver
call_driver kill_driver wait_for_ajax open_new_tab mock_js_functions
element_visible element_hidden javascript_console_has_no_warnings_or_errors);

use Data::Dump 'pp';
use Test::More;
Expand Down Expand Up @@ -210,6 +209,56 @@ sub javascript_console_has_no_warnings_or_errors {
return scalar @errors eq 0;
}

# mocks the specified JavaScript functions (reverted when navigating to another page)
sub mock_js_functions {
my (%functions_to_mock) = @_;

my $java_script = '';
$java_script .= "window.$_ = function(arg1, arg2) { $functions_to_mock{$_} };" for (keys %functions_to_mock);

print("injecting JavaScript: $java_script\n");
$_driver->execute_script($java_script);
}

# asserts that an element is visible and optionally whether it does (not) contain the expected phrases
sub element_visible {
my ($selector, $like, $unlike) = @_;

my @elements = $_driver->find_elements($selector);
is(scalar @elements, 1, $selector . ' present exactly once');

my $element = $elements[0];
ok($element->is_displayed(), $selector . ' visible');

# assert the element's text
my $element_text = $element->get_text();
if ($like) {
if (ref $like eq 'ARRAY') {
like($element_text, $_, "$selector contains $_") for (@$like);
}
else {
like($element_text, $like, "$selector contains expected text");
}
}
if ($unlike) {
if (ref $unlike eq 'ARRAY') {
unlike($element_text, $_, "$selector does not contain $_") for (@$unlike);
}
else {
unlike($element_text, $unlike, "$selector does not contain text");
}
}
}

# asserts that an element is part of the page but hidden
sub element_hidden {
my ($selector) = @_;

my @elements = $_driver->find_elements($selector);
is(scalar @elements, 1, $selector . ' present exactly once');
ok(!$elements[0]->is_displayed(), $selector . ' hidden');
}

sub kill_driver() {
return unless $startingpid && $$ == $startingpid;
if ($_driver) {
Expand Down
50 changes: 0 additions & 50 deletions t/ui/25-developer_mode.t
Original file line number Diff line number Diff line change
Expand Up @@ -64,45 +64,6 @@ unless ($driver) {
exit(0);
}

# asserts that an element is visible and optionally whether it does (not) contain the expected phrases
sub element_visible {
my ($selector, $like, $unlike) = @_;

my @elements = $driver->find_elements($selector);
is(scalar @elements, 1, $selector . ' present exactly once');

my $element = $elements[0];
ok($element->is_displayed(), $selector . ' visible');

# assert the element's text
my $element_text = $element->get_text();
if ($like) {
if (ref $like eq 'ARRAY') {
like($element_text, $_, "$selector contains $_") for (@$like);
}
else {
like($element_text, $like, "$selector contains expected text");
}
}
if ($unlike) {
if (ref $unlike eq 'ARRAY') {
unlike($element_text, $_, "$selector does not contain $_") for (@$unlike);
}
else {
unlike($element_text, $unlike, "$selector does not contain text");
}
}
}

# asserts that an element is part of the page but hidden
sub element_hidden {
my ($selector) = @_;

my @elements = $driver->find_elements($selector);
is(scalar @elements, 1, $selector . ' present exactly once');
ok(!$elements[0]->is_displayed(), $selector . ' hidden');
}

# sets the properties of the specified global JavaScript object and updates the developer panel
sub fake_state {
my ($variable, $state) = @_;
Expand All @@ -115,17 +76,6 @@ sub fake_state {
$driver->execute_script($java_script);
}

# mocks the specified JavaScript functions (reverted when navigating to another page)
sub mock_js_functions {
my (%functions_to_mock) = @_;

my $java_script = '';
$java_script .= "window.$_ = function(arg1, arg2) { $functions_to_mock{$_} };" for (keys %functions_to_mock);

print("injecting JavaScript: $java_script\n");
$driver->execute_script($java_script);
}

# checks whether the commands sent by the JavaScript since the last call matches the expected commands
sub assert_sent_commands {
my ($expected, $test_name) = @_;
Expand Down

0 comments on commit 393b7d8

Please sign in to comment.