From 982d1bb1c807ecfca4d7a0657f33caa10320bb47 Mon Sep 17 00:00:00 2001 From: PraiseSatan Date: Fri, 12 Nov 2021 07:29:21 +1100 Subject: [PATCH] MDL-69496 quiz: Only validate completion if unlocked Quiz completion settings are only validated if they are unlocked. Undefined behaviour in the forms API results in the completion settings 'require passing grade' and 'completion attempts exhausted' not being sent to the process options function if completion settings are locked. This resulted in the completion attempts exhausted setting being disabled whenever the quiz was saved as it did not detect the require passing grade setting. This changes the behaviour so that validation is only performed if the completion settings are unlocked. A behat test is included to ensure the setting does not change. --- mod/quiz/lib.php | 19 ++++--- .../quiz_activity_completion_locked.feature | 56 +++++++++++++++++++ 2 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 mod/quiz/tests/behat/quiz_activity_completion_locked.feature diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index 63acbf6a679dd..c15fb254c4a01 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -1128,14 +1128,17 @@ function quiz_process_options($quiz) { $quiz->reviewoverallfeedback &= ~mod_quiz_display_options::DURING; // Ensure that disabled checkboxes in completion settings are set to 0. - if (empty($quiz->completionusegrade)) { - $quiz->completionpassgrade = 0; - } - if (empty($quiz->completionpassgrade)) { - $quiz->completionattemptsexhausted = 0; - } - if (empty($quiz->completionminattemptsenabled)) { - $quiz->completionminattempts = 0; + // But only if the completion settinsg are unlocked. + if (!empty($quiz->completionunlocked)) { + if (empty($quiz->completionusegrade)) { + $quiz->completionpassgrade = 0; + } + if (empty($quiz->completionpassgrade)) { + $quiz->completionattemptsexhausted = 0; + } + if (empty($quiz->completionminattemptsenabled)) { + $quiz->completionminattempts = 0; + } } } diff --git a/mod/quiz/tests/behat/quiz_activity_completion_locked.feature b/mod/quiz/tests/behat/quiz_activity_completion_locked.feature new file mode 100644 index 0000000000000..8bd9f46dc0271 --- /dev/null +++ b/mod/quiz/tests/behat/quiz_activity_completion_locked.feature @@ -0,0 +1,56 @@ +@mod @mod_quiz @core_completion +Feature: Ensure saving a quiz does not modify the completion settings. + In order to reliably use completion + As a teacher + I need to be able to update the quiz + without changing the completion settings. + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | student1 | Student | 1 | student1@example.com | + | teacher1 | Teacher | 1 | teacher1@example.com | + And the following "courses" exist: + | fullname | shortname | category | enablecompletion | + | Course 1 | C1 | 0 | 1 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And the following config values are set as admin: + | grade_item_advanced | hiddenuntil | + And the following "question categories" exist: + | contextlevel | reference | name | + | Course | C1 | Test questions | + And the following "questions" exist: + | questioncategory | qtype | name | questiontext | + | Test questions | truefalse | First question | Answer the first question | + And the following "activity" exists: + | activity | quiz | + | course | C1 | + | idnumber | quiz1 | + | name | Test quiz | + | section | 1 | + | attempts | 2 | + | gradepass | 5.00 | + | completion | 2 | + | completionview | 0 | + | completionusegrade | 1 | + | completionpassgrade | 1 | + | completionattemptsexhausted | 1 | + And quiz "Test quiz" contains the following questions: + | question | page | + | First question | 1 | + And user "student1" has attempted "Test quiz" with responses: + | slot | response | + | 1 | True | + + Scenario: Ensure saving quiz activty does not change completion settings + Given I am on the "Test quiz" "mod_quiz > View" page logged in as "teacher1" + When I navigate to "Settings" in current page administration + Then the "completionattemptsexhausted" "field" should be disabled + And the field "completionattemptsexhausted" matches value "1" + And I press "Save and display" + And I navigate to "Settings" in current page administration + And the "completionattemptsexhausted" "field" should be disabled + And the field "completionattemptsexhausted" matches value "1"