MDL-63977 Behat: Move app startup to before-scenario hook
authorsam marshall <s.marshall@open.ac.uk>
Tue, 15 Jan 2019 15:12:06 +0000 (15:12 +0000)
committersam marshall <s.marshall@open.ac.uk>
Mon, 11 Feb 2019 16:20:43 +0000 (16:20 +0000)
lib/tests/behat/behat_app.php
lib/tests/behat/behat_hooks.php

index a211dce..d307f20 100644 (file)
@@ -42,6 +42,9 @@ class behat_app extends behat_base {
     /** @var stdClass Object with data about launched Ionic instance (if any) */
     protected static $ionicrunning = null;
 
+    /** @var string URL for running Ionic server */
+    protected $ionicurl = '';
+
     /**
      * Checks if the current OS is Windows, from the point of view of task-executing-and-killing.
      *
@@ -51,6 +54,17 @@ class behat_app extends behat_base {
         return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
     }
 
+    /**
+     * Called from behat_hooks when a new scenario starts, if it has the app tag.
+     *
+     * This updates Moodle configuration and starts Ionic running, if it isn't already.
+     */
+    public function start_scenario() {
+        $this->check_behat_setup();
+        $this->fix_moodle_setup();
+        $this->ionicurl = $this->start_or_reuse_ionic();
+}
+
     /**
      * Opens the Moodle app in the browser.
      *
@@ -62,19 +76,17 @@ class behat_app extends behat_base {
      * @throws ExpectationException Problem with resizing window
      */
     public function i_enter_the_app() {
+        // Check the app tag was set.
+        if (!$this->has_tag('app')) {
+            throw new DriverException('Requires @app tag on scenario or feature.');
+        }
+
         // Restart the browser and set its size.
         $this->getSession()->restart();
         $this->resize_window('360x720', true);
 
-        // Prepare setup.
-        $this->check_behat_setup();
-        $this->fix_moodle_setup();
-
-        // Start Ionic server (or use existing one).
-        $url = $this->start_or_reuse_ionic();
-
         // Go to page and prepare browser for app.
-        $this->prepare_browser($url);
+        $this->prepare_browser($this->ionicurl);
     }
 
     /**
@@ -85,11 +97,6 @@ class behat_app extends behat_base {
     protected function check_behat_setup() {
         global $CFG;
 
-        // Check the app tag was set.
-        if (!$this->has_tag('app')) {
-            throw new DriverException('Requires @app tag on scenario or feature.');
-        }
-
         // Check JavaScript is enabled.
         if (!$this->running_javascript()) {
             throw new DriverException('The app requires JavaScript.');
index 865831f..3b523f1 100644 (file)
@@ -392,6 +392,11 @@ class behat_hooks extends behat_base {
 
         // Set up the tags for current scenario.
         self::fetch_tags_for_scenario($scope);
+
+        // If scenario requires the Moodle app to be running, set this up.
+        if ($this->has_tag('app')) {
+            $this->execute('behat_app::start_scenario');
+        }
     }
 
     /**