diff --git a/mod/quiz/classes/external.php b/mod/quiz/classes/external.php index 4cc7a7aa7a9..b6c56663ac2 100644 --- a/mod/quiz/classes/external.php +++ b/mod/quiz/classes/external.php @@ -637,6 +637,8 @@ class mod_quiz_external extends external_api { require_capability('mod/quiz:viewreports', $context); } + // Update quiz with override information. + $quiz = quiz_update_effective_access($quiz, $params['userid']); $attempts = quiz_get_user_attempts($quiz->id, $user->id, 'all', true); $result = []; diff --git a/mod/quiz/tests/external/external_test.php b/mod/quiz/tests/external/external_test.php index d3796d5fbf7..88ee9b8dbdc 100644 --- a/mod/quiz/tests/external/external_test.php +++ b/mod/quiz/tests/external/external_test.php @@ -847,6 +847,87 @@ class external_test extends externallib_advanced_testcase { } } + /** + * Test get_combined_review_options when the user has an override. + * + * @covers ::get_combined_review_options + * @covers ::get_combined_review_options_parameters + * @covers ::get_combined_review_options_returns + */ + public function test_get_combined_review_options_with_overrides(): void { + global $DB; + + // Create a closed quiz with review marks only when quiz is closed. + list($quiz, $context, $quizobj) = $this->create_quiz_with_questions(true, true, 'deferredfeedback', false, [ + 'timeclose' => time() - HOURSECS, + 'marksduring' => 0, + 'maxmarksduring' => 0, + 'marksimmediately' => 0, + 'maxmarksimmediately' => 0, + 'marksopen' => 0, + 'maxmarksopen' => 0, + 'marksclosed' => 1, + 'maxmarksclosed' => 1, + ]); + + // Check that the student can see the marks because the quiz is closed. + $this->setUser($this->student); + + $expected = [ + "someoptions" => [ + ["name" => "feedback", "value" => 1], + ["name" => "generalfeedback", "value" => 1], + ["name" => "rightanswer", "value" => 1], + ["name" => "overallfeedback", "value" => 1], + ["name" => "marks", "value" => 2], + ], + "alloptions" => [ + ["name" => "feedback", "value" => 1], + ["name" => "generalfeedback", "value" => 1], + ["name" => "rightanswer", "value" => 1], + ["name" => "overallfeedback", "value" => 1], + ["name" => "marks", "value" => 2], + ], + "warnings" => [], + ]; + + $result = mod_quiz_external::get_combined_review_options($quiz->id); + $result = external_api::clean_returnvalue(mod_quiz_external::get_combined_review_options_returns(), $result); + + $this->assertEquals($expected, $result); + + // Add an override for the student to increase the close time. + $DB->insert_record('quiz_overrides', [ + 'quiz' => $quiz->id, + 'userid' => $this->student->id, + 'timeclose' => time() + HOURSECS, + ]); + + // Check that now the marks option has changed. + $expected = [ + "someoptions" => [ + ["name" => "feedback", "value" => 1], + ["name" => "generalfeedback", "value" => 1], + ["name" => "rightanswer", "value" => 1], + ["name" => "overallfeedback", "value" => 1], + ["name" => "marks", "value" => 0], + ], + "alloptions" => [ + ["name" => "feedback", "value" => 1], + ["name" => "generalfeedback", "value" => 1], + ["name" => "rightanswer", "value" => 1], + ["name" => "overallfeedback", "value" => 1], + ["name" => "marks", "value" => 0], + ], + "warnings" => [], + ]; + + $result = mod_quiz_external::get_combined_review_options($quiz->id); + $result = external_api::clean_returnvalue(mod_quiz_external::get_combined_review_options_returns(), $result); + + $this->assertEquals($expected, $result); + } + /** * Test start_attempt */