Skip to content

Commit b05a56a

Browse files
committed
fixup! MDL-87029 quiz: Refetch attempts in overdue task to avoid stale submits
1 parent 11952f6 commit b05a56a

1 file changed

Lines changed: 52 additions & 27 deletions

File tree

public/mod/quiz/tests/attempts_test.php

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -616,47 +616,64 @@ public function test_update_overdue_attempts_refetches_attempts_before_processin
616616
$this->setAdminUser();
617617

618618
$course = $this->getDataGenerator()->create_course();
619-
$student = $this->getDataGenerator()->create_user();
619+
$student1 = $this->getDataGenerator()->create_user();
620+
$student2 = $this->getDataGenerator()->create_user();
620621
$studentrole = $DB->get_record('role', ['shortname' => 'student']);
621-
$this->assertTrue(enrol_try_internal_enrol($course->id, $student->id, $studentrole->id));
622+
$this->assertTrue(enrol_try_internal_enrol($course->id, $student1->id, $studentrole->id));
623+
$this->assertTrue(enrol_try_internal_enrol($course->id, $student2->id, $studentrole->id));
622624

623625
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');
626+
$questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
624627

625628
$quiz = $quizgenerator->create_instance([
626629
'course' => $course->id,
627630
'overduehandling' => 'autosubmit',
628-
'timeclose' => 2000,
629-
'timelimit' => 60,
631+
'timelimit' => 1,
630632
]);
631633

632-
$attemptid = $DB->insert_record('quiz_attempts', [
633-
'quiz' => $quiz->id,
634-
'userid' => $student->id,
635-
'attempt' => 1,
636-
'state' => 'inprogress',
637-
'timestart' => 100,
638-
'timecheckstate' => 0,
639-
'layout' => '',
640-
'uniqueid' => $this->usage_id($quiz),
641-
]);
634+
$category = $questiongenerator->create_question_category();
635+
$question = $questiongenerator->create_question('truefalse', null, ['category' => $category->id]);
636+
$quizobj = quiz_settings::create($quiz->id);
637+
quiz_add_quiz_question($question->id, $quiz);
638+
$quizobj->get_grade_calculator()->recompute_quiz_sumgrades();
639+
640+
// Create one attempt that is already finished and one that cron should submit.
641+
$this->setUser($student1);
642+
$finishedattempt = $quizgenerator->create_attempt($quiz->id, $student1->id);
643+
$finishedattemptid = $finishedattempt->id;
644+
645+
$this->setUser($student2);
646+
$overdueattempt = $quizgenerator->create_attempt($quiz->id, $student2->id);
647+
$overdueattemptid = $overdueattempt->id;
642648

643-
$finishedtime = 1500;
649+
$finishedtime = $finishedattempt->timestart + 10;
644650
$DB->update_record('quiz_attempts', (object)[
645-
'id' => $attemptid,
651+
'id' => $finishedattemptid,
646652
'state' => 'finished',
647653
'timemodified' => $finishedtime,
648654
'timefinish' => $finishedtime,
649655
'timecheckstate' => null,
650656
]);
651657

652-
$attemptinfo = (object)[
653-
'id' => $attemptid,
654-
'quiz' => $quiz->id,
655-
'usertimeclose' => (int) $quiz->timeclose,
656-
'usertimelimit' => (int) $quiz->timelimit,
658+
$attemptsinfo = [
659+
(object)[
660+
'id' => $finishedattemptid,
661+
'quiz' => $quiz->id,
662+
'usertimeclose' => 0,
663+
'usertimelimit' => 1,
664+
],
665+
(object)[
666+
'id' => $overdueattemptid,
667+
'quiz' => $quiz->id,
668+
'usertimeclose' => 0,
669+
'usertimelimit' => 1,
670+
],
657671
];
658672

659-
$recordset = new class ([$attemptinfo]) extends moodle_recordset {
673+
$originaloverdueattempt = $DB->get_record('quiz_attempts', ['id' => $overdueattemptid]);
674+
$this->assertEquals('inprogress', $originaloverdueattempt->state);
675+
676+
$recordset = new class ($attemptsinfo) extends moodle_recordset {
660677
/** @var array */
661678
private array $records;
662679

@@ -718,6 +735,8 @@ public function close() {
718735
}
719736
};
720737

738+
$this->setAdminUser();
739+
721740
$overduetask = new class ($recordset) extends update_overdue_attempts {
722741
/** @var moodle_recordset */
723742
private moodle_recordset $recordset;
@@ -743,11 +762,17 @@ public function get_list_of_overdue_attempts(int $processto): moodle_recordset {
743762
}
744763
};
745764

746-
$overduetask->update_all_overdue_attempts($finishedtime + 120, 0);
765+
$timenow = $overdueattempt->timestart + 100;
766+
$overduetask->update_all_overdue_attempts($timenow, 0);
767+
768+
$latestfinishedattempt = $DB->get_record('quiz_attempts', ['id' => $finishedattemptid]);
769+
$this->assertEquals($finishedtime, $latestfinishedattempt->timefinish);
770+
$this->assertEquals($finishedtime, $latestfinishedattempt->timemodified);
771+
$this->assertEquals('finished', $latestfinishedattempt->state);
747772

748-
$latestattempt = $DB->get_record('quiz_attempts', ['id' => $attemptid]);
749-
$this->assertEquals($finishedtime, $latestattempt->timefinish);
750-
$this->assertEquals($finishedtime, $latestattempt->timemodified);
751-
$this->assertEquals('finished', $latestattempt->state);
773+
$latestoverdueattempt = $DB->get_record('quiz_attempts', ['id' => $overdueattemptid]);
774+
$this->assertEquals('finished', $latestoverdueattempt->state);
775+
$this->assertGreaterThan(0, $latestoverdueattempt->timefinish);
776+
$this->assertNotEquals(0, $latestoverdueattempt->timemodified);
752777
}
753778
}

0 commit comments

Comments
 (0)