MDL-63977 Behat: Make standard login step work for app as well
authorsam marshall <s.marshall@open.ac.uk>
Tue, 15 Jan 2019 16:51:38 +0000 (16:51 +0000)
committersam marshall <s.marshall@open.ac.uk>
Mon, 11 Feb 2019 16:20:43 +0000 (16:20 +0000)
auth/tests/behat/behat_auth.php
course/tests/behat/app_courselist.feature
lib/behat/behat_base.php
lib/tests/behat/behat_app.php
mod/forum/tests/behat/app_basic_usage.feature

index 27ebd41..30d1691 100644 (file)
@@ -44,6 +44,12 @@ class behat_auth extends behat_base {
      * @Given /^I log in as "(?P<username_string>(?:[^"]|\\")*)"$/
      */
     public function i_log_in_as($username) {
+        // In the mobile app the required tasks are different.
+        if ($this->is_in_app()) {
+            $this->execute('behat_app::login', [$username]);
+            return;
+        }
+
         // Visit login page.
         $this->getSession()->visit($this->locate_path('login/index.php'));
 
index 89ffa84..ea68c05 100644 (file)
@@ -21,13 +21,13 @@ Feature: Test course list shown on app start tab
 
   Scenario: Student is registered on one course
     When I enter the app
-    And I log in as "student1" in the app
+    And I log in as "student1"
     Then I should see "Course 1"
     And I should not see "Course 2"
 
   Scenario: Student is registered on two courses (shortnames not displayed)
     When I enter the app
-    And I log in as "student2" in the app
+    And I log in as "student2"
     Then I should see "Course 1"
     And I should see "Course 2"
     And I should not see "C1"
@@ -37,7 +37,7 @@ Feature: Test course list shown on app start tab
     Given the following config values are set as admin:
       | courselistshortnames | 1 |
     When I enter the app
-    And I log in as "student2" in the app
+    And I log in as "student2"
     Then I should see "Course 1"
     And I should see "Course 2"
     And I should see "C1"
@@ -45,7 +45,7 @@ Feature: Test course list shown on app start tab
 
   Scenario: Student uses course list to enter course, then leaves it again
     When I enter the app
-    And I log in as "student2" in the app
+    And I log in as "student2"
     And I press "Course 2" near "Course overview" in the app
     Then the header should be "Course 2" in the app
     And I press the back button in the app
@@ -94,7 +94,7 @@ Feature: Test course list shown on app start tab
       | student2 | Z9     | student |
       | student2 | Z10    | student |
     When I enter the app
-    And I log in as "student2" in the app
+    And I log in as "student2"
     Then I should see "C1"
     And I should see "C2"
     And I should see "C3"
index 68738a1..e971a35 100644 (file)
@@ -474,6 +474,21 @@ class behat_base extends Behat\MinkExtension\Context\RawMinkContext {
         return get_class($this->getSession()->getDriver()) !== 'Behat\Mink\Driver\GoutteDriver';
     }
 
+    /**
+     * Checks if the current page is part of the mobile app.
+     *
+     * @return bool True if it's in the app
+     */
+    protected function is_in_app() : bool {
+        // Cannot be in the app if there's no @app tag on scenario.
+        if (!$this->has_tag('app')) {
+            return false;
+        }
+
+        // Check on page to see if it's an app page. Safest way is to look for added JavaScript.
+        return $this->getSession()->evaluateScript('typeof window.behatPress') === 'function';
+    }
+
     /**
      * Spins around an element until it exists
      *
index d307f20..04c6364 100644 (file)
@@ -321,20 +321,18 @@ class behat_app extends behat_base {
     }
 
     /**
-     * Logs in as the given user in the app's login screen.
+     * Carries out the login steps for the app, assuming the user is on the app login page. Called
+     * from behat_auth.php.
      *
-     * Must be run from the app login screen (i.e. immediately after first 'I enter the app').
-     *
-     * @Given /^I log in as "(?P<username_string>(?:[^"]|\\")*)" in the app$/
      * @param string $username Username (and password)
-     * @throws DriverException If the main page doesn't load
+     * @throws Exception Any error
      */
-    public function i_log_in_as_username_in_the_app(string $username) {
+    public function login(string $username) {
         $this->i_set_the_field_in_the_app('Username', $username);
         $this->i_set_the_field_in_the_app('Password', $username);
 
         // Note there are two 'Log in' texts visible (the title and the button) so we have to use
-        // the 'near' syntax here.
+        // a 'near' value here.
         $this->i_press_near_in_the_app('Log in', 'Forgotten');
 
         // Wait until the main page appears.
@@ -398,15 +396,7 @@ class behat_app extends behat_base {
      * @throws DriverException If the press doesn't work
      */
     public function i_press_in_the_app(string $text) {
-        $this->spin(function($context, $args) use ($text) {
-            $result = $this->getSession()->evaluateScript('return window.behatPress("' .
-                    addslashes_js($text) . '");');
-            if ($result !== 'OK') {
-                throw new DriverException('Error pressing item - ' . $result);
-            }
-            return true;
-        });
-        $this->wait_for_pending_js();
+        $this->press($text);
     }
 
     /**
@@ -422,9 +412,30 @@ class behat_app extends behat_base {
      * @throws DriverException If the press doesn't work
      */
     public function i_press_near_in_the_app(string $text, string $near) {
+        $this->press($text, $near);
+    }
+
+    /**
+     * Clicks on / touches something that is visible in the app, near some other text.
+     *
+     * If the $near is specified then when there are multiple matches, it picks the one
+     * nearest (in DOM terms) $near. $near should be an exact match, or a partial match that only
+     * has one result.
+     *
+     * @param behat_base $base Behat context
+     * @param string $text Text identifying click target
+     * @param string $near Text identifying a nearby unique piece of text
+     * @throws DriverException If the press doesn't work
+     */
+    protected function press(string $text, string $near = '') {
         $this->spin(function($context, $args) use ($text, $near) {
-            $result = $this->getSession()->evaluateScript('return window.behatPress("' .
-                    addslashes_js($text) . '", "' . addslashes_js($near) . '");');
+            if ($near !== '') {
+                $nearbit = ', "' . addslashes_js($near) . '"';
+            } else {
+                $nearbit = '';
+            }
+            $result = $context->getSession()->evaluateScript('return window.behatPress("' .
+                    addslashes_js($text) . '"' . $nearbit .');');
             if ($result !== 'OK') {
                 throw new DriverException('Error pressing item - ' . $result);
             }
index e4bda77..1cd4db6 100644 (file)
@@ -20,7 +20,7 @@ Feature: Test basic usage in app
 
   Scenario: Student starts a discussion
     When I enter the app
-    And I log in as "student1" in the app
+    And I log in as "student1"
     And I press "Course 1" near "Course overview" in the app
     And I press "Test forum name" in the app
     And I press "Add a new discussion topic" in the app
@@ -32,7 +32,7 @@ Feature: Test basic usage in app
 
   Scenario: Student posts a reply
     When I enter the app
-    And I log in as "student1" in the app
+    And I log in as "student1"
     And I press "Course 1" near "Course overview" in the app
     And I press "Test forum name" in the app
     And I press "Add a new discussion topic" in the app
@@ -49,7 +49,7 @@ Feature: Test basic usage in app
   Scenario: Test that 'open in browser' works for forum
     When I enter the app
     And I change viewport size to "360x640"
-    And I log in as "student1" in the app
+    And I log in as "student1"
     And I press "Course 1" near "Course overview" in the app
     And I press "Test forum name" in the app
     And I press the page menu button in the app