From 7884d5b7790eaec0ee13380dd5e96cebb5463ea2 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Fri, 8 Mar 2024 17:20:26 +0000 Subject: [PATCH] MDL-81114 question: fix selection of random questions with draft status We need to pick the latest 'ready' version of each question (not questions where the latest version is ready). --- question/engine/bank.php | 8 ++-- .../tests/random_question_loader_test.php | 42 ++++++++++++++++++- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/question/engine/bank.php b/question/engine/bank.php index 8fc5337d0a9..9aadb58eefa 100644 --- a/question/engine/bank.php +++ b/question/engine/bank.php @@ -614,12 +614,10 @@ class question_finder implements cache_data_source { $from = $from . " " . $join; $where = "qbe.questioncategoryid {$qcsql} AND q.parent = 0 - AND qv.status = '$readystatus' - AND qv.version = (SELECT MAX(v.version) + AND qv.version = (SELECT MAX(version) FROM {question_versions} v - JOIN {question_bank_entries} be - ON be.id = v.questionbankentryid - WHERE be.id = qbe.id)"; + WHERE questionbankentryid = qbe.id + AND status = '$readystatus')"; $params = $qcparams; if (!empty($tagids)) { diff --git a/question/tests/random_question_loader_test.php b/question/tests/random_question_loader_test.php index 8e706765ef3..600e82bebb8 100644 --- a/question/tests/random_question_loader_test.php +++ b/question/tests/random_question_loader_test.php @@ -16,6 +16,9 @@ namespace core_question; +use core_question\local\bank\question_version_status; +use core_question\local\bank\random_question_loader; +use core_question_generator; use qubaid_list; use question_bank; use question_engine; @@ -24,8 +27,9 @@ use question_engine; * Tests for the {@see core_question\local\bank\random_question_loader} class. * * @package core_question - * @copyright 2015 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @copyright 2015 The Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \core_question\local\bank\random_question_loader */ class random_question_loader_test extends \advanced_testcase { @@ -97,6 +101,40 @@ class random_question_loader_test extends \advanced_testcase { $this->assertNull($loader->get_next_question_id($cat->id, 0)); } + public function test_draft_questions_not_returned(): void { + $this->resetAfterTest(); + $this->setAdminUser(); + /** @var core_question_generator $questiongenerator */ + $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); + + // Create a question in draft state. + $category = $questiongenerator->create_question_category(); + $questiongenerator->create_question('shortanswer', null, + ['category' => $category->id, 'status' => question_version_status::QUESTION_STATUS_DRAFT]); + + // Try to a random question from that category - should not be one. + $loader = new random_question_loader(new qubaid_list([])); + $this->assertNull($loader->get_next_question_id($category->id, false)); + } + + public function test_questions_with_later_draft_version_is_returned(): void { + $this->resetAfterTest(); + $this->setAdminUser(); + /** @var core_question_generator $questiongenerator */ + $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); + + // Create a question in draft state. + $category = $questiongenerator->create_question_category(); + $question = $questiongenerator->create_question('shortanswer', null, + ['questiontext' => 'V1', 'category' => $category->id]); + $questiongenerator->update_question($question, null, + ['questiontext' => 'V2', 'status' => question_version_status::QUESTION_STATUS_DRAFT]); + + // Try to a random question from that category - should get V1. + $loader = new random_question_loader(new qubaid_list([])); + $this->assertEquals($question->id, $loader->get_next_question_id($category->id, false)); + } + public function test_one_question_category_returns_that_q_then_null() { $this->resetAfterTest(); $generator = $this->getDataGenerator()->get_plugin_generator('core_question');