Skip to content

Commit

Permalink
Merge branch 'MDL-75746_401_STABLE' of https://github.com/marxjohnson…
Browse files Browse the repository at this point in the history
…/moodle into MOODLE_401_STABLE
  • Loading branch information
junpataleta committed Mar 21, 2023
2 parents ea915c2 + 5a7ad7b commit 28d1db2
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 2 deletions.
3 changes: 1 addition & 2 deletions mod/quiz/backup/moodle2/backup_quiz_stepslib.php
Expand Up @@ -49,7 +49,7 @@ protected function define_structure() {
$qinstances = new backup_nested_element('question_instances');

$qinstance = new backup_nested_element('question_instance', ['id'],
['slot', 'page', 'requireprevious', 'questionid', 'questioncategoryid', 'includingsubcategories', 'maxmark']);
['quizid', 'slot', 'page', 'requireprevious', 'maxmark']);

$this->add_question_references($qinstance, 'mod_quiz', 'slot');

Expand Down Expand Up @@ -145,7 +145,6 @@ protected function define_structure() {
$attempt->set_source_alias('attempt', 'attemptnum');

// Define id annotations.
$qinstance->annotate_ids('question', 'questionid');
$override->annotate_ids('user', 'userid');
$override->annotate_ids('group', 'groupid');
$grade->annotate_ids('user', 'userid');
Expand Down
71 changes: 71 additions & 0 deletions mod/quiz/tests/quiz_question_restore_test.php
Expand Up @@ -379,4 +379,75 @@ public function test_pre_4_quiz_restore_for_random_question_tags() {
}

}

/**
* Ensure that question slots are correctly backed up and restored with all properties.
*
* @covers \backup_quiz_activity_structure_step::define_structure()
* @return void
*/
public function test_backup_restore_question_slots(): void {
$this->resetAfterTest(true);

$course1 = $this->getDataGenerator()->create_course();
$course2 = $this->getDataGenerator()->create_course();

$user1 = $this->getDataGenerator()->create_and_enrol($course1, 'editingteacher');
$this->getDataGenerator()->enrol_user($user1->id, $course2->id, 'editingteacher');

// Make a quiz.
$quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz');

$quiz = $quizgenerator->create_instance(['course' => $course1->id, 'questionsperpage' => 0, 'grade' => 100.0,
'sumgrades' => 3]);

// Create some fixed and random questions.
$questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');

$cat = $questiongenerator->create_question_category();
$saq = $questiongenerator->create_question('shortanswer', null, ['category' => $cat->id]);
$numq = $questiongenerator->create_question('numerical', null, ['category' => $cat->id]);
$matchq = $questiongenerator->create_question('match', null, ['category' => $cat->id]);
$randomcat = $questiongenerator->create_question_category();
$questiongenerator->create_question('shortanswer', null, ['category' => $randomcat->id]);
$questiongenerator->create_question('numerical', null, ['category' => $randomcat->id]);
$questiongenerator->create_question('match', null, ['category' => $randomcat->id]);

// Add them to the quiz.
quiz_add_quiz_question($saq->id, $quiz, 1, 3);
quiz_add_quiz_question($numq->id, $quiz, 2, 2);
quiz_add_quiz_question($matchq->id, $quiz, 3, 1);
quiz_add_random_questions($quiz, 3, $randomcat->id, 2, false);

$quizobj = \quiz::create($quiz->id, $user1->id);
$originalstructure = \mod_quiz\structure::create_for_quiz($quizobj);
$originalslots = $originalstructure->get_slots();

// Set one slot to requireprevious.
$lastslot = end($originalslots);
$originalstructure->update_question_dependency($lastslot->id, true);

// Backup and restore the quiz.
$backupid = $this->backup_quiz($quiz, $user1);
$this->restore_quiz($backupid, $course2, $user1);

// Ensure the restored slots match the original slots.
$modinfo = get_fast_modinfo($course2);
$quizzes = $modinfo->get_instances_of('quiz');
$restoredquiz = reset($quizzes);
$restoredquizobj = \quiz::create($restoredquiz->instance, $user1->id);
$restoredstructure = \mod_quiz\structure::create_for_quiz($restoredquizobj);
$restoredslots = array_values($restoredstructure->get_slots());
$originalstructure = \mod_quiz\structure::create_for_quiz($quizobj);
$originalslots = array_values($originalstructure->get_slots());
foreach ($restoredslots as $key => $restoredslot) {
$originalslot = $originalslots[$key];
$this->assertEquals($originalslot->quizid, $quiz->id);
$this->assertEquals($restoredslot->quizid, $restoredquiz->instance);
$this->assertEquals($originalslot->slot, $restoredslot->slot);
$this->assertEquals($originalslot->page, $restoredslot->page);
$this->assertEquals($originalslot->requireprevious, $restoredslot->requireprevious);
$this->assertEquals($originalslot->maxmark, $restoredslot->maxmark);
}
}
}

0 comments on commit 28d1db2

Please sign in to comment.