diff --git a/question/classes/local/bank/context_to_string_translator.php b/question/classes/local/bank/context_to_string_translator.php index 278db11481b..1e2d53c8be6 100644 --- a/question/classes/local/bank/context_to_string_translator.php +++ b/question/classes/local/bank/context_to_string_translator.php @@ -68,6 +68,7 @@ class context_to_string_translator { protected function generate_context_to_string_array($contexts) { if (!$this->contexttostringarray) { $catno = 1; + /** @var \context $context */ foreach ($contexts as $context) { switch ($context->contextlevel) { case CONTEXT_MODULE : @@ -83,6 +84,11 @@ class context_to_string_translator { case CONTEXT_SYSTEM : $contextstring = 'system'; break; + default: + throw new \coding_exception('Unexpected context level ' . + \context_helper::get_level_name($context->contextlevel) . ' for context ' . + $context->id . ' in generate_context_to_string_array. ' . + 'Questions can never exist in this type of context.'); } $this->contexttostringarray[$context->id] = $contextstring; } diff --git a/question/tests/local/bank/context_to_string_translator_test.php b/question/tests/local/bank/context_to_string_translator_test.php new file mode 100644 index 00000000000..d761861d752 --- /dev/null +++ b/question/tests/local/bank/context_to_string_translator_test.php @@ -0,0 +1,79 @@ +. + +namespace core_question\local\bank; + +use context_course; +use context_coursecat; +use context_module; +use context_system; +use context_user; + +/** + * Unit tests for the context_to_string_translator class. + * + * @package core_question + * @category test + * @copyright 2023 the Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \core_question\local\bank\context_to_string_translator + */ +class context_to_string_translator_test extends \advanced_testcase { + + public function test_context_to_string_translator_test_good_case() { + $this->resetAfterTest(); + $generator = $this->getDataGenerator(); + + // Generate a quiz in a course in a category. + $systemcontext = context_system::instance(); + + $category = $generator->create_category(); + $categorycontext = context_coursecat::instance($category->id); + + $course = $generator->create_course(['category' => $category->id]); + $coursecontext = context_course::instance($course->id); + + $quiz = $generator->create_module('quiz', ['course' => $course->id]); + $quizcontext = context_module::instance($quiz->cmid); + + // Create the context_to_string_translator. + $translator = new context_to_string_translator((new question_edit_contexts($quizcontext))->all()); + + // Verify its behaviour. + $this->assertEquals('module', $translator->context_to_string($quizcontext->id)); + $this->assertEquals($quizcontext->id, $translator->string_to_context('module')); + + $this->assertEquals('course', $translator->context_to_string($coursecontext->id)); + $this->assertEquals($coursecontext->id, $translator->string_to_context('course')); + + $this->assertEquals('cat1', $translator->context_to_string($categorycontext->id)); + $this->assertEquals($categorycontext->id, $translator->string_to_context('cat1')); + + $this->assertEquals('system', $translator->context_to_string($systemcontext->id)); + $this->assertEquals($systemcontext->id, $translator->string_to_context('system')); + } + + public function test_context_to_string_translator_throws_exception_with_bad_context() { + global $USER; + $this->resetAfterTest(); + $this->setAdminUser(); + $context = context_user::instance($USER->id); + $this->expectExceptionMessage('Unexpected context level User for context ' . + $context->id . ' in generate_context_to_string_array. ' . + 'Questions can never exist in this type of context.'); + new context_to_string_translator((new question_edit_contexts($context))->all()); + } +}