From 61f11f848d36fa73231abac54e844fd68d5b49d6 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Tue, 1 Mar 2022 15:50:53 +0000 Subject: [PATCH] MDL-74007 quiz: questions should start as 'Always latest' version Thanks to Safat Shahin for help with the Behat scenarios. --- .../tests/quiz_restore_decode_links_test.php | 4 ++- mod/quiz/locallib.php | 7 ++--- .../behat/quiz_question_versions.feature | 24 ++++++++++++++ mod/quiz/tests/qbank_helper_test.php | 2 ++ mod/quiz/tests/quiz_question_version_test.php | 31 +++++++++---------- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/backup/tests/quiz_restore_decode_links_test.php b/backup/tests/quiz_restore_decode_links_test.php index 207ef02818b..3aa9a3f8e82 100644 --- a/backup/tests/quiz_restore_decode_links_test.php +++ b/backup/tests/quiz_restore_decode_links_test.php @@ -57,6 +57,8 @@ class restore_quiz_decode_testcase extends \core_privacy\tests\provider_testcase // Add to the quiz. quiz_add_quiz_question($question->id, $quiz); + mod_quiz\external\submit_question_version::execute( + $DB->get_field('quiz_slots', 'id', ['quizid' => $quiz->id, 'slot' => 1]), 1); $questiondata = question_bank::load_question_data($question->id); @@ -81,7 +83,7 @@ class restore_quiz_decode_testcase extends \core_privacy\tests\provider_testcase $quizquestions = \mod_quiz\question\bank\qbank_helper::get_question_structure_data($newcm->instance); $questionids = []; foreach ($quizquestions as $quizquestion) { - $questionids [] = $quizquestion->id; + $questionids[] = $quizquestion->id; } list($condition, $param) = $DB->get_in_or_equal($questionids, SQL_PARAMS_NAMED, 'questionid'); $condition = 'WHERE qa.question ' . $condition; diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index 1d3e2681605..72678e2f4e4 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -2396,9 +2396,7 @@ function quiz_add_quiz_question($questionid, $quiz, $page = 0, $maxmark = null) $questionreferences->questionarea = 'slot'; $questionreferences->itemid = $slotid; $questionreferences->questionbankentryid = get_question_bank_entry($questionid)->id; - $version = get_question_version($questionid); - $questionreferences->version = $version[array_key_first($version)]->version; - + $questionreferences->version = null; // Always latest. $DB->insert_record('question_references', $questionreferences); } else if ($qreferenceitem->itemid === 0 || $qreferenceitem->itemid === null) { @@ -2414,8 +2412,7 @@ function quiz_add_quiz_question($questionid, $quiz, $page = 0, $maxmark = null) $questionreferences->questionarea = 'slot'; $questionreferences->itemid = $slotid; $questionreferences->questionbankentryid = get_question_bank_entry($questionid)->id; - $version = get_question_version($questionid); - $questionreferences->version = $version[array_key_first($version)]->version; + $questionreferences->version = null; // Always latest. $DB->insert_record('question_references', $questionreferences); } diff --git a/mod/quiz/tests/behat/quiz_question_versions.feature b/mod/quiz/tests/behat/quiz_question_versions.feature index 0fd90eae083..061d38f6f71 100644 --- a/mod/quiz/tests/behat/quiz_question_versions.feature +++ b/mod/quiz/tests/behat/quiz_question_versions.feature @@ -76,3 +76,27 @@ Feature: Quiz question versioning And I press "id_saveupdate" And I click on "finish" "button" Then I should see "The correct answer is 'False'." + + @javascript + Scenario: Creating a new question should have always latest in the version selection + When I am on the "Quiz 1" "mod_quiz > Edit" page logged in as "teacher1" + And I click on "Add" "link" + And I follow "a new question" + And I set the field "item_qtype_essay" to "1" + And I press "submitbutton" + Then I should see "Adding an Essay question" + And I set the field "Question name" to "Essay 01 new" + And I set the field "Question text" to "Please write 200 words about Essay 01" + And I press "id_submitbutton" + And I should see "Essay 01 new" on quiz page "1" + And I should see "Always latest" on quiz page "1" + + @javascript + Scenario: Adding a question from question bank should have always latest in the version selection + When I am on the "Quiz 1" "mod_quiz > Edit" page logged in as "teacher1" + And I click on "Add" "link" + And I follow "from question bank" + And I set the field with xpath "//input[@type='checkbox' and @id='qbheadercheckbox']" to "1" + And I press "Add selected questions to the quiz" + And I should see "First question" on quiz page "1" + And I should see "Always latest" on quiz page "1" diff --git a/mod/quiz/tests/qbank_helper_test.php b/mod/quiz/tests/qbank_helper_test.php index 3fb59ac2606..4b06fc3815e 100644 --- a/mod/quiz/tests/qbank_helper_test.php +++ b/mod/quiz/tests/qbank_helper_test.php @@ -204,6 +204,7 @@ class qbank_helper_test extends \advanced_testcase { * @covers ::get_specific_version_question_ids */ public function test_get_specific_version_question_ids() { + global $DB; $this->resetAfterTest(); $quiz = $this->create_test_quiz($this->course); // Test for questions from a different context. @@ -217,6 +218,7 @@ class qbank_helper_test extends \advanced_testcase { $questiongenerator->update_question($numq, null, ['name' => 'This is the second version']); $questiongenerator->update_question($numq, null, ['name' => 'This is the third version']); quiz_add_quiz_question($numq->id, $quiz); + submit_question_version::execute($DB->get_field('quiz_slots', 'id', ['quizid' => $quiz->id, 'slot' => 1]), 3); $specificversionquestionid = qbank_helper::get_specific_version_question_ids($quiz->id); $specificversionquestionid = reset($specificversionquestionid); $this->assertEquals($numq->id, $specificversionquestionid); diff --git a/mod/quiz/tests/quiz_question_version_test.php b/mod/quiz/tests/quiz_question_version_test.php index 97c43a3aad6..c59250c28d9 100644 --- a/mod/quiz/tests/quiz_question_version_test.php +++ b/mod/quiz/tests/quiz_question_version_test.php @@ -72,7 +72,7 @@ class quiz_question_version_test extends \advanced_testcase { $structure = \mod_quiz\structure::create_for_quiz($quizobj); $slots = $structure->get_slots(); $slot = reset($slots); - // Test that the version added is the latest version, as there are three created. + // Test that the version added is 'always latest'. $this->assertEquals(3, $slot->version); $quizobj->preload_questions(); $quizobj->load_questions(); @@ -80,9 +80,22 @@ class quiz_question_version_test extends \advanced_testcase { $question = reset($questions); $this->assertEquals(3, $question->version); $this->assertEquals('This is the third version', $question->name); + // Create another version. + $questiongenerator->update_question($numq, null, ['name' => 'This is the latest version']); + // Check that 'Always latest is working'. + $quizobj->preload_questions(); + $quizobj->load_questions(); + $questions = $quizobj->get_questions(); + $question = reset($questions); + $this->assertEquals(4, $question->version); + $this->assertEquals('This is the latest version', $question->name); + $structure = \mod_quiz\structure::create_for_quiz($quizobj); + $slots = $structure->get_slots(); + $slot = reset($slots); + $this->assertEquals(4, $slot->version); // Now change the version using the external service. $versions = qbank_helper::get_version_options($slot->questionid); - // We dont want the current version. + // We don't want the current version. $selectversions = []; foreach ($versions as $version) { if ($version->version === $slot->version) { @@ -114,20 +127,6 @@ class quiz_question_version_test extends \advanced_testcase { $slots = $structure->get_slots(); $slot = reset($slots); $this->assertEquals(2, $slot->version); - // Create another version. - $questiongenerator->update_question($numq, null, ['name' => 'This is the latest version']); - // Change to always latest. - submit_question_version::execute($slot->id, 0); - $quizobj->preload_questions(); - $quizobj->load_questions(); - $questions = $quizobj->get_questions(); - $question = reset($questions); - $this->assertEquals(4, $question->version); - $this->assertEquals('This is the latest version', $question->name); - $structure = \mod_quiz\structure::create_for_quiz($quizobj); - $slots = $structure->get_slots(); - $slot = reset($slots); - $this->assertEquals(4, $slot->version); } /**