Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

Differences Between: [Versions 310 and 311] [Versions 311 and 400] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403] [Versions 39 and 311]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  namespace core_question;
  18  
  19  use question_bank;
  20  use question_display_options;
  21  
  22  defined('MOODLE_INTERNAL') || die();
  23  
  24  global $CFG;
  25  require_once (__DIR__ . '/..//lib.php');
  26  require_once (__DIR__ . '/helpers.php');
  27  
  28  
  29  /**
  30   * End-to-end tests of attempting a question.
  31   *
  32   * @package    core_question
  33   * @copyright  2017 The Open University
  34   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  35   */
  36  class walkthrough_test extends \qbehaviour_walkthrough_test_base {
  37  
  38      public function test_regrade_does_not_lose_flag() {
  39  
  40          // Create a true-false question with correct answer true.
  41          $tf = \test_question_maker::make_question('truefalse', 'true');
  42          $this->start_attempt_at_question($tf, 'deferredfeedback', 2);
  43  
  44          // Process a true answer.
  45          $this->process_submission(array('answer' => 1));
  46  
  47          // Finish the attempt.
  48          $this->quba->finish_all_questions();
  49  
  50          // Flag the question.
  51          $this->get_question_attempt()->set_flagged(true);
  52  
  53          // Now change the correct answer to the question, and regrade.
  54          $tf->rightanswer = false;
  55          $this->quba->regrade_all_questions();
  56  
  57          // Verify the flag has not been lost.
  58          $this->assertTrue($this->get_question_attempt()->is_flagged());
  59      }
  60  
  61      /**
  62       * Test action_author function.
  63       */
  64      public function test_action_author_with_display_options_testcase() {
  65          $this->resetAfterTest(true);
  66          $generator = $this->getDataGenerator()->get_plugin_generator('core_question');
  67          $teacher = $this->getDataGenerator()->create_user();
  68          $student = $this->getDataGenerator()->create_user();
  69  
  70          // Create an essay question in the DB.
  71          $cat = $generator->create_question_category();
  72          $essay = $generator->create_question('essay', 'editorfilepicker', ['category' => $cat->id]);
  73  
  74          // Start attempt at the question.
  75          $q = question_bank::load_question($essay->id);
  76  
  77          // Student attempt the question.
  78          $this->setUser($student);
  79          $this->start_attempt_at_question($q, 'deferredfeedback', 10, 1);
  80  
  81          // Simulate some data submitted by the student.
  82          $this->process_submission(['answer' => 'This is my wonderful essay!', 'answerformat' => FORMAT_HTML]);
  83          $this->finish();
  84  
  85          // Process a manual comment.
  86          $this->setUser($teacher);
  87          $this->manual_grade('Not good enough!', 10, FORMAT_HTML);
  88          $this->render();
  89          $this->save_quba();
  90  
  91          // Set display option userinfoinhistory to HIDDEN.
  92          $displayoptions = new question_display_options();
  93          $displayoptions->history = question_display_options::VISIBLE;
  94          $displayoptions->userinfoinhistory = question_display_options::HIDDEN;
  95  
  96          $this->load_quba();
  97          $result = $this->quba->render_question($this->slot, $displayoptions);
  98  
  99          // The profile user link should not display.
 100          preg_match("/<a ?.*>(.*)<\/a>/", $result, $matches);
 101          $this->assertEquals(false, isset($matches[0]));
 102  
 103          // Set display option userinfoinhistory to SHOW_ALL.
 104          $displayoptions = new question_display_options();
 105          $displayoptions->history = question_display_options::VISIBLE;
 106          $displayoptions->userinfoinhistory = question_display_options::SHOW_ALL;
 107  
 108          $this->load_quba();
 109          $result = $this->quba->render_question($this->slot, $displayoptions);
 110          $numsteps = $this->quba->get_question_attempt($this->slot)->get_num_steps();
 111  
 112          // All steps in the result should contain user profile link.
 113          preg_match_all("/<a ?.*>(.*)<\/a>/", $result, $matches);
 114          $this->assertEquals($numsteps, count($matches[0]));
 115  
 116          // Set the userinfoinhistory to student id.
 117          $displayoptions = new question_display_options();
 118          $displayoptions->history = question_display_options::VISIBLE;
 119          $displayoptions->userinfoinhistory = $student->id;
 120  
 121          $this->load_quba();
 122          $result = $this->quba->render_question($this->slot, $displayoptions);
 123  
 124          // The step just show the user profile link if the step's userid is different with student id.
 125          preg_match_all("/<a ?.*>(.*)<\/a>/", $result, $matches);
 126          $this->assertEquals(1, count($matches[0]));
 127      }
 128  }