MOBILE-4028 behat: Add behats to test logout and redirects
parent
e671ce437a
commit
822fadbd64
|
@ -604,6 +604,7 @@ class behat_app extends behat_app_helper {
|
||||||
$data = $data->getColumnsHash()[0];
|
$data = $data->getColumnsHash()[0];
|
||||||
$title = array_keys($data)[0];
|
$title = array_keys($data)[0];
|
||||||
$data = (object) $data;
|
$data = (object) $data;
|
||||||
|
$username = $data->user ?? '';
|
||||||
|
|
||||||
switch ($title) {
|
switch ($title) {
|
||||||
case 'discussion':
|
case 'discussion':
|
||||||
|
@ -645,7 +646,7 @@ class behat_app extends behat_app_helper {
|
||||||
throw new DriverException('Invalid custom link title - ' . $title);
|
throw new DriverException('Invalid custom link title - ' . $title);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->open_moodleapp_custom_url($pageurl);
|
$this->open_moodleapp_custom_url($pageurl, '', $username);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -366,12 +366,15 @@ class behat_app_helper extends behat_base {
|
||||||
*
|
*
|
||||||
* @param string $script
|
* @param string $script
|
||||||
* @param bool $blocking
|
* @param bool $blocking
|
||||||
|
* @param string $texttofind If set, when this text is found the operation is considered finished. This is useful for
|
||||||
|
* operations that might expect user input before finishing, like a confirm modal.
|
||||||
* @return mixed Result.
|
* @return mixed Result.
|
||||||
*/
|
*/
|
||||||
protected function zone_js(string $script, bool $blocking = false) {
|
protected function zone_js(string $script, bool $blocking = false, string $texttofind = '') {
|
||||||
$blockingjson = json_encode($blocking);
|
$blockingjson = json_encode($blocking);
|
||||||
|
$locatortofind = !empty($texttofind) ? json_encode((object) ['text' => $texttofind]) : null;
|
||||||
|
|
||||||
return $this->runtime_js("runInZone(() => window.behat.$script, $blockingjson)");
|
return $this->runtime_js("runInZone(() => window.behat.$script, $blockingjson, $locatortofind)");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -411,16 +414,14 @@ class behat_app_helper extends behat_base {
|
||||||
$privatetoken = $usertoken->privatetoken;
|
$privatetoken = $usertoken->privatetoken;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate custom URL.
|
$url = $this->generate_custom_url([
|
||||||
$parsed_url = parse_url($CFG->behat_wwwroot);
|
'username' => $username,
|
||||||
$site = $parsed_url['host'] ?? '';
|
'token' => $token,
|
||||||
$site .= isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
|
'privatetoken' => $privatetoken,
|
||||||
$site .= $parsed_url['path'] ?? '';
|
'redirect' => $path,
|
||||||
$url = $this->get_mobile_url_scheme() . "://$username@$site?token=$token&privatetoken=$privatetoken";
|
]);
|
||||||
|
|
||||||
if (!empty($path)) {
|
if (empty($path)) {
|
||||||
$url .= '&redirect='.urlencode($CFG->behat_wwwroot.$path);
|
|
||||||
} else {
|
|
||||||
$successXPath = '//page-core-mainmenu';
|
$successXPath = '//page-core-mainmenu';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,14 +435,54 @@ class behat_app_helper extends behat_base {
|
||||||
*
|
*
|
||||||
* @param string $path To navigate.
|
* @param string $path To navigate.
|
||||||
* @param string $successXPath The XPath of the element to lookat after navigation.
|
* @param string $successXPath The XPath of the element to lookat after navigation.
|
||||||
|
* @param string $username The username to use.
|
||||||
*/
|
*/
|
||||||
protected function open_moodleapp_custom_url(string $path, string $successXPath = '') {
|
protected function open_moodleapp_custom_url(string $path, string $successXPath = '', string $username = '') {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
|
|
||||||
$urlscheme = $this->get_mobile_url_scheme();
|
$url = $this->generate_custom_url([
|
||||||
$url = "$urlscheme://link=" . urlencode($CFG->behat_wwwroot.$path);
|
'username' => $username,
|
||||||
|
'redirect' => $path,
|
||||||
|
]);
|
||||||
|
|
||||||
$this->handle_url($url);
|
$this->handle_url($url, $successXPath, $username ? 'This link belongs to another site' : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a custom URL to be treated by the app.
|
||||||
|
*
|
||||||
|
* @param array $data Data to generate the URL.
|
||||||
|
*/
|
||||||
|
protected function generate_custom_url(array $data): string {
|
||||||
|
global $CFG;
|
||||||
|
|
||||||
|
$parsed_url = parse_url($CFG->behat_wwwroot);
|
||||||
|
$parameters = [];
|
||||||
|
|
||||||
|
$url = $this->get_mobile_url_scheme() . '://' . ($parsed_url['scheme'] ?? 'http') . '://';
|
||||||
|
if (!empty($data['username'])) {
|
||||||
|
$url .= $data['username'] . '@';
|
||||||
|
}
|
||||||
|
$url .= $parsed_url['host'] ?? '';
|
||||||
|
$url .= isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
|
||||||
|
$url .= $parsed_url['path'] ?? '';
|
||||||
|
|
||||||
|
if (!empty($data['token'])) {
|
||||||
|
$parameters[] = 'token=' . $data['token'];
|
||||||
|
if (!empty($data['privatetoken'])) {
|
||||||
|
$parameters[] = 'privatetoken=' . $data['privatetoken'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($data['redirect'])) {
|
||||||
|
$parameters[] = 'redirect=' . urlencode($data['redirect']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($parameters)) {
|
||||||
|
$url .= '?' . implode('&', $parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -449,9 +490,11 @@ class behat_app_helper extends behat_base {
|
||||||
*
|
*
|
||||||
* @param string $customurl To navigate.
|
* @param string $customurl To navigate.
|
||||||
* @param string $successXPath The XPath of the element to lookat after navigation.
|
* @param string $successXPath The XPath of the element to lookat after navigation.
|
||||||
|
* @param string $texttofind If set, when this text is found the operation is considered finished. This is useful for
|
||||||
|
* operations that might expect user input before finishing, like a confirm modal.
|
||||||
*/
|
*/
|
||||||
protected function handle_url(string $customurl, string $successXPath = '') {
|
protected function handle_url(string $customurl, string $successXPath = '', string $texttofind = '') {
|
||||||
$result = $this->zone_js("customUrlSchemes.handleCustomURL('$customurl')");
|
$result = $this->zone_js("customUrlSchemes.handleCustomURL('$customurl')", false, $texttofind);
|
||||||
|
|
||||||
if ($result !== 'OK') {
|
if ($result !== 'OK') {
|
||||||
throw new DriverException('Error handling url - ' . $customurl . ' - '.$result);
|
throw new DriverException('Error handling url - ' . $customurl . ' - '.$result);
|
||||||
|
|
|
@ -66,13 +66,6 @@ Feature: Test basic usage of login in app
|
||||||
And I press "Connect to your site" in the app
|
And I press "Connect to your site" in the app
|
||||||
Then I should find "Can't connect to site" in the app
|
Then I should find "Can't connect to site" in the app
|
||||||
|
|
||||||
Scenario: Log out from the app
|
|
||||||
Given I entered the app as "student1"
|
|
||||||
And I press the user menu button in the app
|
|
||||||
When I press "Log out" in the app
|
|
||||||
And I wait the app to restart
|
|
||||||
Then the header should be "Accounts" in the app
|
|
||||||
|
|
||||||
Scenario: Delete an account
|
Scenario: Delete an account
|
||||||
Given I entered the app as "student1"
|
Given I entered the app as "student1"
|
||||||
When I log out in the app
|
When I log out in the app
|
||||||
|
|
|
@ -0,0 +1,160 @@
|
||||||
|
@core_login @app @javascript
|
||||||
|
Feature: Test different cases of logout and switch account
|
||||||
|
I need different logout use cases to work
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given the following "users" exist:
|
||||||
|
| username | firstname | lastname |
|
||||||
|
| student1 | david | student |
|
||||||
|
| student2 | pau | student2 |
|
||||||
|
|
||||||
|
Scenario: Log out and re-login
|
||||||
|
Given I entered the app as "student1"
|
||||||
|
When I press the user menu button in the app
|
||||||
|
And I press "Log out" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then the header should be "Accounts" in the app
|
||||||
|
|
||||||
|
When I press "david student" in the app
|
||||||
|
Then the header should be "Reconnect" in the app
|
||||||
|
And I should find "david student" in the app
|
||||||
|
|
||||||
|
When I set the following fields to these values in the app:
|
||||||
|
| Password | student1 |
|
||||||
|
And I press "Log in" near "Lost password?" in the app
|
||||||
|
Then the header should be "Acceptance test site" in the app
|
||||||
|
|
||||||
|
Scenario: Exit account using switch account and re-enter
|
||||||
|
Given I entered the app as "student1"
|
||||||
|
When I press the user menu button in the app
|
||||||
|
And I press "Switch account" in the app
|
||||||
|
And I press "Add" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then I should find "Connect to Moodle" in the app
|
||||||
|
|
||||||
|
When I go back in the app
|
||||||
|
And I press "david student" in the app
|
||||||
|
Then the header should be "Acceptance test site" in the app
|
||||||
|
|
||||||
|
Scenario: Exit account using switch account and re-enter when forcelogout is enabled
|
||||||
|
Given the following config values are set as admin:
|
||||||
|
| forcelogout | 1 | tool_mobile |
|
||||||
|
And I entered the app as "student1"
|
||||||
|
When I press the user menu button in the app
|
||||||
|
And I press "Switch account" in the app
|
||||||
|
And I press "Add" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
And I go back in the app
|
||||||
|
And I press "david student" in the app
|
||||||
|
Then the header should be "Reconnect" in the app
|
||||||
|
And I should find "david student" in the app
|
||||||
|
|
||||||
|
Scenario: Switch to a different account
|
||||||
|
Given I entered the app as "student1"
|
||||||
|
And I entered the app as "student2"
|
||||||
|
When I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
||||||
|
|
||||||
|
When I press "Switch account" in the app
|
||||||
|
And I press "david student" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then the header should be "Acceptance test site" in the app
|
||||||
|
|
||||||
|
When I press the user menu button in the app
|
||||||
|
Then I should find "david student" in the app
|
||||||
|
|
||||||
|
Scenario: Logout when there is unsaved data
|
||||||
|
Given the following "courses" exist:
|
||||||
|
| fullname | shortname |
|
||||||
|
| Course 1 | C1 |
|
||||||
|
And the following "course enrolments" exist:
|
||||||
|
| user | course | role |
|
||||||
|
| student1 | C1 | student |
|
||||||
|
And the following "activities" exist:
|
||||||
|
| activity | name | intro | course | idnumber |
|
||||||
|
| forum | Test forum | Test forum | C1 | forum |
|
||||||
|
And the following forum discussions exist in course "Course 1":
|
||||||
|
| forum | user | name | message |
|
||||||
|
| Test forum | student1 | Forum topic 1 | Forum message 1 |
|
||||||
|
| Test forum | student1 | Forum topic 2 | Forum message 2 |
|
||||||
|
And I entered the course "Course 1" as "student1" in the app
|
||||||
|
And I change viewport size to "1200x640" in the app
|
||||||
|
|
||||||
|
When I press "Test forum" in the app
|
||||||
|
And I press "Add discussion topic" in the app
|
||||||
|
And I set the following fields to these values in the app:
|
||||||
|
| Subject | My happy subject |
|
||||||
|
| Message | An awesome message |
|
||||||
|
And I press the user menu button in the app
|
||||||
|
And I press "Log out" in the app
|
||||||
|
Then I should find "Are you sure you want to leave this page?" in the app
|
||||||
|
|
||||||
|
# Check that the app continues working fine if the user cancels the logout.
|
||||||
|
When I press "Cancel" in the app
|
||||||
|
And I press "Forum topic 1" in the app
|
||||||
|
And I press "OK" in the app
|
||||||
|
Then I should find "Forum message 1" in the app
|
||||||
|
|
||||||
|
When I press "Forum topic 2" in the app
|
||||||
|
Then I should find "Forum message 2" in the app
|
||||||
|
|
||||||
|
# Now confirm the logout.
|
||||||
|
When I press "Add discussion topic" in the app
|
||||||
|
And I set the following fields to these values in the app:
|
||||||
|
| Subject | My happy subject |
|
||||||
|
| Message | An awesome message |
|
||||||
|
And I press the user menu button in the app
|
||||||
|
And I press "Log out" in the app
|
||||||
|
And I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then the header should be "Accounts" in the app
|
||||||
|
|
||||||
|
Scenario: Switch account when there is unsaved data
|
||||||
|
Given the following "courses" exist:
|
||||||
|
| fullname | shortname |
|
||||||
|
| Course 1 | C1 |
|
||||||
|
And the following "course enrolments" exist:
|
||||||
|
| user | course | role |
|
||||||
|
| student1 | C1 | student |
|
||||||
|
And the following "activities" exist:
|
||||||
|
| activity | name | intro | course | idnumber |
|
||||||
|
| forum | Test forum | Test forum | C1 | forum |
|
||||||
|
And the following forum discussions exist in course "Course 1":
|
||||||
|
| forum | user | name | message |
|
||||||
|
| Test forum | student1 | Forum topic 1 | Forum message 1 |
|
||||||
|
| Test forum | student1 | Forum topic 2 | Forum message 2 |
|
||||||
|
And I entered the app as "student2"
|
||||||
|
And I entered the course "Course 1" as "student1" in the app
|
||||||
|
And I change viewport size to "1200x640" in the app
|
||||||
|
|
||||||
|
When I press "Test forum" in the app
|
||||||
|
And I press "Add discussion topic" in the app
|
||||||
|
And I set the following fields to these values in the app:
|
||||||
|
| Subject | My happy subject |
|
||||||
|
| Message | An awesome message |
|
||||||
|
And I press the user menu button in the app
|
||||||
|
And I press "Switch account" in the app
|
||||||
|
And I press "pau student2" in the app
|
||||||
|
Then I should find "Are you sure you want to leave this page?" in the app
|
||||||
|
|
||||||
|
# Check that the app continues working fine if the user cancels the switch account.
|
||||||
|
When I press "Cancel" in the app
|
||||||
|
And I press "Forum topic 1" in the app
|
||||||
|
And I press "OK" in the app
|
||||||
|
Then I should find "Forum message 1" in the app
|
||||||
|
|
||||||
|
When I press "Forum topic 2" in the app
|
||||||
|
Then I should find "Forum message 2" in the app
|
||||||
|
|
||||||
|
# Now confirm the switch account.
|
||||||
|
When I press "Add discussion topic" in the app
|
||||||
|
And I set the following fields to these values in the app:
|
||||||
|
| Subject | My happy subject |
|
||||||
|
| Message | An awesome message |
|
||||||
|
And I press the user menu button in the app
|
||||||
|
And I press "Switch account" in the app
|
||||||
|
And I press "pau student2" in the app
|
||||||
|
And I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
And I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
|
@ -3,9 +3,9 @@ Feature: It navigates properly using deep links.
|
||||||
|
|
||||||
Background:
|
Background:
|
||||||
Given the following "users" exist:
|
Given the following "users" exist:
|
||||||
| username |
|
| username | firstname | lastname |
|
||||||
| student1 |
|
| student1 | david | student |
|
||||||
| student2 |
|
| student2 | pau | student2 |
|
||||||
And the following "courses" exist:
|
And the following "courses" exist:
|
||||||
| fullname | shortname |
|
| fullname | shortname |
|
||||||
| Course 1 | C1 |
|
| Course 1 | C1 |
|
||||||
|
@ -20,7 +20,6 @@ Feature: It navigates properly using deep links.
|
||||||
| forum | user | name | message |
|
| forum | user | name | message |
|
||||||
| Test forum | student1 | Forum topic | Forum message |
|
| Test forum | student1 | Forum topic | Forum message |
|
||||||
And the following config values are set as admin:
|
And the following config values are set as admin:
|
||||||
| forcelogout | 1 | tool_mobile |
|
|
||||||
| defaulthomepage | 0 | |
|
| defaulthomepage | 0 | |
|
||||||
|
|
||||||
Scenario: Receive a push notification
|
Scenario: Receive a push notification
|
||||||
|
@ -78,3 +77,98 @@ Feature: It navigates properly using deep links.
|
||||||
When I go back in the app
|
When I go back in the app
|
||||||
Then I should find "Site home" in the app
|
Then I should find "Site home" in the app
|
||||||
But I should not find "Test forum" in the app
|
But I should not find "Test forum" in the app
|
||||||
|
|
||||||
|
Scenario: Open a deep link in a different account not stored in the app
|
||||||
|
Given I entered the app as "student1"
|
||||||
|
When I open a custom link in the app for:
|
||||||
|
| discussion | user |
|
||||||
|
| Forum topic | student2 |
|
||||||
|
Then I should find "This link belongs to another site" in the app
|
||||||
|
|
||||||
|
When I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then the header should be "Log in" in the app
|
||||||
|
|
||||||
|
When I set the following fields to these values in the app:
|
||||||
|
| Password | student2 |
|
||||||
|
And I press "Log in" near "Lost password?" in the app
|
||||||
|
Then I should find "Forum topic" in the app
|
||||||
|
And I should find "Forum message" in the app
|
||||||
|
|
||||||
|
When I go back to the root page in the app
|
||||||
|
And I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
||||||
|
|
||||||
|
Scenario: Open a deep link in a different account stored in the app
|
||||||
|
Given I entered the app as "student2"
|
||||||
|
And I entered the app as "student1"
|
||||||
|
When I open a custom link in the app for:
|
||||||
|
| discussion | user |
|
||||||
|
| Forum topic | student2 |
|
||||||
|
Then I should find "This link belongs to another site" in the app
|
||||||
|
|
||||||
|
When I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then I should find "Forum topic" in the app
|
||||||
|
And I should find "Forum message" in the app
|
||||||
|
|
||||||
|
When I go back to the root page in the app
|
||||||
|
And I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
||||||
|
|
||||||
|
Scenario: Open a deep link in a different account stored in the app but logged out
|
||||||
|
Given I entered the app as "student2"
|
||||||
|
And I press the user menu button in the app
|
||||||
|
And I press "Log out" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
And I entered the app as "student1"
|
||||||
|
When I open a custom link in the app for:
|
||||||
|
| discussion | user |
|
||||||
|
| Forum topic | student2 |
|
||||||
|
Then I should find "This link belongs to another site" in the app
|
||||||
|
|
||||||
|
When I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then the header should be "Reconnect" in the app
|
||||||
|
And I should find "pau student2" in the app
|
||||||
|
|
||||||
|
When I set the following fields to these values in the app:
|
||||||
|
| Password | student2 |
|
||||||
|
And I press "Log in" near "Lost password?" in the app
|
||||||
|
Then I should find "Forum topic" in the app
|
||||||
|
And I should find "Forum message" in the app
|
||||||
|
|
||||||
|
When I go back to the root page in the app
|
||||||
|
And I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
||||||
|
|
||||||
|
Scenario: Open a deep link in a different account when there is unsaved data
|
||||||
|
Given I entered the app as "student2"
|
||||||
|
And I entered the forum activity "Test forum" on course "Course 1" as "student1" in the app
|
||||||
|
When I press "Add discussion topic" in the app
|
||||||
|
And I set the following fields to these values in the app:
|
||||||
|
| Subject | My happy subject |
|
||||||
|
| Message | An awesome message |
|
||||||
|
And I open a custom link in the app for:
|
||||||
|
| discussion | user |
|
||||||
|
| Forum topic | student2 |
|
||||||
|
Then I should find "This link belongs to another site" in the app
|
||||||
|
|
||||||
|
When I press "OK" in the app
|
||||||
|
Then I should find "Are you sure you want to leave this page?" in the app
|
||||||
|
|
||||||
|
When I press "Cancel" in the app
|
||||||
|
Then I should not find "Forum message" in the app
|
||||||
|
|
||||||
|
When I open a custom link in the app for:
|
||||||
|
| discussion | user |
|
||||||
|
| Forum topic | student2 |
|
||||||
|
And I press "OK" in the app
|
||||||
|
And I press "OK" in the app
|
||||||
|
And I wait the app to restart
|
||||||
|
Then I should find "Forum topic" in the app
|
||||||
|
And I should find "Forum message" in the app
|
||||||
|
|
||||||
|
When I go back to the root page in the app
|
||||||
|
And I press the user menu button in the app
|
||||||
|
Then I should find "pau student2" in the app
|
||||||
|
|
|
@ -136,19 +136,39 @@ export class TestingBehatRuntimeService {
|
||||||
* Run an operation inside the angular zone and return result.
|
* Run an operation inside the angular zone and return result.
|
||||||
*
|
*
|
||||||
* @param operation Operation callback.
|
* @param operation Operation callback.
|
||||||
|
* @param blocking Whether the operation is blocking or not.
|
||||||
|
* @param locatorToFind If set, when this locator is found the operation is considered finished. This is useful for
|
||||||
|
* operations that might expect user input before finishing, like a confirm modal.
|
||||||
* @returns OK if successful, or ERROR: followed by message.
|
* @returns OK if successful, or ERROR: followed by message.
|
||||||
*/
|
*/
|
||||||
async runInZone(operation: () => unknown, blocking: boolean = false): Promise<string> {
|
async runInZone(
|
||||||
|
operation: () => unknown,
|
||||||
|
blocking: boolean = false,
|
||||||
|
locatorToFind?: TestingBehatElementLocator,
|
||||||
|
): Promise<string> {
|
||||||
const blockKey = blocking && TestingBehatBlocking.block();
|
const blockKey = blocking && TestingBehatBlocking.block();
|
||||||
|
let interval: number | undefined;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await NgZone.run(operation);
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
Promise.resolve(NgZone.run(operation)).then(resolve).catch(reject);
|
||||||
|
|
||||||
|
if (locatorToFind) {
|
||||||
|
interval = window.setInterval(() => {
|
||||||
|
if (TestingBehatDomUtils.findElementBasedOnText(locatorToFind, { onlyClickable: false })) {
|
||||||
|
clearInterval(interval);
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return 'OK';
|
return 'OK';
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return 'ERROR: ' + error.message;
|
return 'ERROR: ' + error.message;
|
||||||
} finally {
|
} finally {
|
||||||
blockKey && TestingBehatBlocking.unblock(blockKey);
|
blockKey && TestingBehatBlocking.unblock(blockKey);
|
||||||
|
window.clearInterval(interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue