MDL-83896 mod_lesson: Add generators for lesson submissions

This commit is contained in:
Mikel Martín
2025-07-02 16:06:53 +02:00
parent bb5f837416
commit d8dbfe4dfd
3 changed files with 120 additions and 0 deletions
@@ -49,6 +49,12 @@ class behat_mod_lesson_generator extends behat_generator_base {
'datagenerator' => 'answer',
'required' => ['page'],
],
'submissions' => [
'singular' => 'submission',
'datagenerator' => 'submission',
'required' => ['lesson', 'user'],
'switchids' => ['lesson' => 'lessonid', 'user' => 'userid'],
],
];
}
+62
View File
@@ -802,4 +802,66 @@ class mod_lesson_generator extends testing_module_generator {
return $jumptolist;
}
/**
* Creates a lesson submission for testing purposes.
*
* @param mixed $record
* @throws \coding_exception
* @return bool|int
*/
public function create_submission($record = null) {
$db = \core\di::get(\moodle_database::class);
[
'lessonid' => $lessonid,
'userid' => $userid,
'grade' => $grade,
] = $record;
[, $cm] = get_course_and_cm_from_instance($lessonid, 'lesson');
$lesson = new lesson($cm->get_instance_record());
// Check if the lesson exists and retakes are allowed.
if (!$lesson->retake && $db->record_exists('lesson_grades', ['lessonid' => $lessonid, 'userid' => $userid])) {
throw new coding_exception("Grade for user $userid in lesson $lessonid already exists and retakes are not allowed.");
}
// Get the highest score answer for each page in the lesson.
$sql = "SELECT la.id AS answerid, la.answer, la.pageid FROM {lesson_answers} la
JOIN (
SELECT lessonid, pageid, MAX(score) AS maxscore FROM {lesson_answers}
GROUP BY lessonid, pageid
) mla ON mla.lessonid = la.lessonid AND mla.pageid = la.pageid AND mla.maxscore = la.score
WHERE (
SELECT COUNT(*)
FROM {lesson_answers} lac
WHERE lac.lessonid = la.lessonid
AND lac.pageid = la.pageid
AND lac.score = la.score
) = 1
AND la.lessonid = :lessonid";
$answers = $db->get_records_sql($sql, ['lessonid' => $lessonid]);
foreach ($answers as $answer) {
// Create an attempt for each answer.
$db->insert_record('lesson_attempts', [
'lessonid' => $lessonid,
'userid' => $userid,
'pageid' => $answer->pageid,
'answerid' => $answer->answerid,
'retry' => 0,
'useranswer' => $answer->answer,
'timeseen' => time(),
]);
}
return $db->insert_record('lesson_grades', [
'lessonid' => $lessonid,
'userid' => $userid,
'grade' => $grade,
'late' => 0,
'completed' => time(),
]);
}
}
+52
View File
@@ -749,4 +749,56 @@ final class generator_test extends \advanced_testcase {
$lessongenerator->finish_generate_answer();
}
/**
* Test create a submission and the related attempts.
*
* @covers ::create_submission
*/
public function test_create_submission(): void {
$db = \core\di::get(\moodle_database::class);
$this->resetAfterTest();
$this->setAdminUser();
$course = $this->getDataGenerator()->create_course();
$lesson = $this->getDataGenerator()->create_module('lesson', ['course' => $course]);
$student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
/** @var \mod_lesson_generator $lessongenerator */
$lessongenerator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
// Create pages and answers.
$lessongenerator->create_page([
'title' => 'Multichoice question 1',
'content' => 'What animal is an amphibian?',
'qtype' => 'multichoice',
'lessonid' => $lesson->id,
]);
$lessongenerator->create_answer(['page' => 'Multichoice question 1', 'answer' => 'Frog', 'score' => 1]);
$lessongenerator->create_answer(['page' => 'Multichoice question 1', 'answer' => 'Cat']);
$lessongenerator->create_page([
'title' => 'Multichoice question 2',
'content' => 'What animal is an mammal?',
'qtype' => 'multichoice',
'lessonid' => $lesson->id,
]);
$lessongenerator->create_answer(['page' => 'Multichoice question 2', 'answer' => 'Dog', 'score' => 1]);
$lessongenerator->create_answer(['page' => 'Multichoice question 2', 'answer' => 'spider']);
$lessongenerator->finish_generate_answer();
// Create a submission.
$submissionid = $lessongenerator->create_submission([
'lessonid' => $lesson->id,
'userid' => $student1->id,
'grade' => 100,
]);
// Check that the submission was created.
$submission = $db->get_record('lesson_grades', ['lessonid' => $lesson->id, 'userid' => $student1->id]);
$this->assertNotEmpty($submission);
$this->assertEquals($submissionid, $submission->id);
// Check that the attempts were created.
$attempts = $db->get_records('lesson_attempts', ['lessonid' => $lesson->id, 'userid' => $student1->id]);
$this->assertCount(2, $attempts);
}
}