first commit

This commit is contained in:
CHIEFSOFT\ameye
2024-09-30 18:11:26 -04:00
commit e592ca6823
27270 changed files with 5002257 additions and 0 deletions
@@ -0,0 +1,169 @@
@qbank @qbank_previewquestion
Feature: A teacher can preview questions in the question bank
In order to ensure the questions are properly created
As a teacher
I need to preview the questions
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| teacher1 | Teacher | 1 | teacher1@example.com |
And the following "courses" exist:
| fullname | shortname | format |
| Course 1 | C1 | weeks |
And the following "activities" exist:
| activity | name | course | idnumber |
| quiz | Test quiz | C1 | quiz1 |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
And the following "question categories" exist:
| contextlevel | reference | name |
| Course | C1 | Test questions |
And the following "questions" exist:
| questioncategory | qtype | name |
| Test questions | numerical | Test question to be previewed |
And I am on the "Test quiz" "mod_quiz > question bank" page logged in as "teacher1"
When I choose "Preview" action for "Test question to be previewed" in the question bank
Scenario: Question preview shows the question and other information
Then the state of "What is pi to two d.p.?" question is shown as "Not yet answered"
And I should see "(latest)"
And I should see "Marked out of 1.00"
And I should see "Technical information"
And I should see "Display options"
And I should see "Preview options"
And I should see "Comments"
And I click on "Comments" "link"
And I should see "Save comment"
And I should see "ID number"
And "Numerical" "icon" should exist
And I should see "Version"
And I click on "Preview options" "link"
And I should see "These settings are for testing the question. The options you select only affect the preview."
And I should see "Question version"
Scenario: Preview lets the teacher see what happens when an answer is saved
When I set the field "Answer:" to "1"
And I press "Save"
Then the state of "What is pi to two d.p.?" question is shown as "Answer saved"
Scenario: Preview lets the teacher see what happens when an answer is submitted
When I set the field "Answer:" to "3.14"
And I press "Submit and finish"
Then the state of "What is pi to two d.p.?" question is shown as "Correct"
Scenario: Preview lets the teacher see what happens with different review options
Given I set the field "Answer:" to "3.14"
And I press "Submit and finish"
And I press "Display options"
When I set the field "Whether correct" to "Not shown"
And I set the field "Decimal places in grades" to "5"
And I press "Update display options"
And I set the field "Answer:" to "3.14"
And I press "Submit and finish"
Then the state of "What is pi to two d.p.?" question is shown as "Complete"
And I should see "1.00000"
Scenario: Preview lets the teacher see what happens with different behaviours
When I press "Preview options"
And I set the field "How questions behave" to "Immediate feedback"
And I set the field "Marked out of" to "3"
And I press "Save preview options and start again"
And I set the field "Answer:" to "3.1"
And I press "Check"
Then the state of "What is pi to two d.p.?" question is shown as "Incorrect"
And I should see "Mark 0.00 out of 3.00"
And I should see "Not accurate enough."
Scenario: Preview lets the teacher "Start again" while previewing
Given I set the field "Answer:" to "1"
And I press "Submit and finish"
When I press "Start again"
Then the state of "What is pi to two d.p.?" question is shown as "Not yet answered"
Scenario: Preview lets the teacher "Fill in correct response" while previewing
When I press "Fill in correct responses"
Then the field "Answer:" matches value "3.14"
Scenario: Preview a question with very small grade
When I press "Preview options"
And I set the field "Marked out of" to "0.00000123456789"
And I press "Save preview options and start again"
Then the field "Marked out of" matches value "0.00000123456789"
Scenario: Question version is updated when edited and teacher can change question version
Given I should see "Version 1"
And I press "Close preview"
And I choose "Edit question" action for "Test question to be previewed" in the question bank
And I set the field "Question name" to "New version"
And I set the field "Question text" to "New text version"
And I click on "submitbutton" "button"
And I choose "Preview" action for "New version" in the question bank
When I expand all fieldsets
And I should see "Version 2"
And I should see "(latest)"
And I should see "New version"
And I should see "New text version"
And I should not see "Test question to be previewed"
And I should not see "Version 1"
And I should see "1" in the "Question version" "select"
And I should see "2" in the "Question version" "select"
And I set the field "Question version" to "1"
And I press "Save preview options and start again"
Then I should see "Version 1"
And I should not see "Version 2"
And I should not see "(latest)"
Scenario: The preview always uses the latest question version by default.
Given the following "core_question > updated questions" exist:
| questioncategory | question | questiontext |
| Test questions | Test question to be previewed | Question version 2 |
And I should see "Version 1 (latest)"
And I expand all fieldsets
And the field "Question version" matches value "Always latest"
And I set the field "Answer:" to "3.14"
And I press "Submit and finish"
And I should see "Version 1"
When I press "Start again"
Then I should not see "Version 1"
And I should see "Version 2 (latest)"
Scenario: Detect a newer version during always latest preview and offer to switch to the latest
Given I should not see "This preview is using version 1"
And the following "core_question > updated questions" exist:
| questioncategory | question | questiontext |
| Test questions | Test question to be previewed | Question version 2 |
And I should see "Version 1 (latest)"
And I set the field "Answer:" to "3.14"
When I press "Submit and finish"
And I should see "This preview is using an older version of the question."
And I press "Use latest version"
Then I should not see "Version 1"
And I should see "Version 2 (latest)"
Scenario: Previewing from the question history will not always show the latest version
Given I press "Close preview"
And the following "core_question > updated questions" exist:
| questioncategory | question | questiontext |
| Test questions | Test question to be previewed | Question version 2 |
And I choose "History" action for "Test question to be previewed" in the question bank
And I choose "Preview" action for "Test question to be previewed" in the question bank
And I should see "Version 1 (of 2)"
And I expand all fieldsets
And the field "Question version" matches value "1"
And I set the field "Answer:" to "3.14"
And I press "Submit and finish"
And I should see "Version 1 (of 2)"
And I should not see "The latest version is 2."
And the following "core_question > updated questions" exist:
| questioncategory | question | questiontext |
| Test questions | Test question to be previewed | Question version 3 |
When I press "Start again"
Then I should see "Version 1 (of 3)"
And I should not see "Version 3 (latest)"
Scenario: Question preview can be closed
And I press "Close preview"
Then I should not see "(latest)"
And I should see "Test quiz"
@@ -0,0 +1,43 @@
@qbank @qbank_previewquestion
Feature: Use the qbank plugin manager page for previewquestion
In order to check the plugin behaviour with enable and disable
Background:
Given the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
And the following "activities" exist:
| activity | name | course | idnumber |
| quiz | Test quiz | C1 | quiz1 |
And the following "question categories" exist:
| contextlevel | reference | name |
| Course | C1 | Test questions |
And the following "questions" exist:
| questioncategory | qtype | name | questiontext |
| Test questions | truefalse | First question | Answer the first question |
Scenario: Enable/disable previewquestion column from the base view
Given I log in as "admin"
When I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration
And I should see "Preview question"
And I click on "Disable" "link" in the "Preview question" "table_row"
And I am on the "Test quiz" "mod_quiz > question bank" page
Then the "Preview" item should not exist in the "Edit" action menu of the "First question" "table_row"
And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration
And I click on "Enable" "link" in the "Preview question" "table_row"
And I am on the "Test quiz" "mod_quiz > question bank" page
And the "Preview" item should exist in the "Edit" action menu of the "First question" "table_row"
Scenario: Enable/disable preview button from question edit form
Given I log in as "admin"
When I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration
And I should see "Preview question"
And I click on "Disable" "link" in the "Preview question" "table_row"
And I am on the "Test quiz" "mod_quiz > question bank" page
And I choose "Edit question" action for "First question" in the question bank
Then I should not see "Preview" in the "region-main" "region"
And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration
And I click on "Enable" "link" in the "Preview question" "table_row"
And I am on the "Test quiz" "mod_quiz > question bank" page
And I choose "Edit question" action for "First question" in the question bank
And I should see "Preview" in the "region-main" "region"
@@ -0,0 +1,271 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace qbank_previewquestion;
use context_course;
use moodle_url;
use core\plugininfo\qbank;
use question_bank;
use question_engine;
use stdClass;
/**
* Helper tests for question preview.
*
* @package qbank_previewquestion
* @copyright 2021 Catalyst IT Australia Pty Ltd
* @author Safat Shahin <safatshahin@catalyst-au.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @coversDefaultClass \qbank_previewquestion\helper
*/
class qbank_preview_helper_test extends \advanced_testcase {
/**
* @var bool|\context|\context_course $context
*/
public $context;
/**
* @var object $questiondata;
*/
public $questiondata;
/**
* @var \question_usage_by_activity $quba
*/
public $quba;
/**
* @var question_preview_options $options
*/
public $options;
/**
* @var \moodle_url $returnurl
*/
public $returnurl;
/**
* Test set up.
*
* This is executed before running any test in this file.
*/
public function setUp(): void {
global $USER;
$this->resetAfterTest();
$this->setAdminUser();
$generator = $this->getDataGenerator();
$questiongenerator = $generator->get_plugin_generator('core_question');
// Create a course.
$course = $generator->create_course();
$this->context = context_course::instance($course->id);
// Create a question in the default category.
$contexts = new \core_question\local\bank\question_edit_contexts($this->context);
$cat = question_make_default_categories($contexts->all());
$this->questiondata = $questiongenerator->create_question('numerical', null,
['name' => 'Example question', 'category' => $cat->id]);
$this->quba = question_engine::make_questions_usage_by_activity('core_question_preview',
\context_user::instance($USER->id));
$this->options = new question_preview_options($this->questiondata);
$this->options->load_user_defaults();
$this->options->set_from_request();
$this->returnurl = new moodle_url('/question/edit.php');
}
/**
* Test the preview action url from the helper class.
*
* @covers ::question_preview_action_url
*/
public function test_question_preview_action_url(): void {
$actionurl = helper::question_preview_action_url($this->questiondata->id, $this->quba->get_id(), $this->options,
$this->context, $this->returnurl, question_preview_options::ALWAYS_LATEST);
$params = [
'id' => $this->questiondata->id,
'previewid' => $this->quba->get_id(),
'returnurl' => $this->returnurl,
'courseid' => $this->context->instanceid,
'restartversion' => question_preview_options::ALWAYS_LATEST,
];
$params = array_merge($params, $this->options->get_url_params());
$expectedurl = new moodle_url('/question/bank/previewquestion/preview.php', $params);
$this->assertEquals($expectedurl, $actionurl);
}
/**
* Test the preview action url from the helper class when no restartversion is passed.
*
* @covers ::question_preview_action_url
*/
public function test_question_preview_action_url_no_restartversion(): void {
$actionurl = helper::question_preview_action_url($this->questiondata->id, $this->quba->get_id(), $this->options,
$this->context, $this->returnurl);
$params = [
'id' => $this->questiondata->id,
'previewid' => $this->quba->get_id(),
'returnurl' => $this->returnurl,
'courseid' => $this->context->instanceid
];
$params = array_merge($params, $this->options->get_url_params());
$expectedurl = new moodle_url('/question/bank/previewquestion/preview.php', $params);
$this->assertEquals($expectedurl, $actionurl);
}
/**
* Test the preview form url from the helper class.
*
* @covers ::question_preview_form_url
*/
public function test_question_preview_form_url(): void {
$formurl = helper::question_preview_form_url(
$this->questiondata->id, $this->context, $this->quba->get_id(), $this->returnurl);
$params = [
'id' => $this->questiondata->id,
'previewid' => $this->quba->get_id(),
'returnurl' => $this->returnurl,
'courseid' => $this->context->instanceid
];
$expectedurl = new moodle_url('/question/bank/previewquestion/preview.php', $params);
$this->assertEquals($expectedurl, $formurl);
}
/**
* Test the preview url from the helper class.
*
* @covers ::question_preview_url
*/
public function test_question_preview_url(): void {
$previewurl = helper::question_preview_url($this->questiondata->id, $this->options->behaviour, $this->options->maxmark,
$this->options, $this->options->variant, $this->context, null, question_preview_options::ALWAYS_LATEST);
$params = [
'id' => $this->questiondata->id,
'behaviour' => $this->options->behaviour,
'maxmark' => $this->options->maxmark,
'courseid' => $this->context->instanceid,
'restartversion' => question_preview_options::ALWAYS_LATEST,
];
// Extra params for options.
$params['correctness'] = $this->options->correctness;
$params['marks'] = $this->options->marks;
$params['markdp'] = $this->options->markdp;
$params['feedback'] = (bool) $this->options->feedback;
$params['generalfeedback'] = (bool) $this->options->generalfeedback;
$params['rightanswer'] = (bool) $this->options->rightanswer;
$params['history'] = (bool) $this->options->history;
$expectedurl = new moodle_url('/question/bank/previewquestion/preview.php', $params);
$this->assertEquals($expectedurl, $previewurl);
}
/**
* Test the preview url from the helper class.
*
* @covers ::question_preview_url
*/
public function test_question_preview_url_no_restartversion(): void {
$previewurl = helper::question_preview_url($this->questiondata->id, $this->options->behaviour, $this->options->maxmark,
$this->options, $this->options->variant, $this->context, null);
$params = [
'id' => $this->questiondata->id,
'behaviour' => $this->options->behaviour,
'maxmark' => $this->options->maxmark,
'courseid' => $this->context->instanceid,
];
// Extra params for options.
$params['correctness'] = $this->options->correctness;
$params['marks'] = $this->options->marks;
$params['markdp'] = $this->options->markdp;
$params['feedback'] = (bool) $this->options->feedback;
$params['generalfeedback'] = (bool) $this->options->generalfeedback;
$params['rightanswer'] = (bool) $this->options->rightanswer;
$params['history'] = (bool) $this->options->history;
$expectedurl = new moodle_url('/question/bank/previewquestion/preview.php', $params);
$this->assertEquals($expectedurl, $previewurl);
}
/**
* Test the preview comment callback if available.
*
* @covers ::get_preview_extra_elements
*/
public function test_get_preview_extra_elements(): void {
global $PAGE;
$PAGE->set_url('/');
$question = \question_bank::load_question($this->questiondata->id);
list($comment, $extraelements) = helper::get_preview_extra_elements($question, $this->context->instanceid);
if (qbank::is_plugin_enabled('qbank_comment')) {
$this->assertStringContainsString("comment-area", $comment);
} else {
$this->assertEquals('', $comment);
}
}
/**
* Test method load_versions().
*
* @covers ::load_versions
*/
public function test_load_versions(): void {
$this->resetAfterTest();
$generator = $this->getDataGenerator()->get_plugin_generator('core_question');
$qcat1 = $generator->create_question_category(['name' => 'My category', 'sortorder' => 1, 'idnumber' => 'myqcat']);
$questiongenerated = $generator->create_question('description', null, ['name' => 'q1', 'category' => $qcat1->id]);
$qtypeobj = question_bank::get_qtype($questiongenerated->qtype);
$question = question_bank::load_question($questiongenerated->id);
$versionids = helper::load_versions($question->questionbankentryid);
$this->assertEquals([
$question->id => 1,
], $versionids);
$fromform = new stdClass();
$fromform->name = 'Name edited';
$fromform->category = $qcat1->id;
$questiontwo = $qtypeobj->save_question($questiongenerated, $fromform);
$versionids = helper::load_versions($question->questionbankentryid);
$this->assertSame([
$question->id => 1,
$questiontwo->id => 2,
], $versionids);
}
/**
* Test method get_restart_id().
*
* This should return the value of the specified version number, or the latest version if ALWAYS_LATEST is passed.
*
* @covers ::get_restart_id
* @return void
*/
public function test_get_restart_id(): void {
$versions = [
100 => 1,
200 => 2,
300 => 3
];
$this->assertEquals(100, helper::get_restart_id($versions, 1));
$this->assertEquals(200, helper::get_restart_id($versions, 2));
$this->assertEquals(300, helper::get_restart_id($versions, 3));
$this->assertEquals(300, helper::get_restart_id($versions, question_preview_options::ALWAYS_LATEST));
$this->assertNull(helper::get_restart_id($versions, 4));
$this->assertNull(helper::get_restart_id([], 1));
$this->assertNull(helper::get_restart_id([], question_preview_options::ALWAYS_LATEST));
}
}