diff --git a/tests/behat/behat_app.php b/tests/behat/behat_app.php index ca2e742fa..966af9496 100644 --- a/tests/behat/behat_app.php +++ b/tests/behat/behat_app.php @@ -532,6 +532,24 @@ class behat_app extends behat_base { $this->wait_for_pending_js(); } + /** + * Replace arguments from the content in the given activity field. + * + * @Given /^I replace the arguments in "([^"]+)" "([^"]+)"$/ + */ + public function i_replace_arguments_in_the_activity(string $idnumber, string $field) { + global $DB; + + $coursemodule = $DB->get_record('course_modules', compact('idnumber')); + $module = $DB->get_record('modules', ['id' => $coursemodule->module]); + $activity = $DB->get_record($module->name, ['id' => $coursemodule->instance]); + + $DB->update_record($module->name, [ + 'id' => $coursemodule->instance, + $field => $this->replace_arguments($activity->{$field}), + ]); + } + /** * Opens a custom link. * @@ -889,4 +907,31 @@ class behat_app extends behat_base { return str_replace('$WWWROOT', $CFG->behat_wwwroot, $text); } + /** + * Replace arguments with the format "${activity:field}" from a string, where "activity" is + * the idnumber of an activity and "field" is the activity's field to get replacement from. + * + * At the moment, the only field supported is "cmid", the id of the course module for this activity. + * + * @param string $text Original text. + * @return string Text with arguments replaced. + */ + protected function replace_arguments(string $text): string { + global $DB; + + preg_match_all("/\\$\\{([^:}]+):([^}]+)\\}/", $text, $matches); + + foreach ($matches[0] as $index => $match) { + switch ($matches[2][$index]) { + case 'cmid': + $coursemodule = $DB->get_record('course_modules', ['idnumber' => $matches[1][$index]]); + $text = str_replace($match, $coursemodule->id, $text); + + break; + } + } + + return $text; + } + } diff --git a/tests/behat/navigation_activities.feature b/tests/behat/navigation_activities.feature new file mode 100644 index 000000000..210b8293e --- /dev/null +++ b/tests/behat/navigation_activities.feature @@ -0,0 +1,32 @@ +@app @javascript +Feature: It navigates properly within activities. + + Background: + Given the following "users" exist: + | username | + | student | + And the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And the following "course enrolments" exist: + | user | course | role | + | student | C1 | student | + And the following "activities" exist: + | activity | idnumber | course | name | intro | content | + | label | label | C1 | Label | Label description | - | + | page | page | C1 | Page | - | Go to label | + And I replace the arguments in "page" "content" + + Scenario: Navigates using deep links + When I enter the app + And I log in as "student" + And I press "Course 1" in the app + And I press "Page" in the app + And I press "Go to label" in the app + Then I should find "Label description" in the app + + When I press the back button in the app + Then I should find "Go to label" in the app + + When I press the back button in the app + Then I should find "Label description" in the app