MDL-85166 question: Update move_question_set_references

This backports the applicable part of MDL-85210 to 4.5.

move_question_set_references expected the set reference to use the old
filter format.

This change converts the filter to the new format if required, before
updating the category and context ids.
This commit is contained in:
Mark Johnson
2025-08-11 10:55:50 +01:00
parent fb02f4fa9f
commit 47fb08fc6d
2 changed files with 112 additions and 9 deletions
+102
View File
@@ -16,6 +16,8 @@
namespace core;
use core_question\local\bank\question_bank_helper;
use mod_quiz\quiz_settings;
use question_bank;
defined('MOODLE_INTERNAL') || die();
@@ -2437,4 +2439,104 @@ final class questionlib_test extends \advanced_testcase {
$this->assertEquals(2, $nextversion);
}
/**
* Update the context for a set reference, keeping the original category.
*
* @covers ::move_question_set_references()
*/
public function test_move_question_set_references_context(): void {
$this->setAdminUser();
$sitecontext = \context_system::instance();
$topcategory = question_get_top_category($sitecontext->id, true);
$randomcategory = self::getDataGenerator()->get_plugin_generator('core_question')->create_question_category(
['parent' => $topcategory->id],
);
// Create a course with a quiz containing a random question from the system context.
$randomcourse = self::getDataGenerator()->create_course(['shortname' => 'Random']);
$coursecontext = \context_course::instance($randomcourse->id);
$randomquiz = self::getDataGenerator()->get_plugin_generator('mod_quiz')->create_instance(
[
'course' => $randomcourse->id,
'grade' => 100.0,
'sumgrades' => 2,
'layout' => '1,0',
],
);
$randomquizsettings = quiz_settings::create($randomquiz->id);
$structure = $randomquizsettings->get_structure();
$filtercondition = [
'filter' => [
'category' => [
'jointype' => \core_question\local\bank\condition::JOINTYPE_DEFAULT,
'values' => [$randomcategory->id],
'filteroptions' => ['includesubcategories' => true],
],
],
];
$structure->add_random_questions(1, 1, $filtercondition);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $sitecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $randomcategory->id);
move_question_set_references($randomcategory->id, $randomcategory->id, $sitecontext->id, $coursecontext->id);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $coursecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $randomcategory->id);
}
/**
* Update the context and category for a set reference.
*
* @covers ::move_question_set_references()
*/
public function test_move_question_set_references_category(): void {
$this->setAdminUser();
$sitecontext = \context_system::instance();
$sitetopcategory = question_get_top_category($sitecontext->id, true);
// Create a course with a quiz containing a random question from the system context.
$randomcourse = self::getDataGenerator()->create_course(['shortname' => 'Random']);
$coursecontext = \context_course::instance($randomcourse->id);
$coursetopcategory = question_get_top_category($coursecontext->id, true);
$randomquiz = self::getDataGenerator()->get_plugin_generator('mod_quiz')->create_instance(
[
'course' => $randomcourse->id,
'grade' => 100.0,
'sumgrades' => 2,
'layout' => '1,0',
],
);
$randomquizsettings = quiz_settings::create($randomquiz->id);
$structure = $randomquizsettings->get_structure();
$filtercondition = [
'filter' => [
'category' => [
'jointype' => \core_question\local\bank\condition::JOINTYPE_DEFAULT,
'values' => [$sitetopcategory->id],
'filteroptions' => ['includesubcategories' => true],
],
],
];
$structure->add_random_questions(1, 1, $filtercondition);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $sitecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $sitetopcategory->id);
move_question_set_references($sitetopcategory->id, $coursetopcategory->id, $sitecontext->id, $coursecontext->id);
$structure = $randomquizsettings->get_structure();
$randomquestion = $structure->get_question_in_slot(1);
$this->assertEquals($randomquestion->contextid, $coursecontext->id);
$this->assertEquals($randomquestion->filtercondition['filter']['category']['values'][0], $coursetopcategory->id);
}
}