Skip to content

Commit

Permalink
MDL-69496 quiz: Only validate completion if unlocked
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
1JackBlack1 committed Nov 16, 2021
1 parent ef9ffcd commit 982d1bb
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 8 deletions.
19 changes: 11 additions & 8 deletions mod/quiz/lib.php
Expand Up @@ -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;
}
}
}

Expand Down
56 changes: 56 additions & 0 deletions 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"

0 comments on commit 982d1bb

Please sign in to comment.