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 311 and 400] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403]

   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  /**
  18   * Unit tests for the select missing words question edit form.
  19   *
  20   * @package   qtype_gapselect
  21   * @copyright 2012 The Open University
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace qtype_gapselect\form;
  26  
  27  use question_edit_contexts;
  28  
  29  defined('MOODLE_INTERNAL') || die();
  30  global $CFG;
  31  
  32  require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
  33  require_once($CFG->dirroot . '/question/type/edit_question_form.php');
  34  require_once($CFG->dirroot . '/question/type/gapselect/edit_gapselect_form.php');
  35  
  36  
  37  /**
  38   * Subclass of qtype_gapselect_edit_form_base that is easier to used in unit tests.
  39   *
  40   * @package   qtype_gapselect
  41   * @copyright 2012 The Open University
  42   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  43   */
  44  class qtype_gapselect_edit_form_base_testable extends \qtype_gapselect_edit_form_base {
  45      public function get_illegal_tag_error($text) {
  46          return parent::get_illegal_tag_error($text);
  47      }
  48  
  49      /**
  50       * Set the list of allowed tags.
  51       * @param array $allowed
  52       */
  53      public function set_allowed_tags(array $allowed) {
  54          $this->allowedhtmltags = $allowed;
  55      }
  56  
  57      public function qtype() {
  58          return 'gapselect';
  59      }
  60  }
  61  
  62  
  63  /**
  64   * Unit tests for select missing words question edit form.
  65   *
  66   * @copyright  2012 The Open University
  67   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  68   */
  69  class edit_form_test extends \advanced_testcase {
  70  
  71      /**
  72       * Helper method.
  73       *
  74       * @param string $classname the question form class to instantiate.
  75       *
  76       *
  77       * @return array with two elements:
  78       *      question_edit_form great a question form instance that can be tested.
  79       *      stdClass the question category.
  80       */
  81      protected function get_form($classname) {
  82          $this->setAdminUser();
  83          $this->resetAfterTest();
  84  
  85          $syscontext = \context_system::instance();
  86          $category = question_make_default_categories(array($syscontext));
  87          $fakequestion = new \stdClass();
  88          $fakequestion->qtype = 'gapselect'; // Does not actually matter if this is wrong.
  89          $fakequestion->contextid = $syscontext->id;
  90          $fakequestion->createdby = 2;
  91          $fakequestion->category = $category->id;
  92          $fakequestion->questiontext = 'Test [[1]] question [[2]]';
  93          $fakequestion->options = new \stdClass();
  94          $fakequestion->options->answers = array();
  95          $fakequestion->formoptions = new \stdClass();
  96          $fakequestion->formoptions->movecontext = null;
  97          $fakequestion->formoptions->repeatelements = true;
  98          $fakequestion->inputs = null;
  99  
 100          $form = new $classname(new \moodle_url('/'), $fakequestion, $category,
 101                  new question_edit_contexts($syscontext));
 102  
 103          return [$form, $category];
 104      }
 105  
 106      public function test_get_illegal_tag_error() {
 107          list($form) = $this->get_form('\qtype_gapselect\form\qtype_gapselect_edit_form_base_testable');
 108  
 109          $this->assertEquals('', $form->get_illegal_tag_error('frog'));
 110          $this->assertEquals('', $form->get_illegal_tag_error('<i>toad</i>'));
 111  
 112          $a = new \stdClass();
 113          $a->tag = '&lt;ijk&gt;';
 114          $a->allowed = '&lt;sub&gt;, &lt;sup&gt;, &lt;b&gt;, &lt;i&gt;, &lt;em&gt;, &lt;strong&gt;, &lt;span&gt;';
 115          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('<ijk>'));
 116  
 117          $a->tag = '&lt;/cat&gt;';
 118          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('</cat>'));
 119  
 120          $a->tag = '&lt;br /&gt;';
 121          $this->assertEquals(get_string('tagsnotallowed', 'qtype_gapselect', $a), $form->get_illegal_tag_error('<i><br /></i>'));
 122  
 123          $form->set_allowed_tags(array());
 124  
 125          $this->assertEquals('', $form->get_illegal_tag_error('frog'));
 126  
 127          $a->tag = '&lt;i&gt;';
 128          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 129                  $form->get_illegal_tag_error('<i>toad</i>'));
 130  
 131          $a->tag = '&lt;ijk&gt;';
 132          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 133                  $form->get_illegal_tag_error('<ijk>'));
 134  
 135          $a->tag = '&lt;/cat&gt;';
 136          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 137                  $form->get_illegal_tag_error('</cat>'));
 138  
 139          $a->tag = '&lt;i&gt;';
 140          $this->assertEquals(get_string('tagsnotallowedatall', 'qtype_gapselect', $a),
 141                  $form->get_illegal_tag_error('<i><br /></i>'));
 142      }
 143  
 144      /**
 145       * Test the form shows the right number of groups of choices.
 146       */
 147      public function test_number_of_choice_groups() {
 148          list($form) = $this->get_form('qtype_gapselect_edit_form');
 149          // Use reflection to get the protected property we need.
 150          $property = new \ReflectionProperty('qtype_gapselect_edit_form', '_form');
 151          $property->setAccessible(true);
 152          $mform = $property->getValue($form);
 153          $choices = $mform->getElement('choices[0]');
 154          $groupoptions = $choices->_elements[1];
 155          $this->assertCount(20, $groupoptions->_options);
 156      }
 157  
 158      /**
 159       * Test the form correctly validates the HTML allowed in choices.
 160       */
 161      public function test_choices_validation() {
 162          list($form, $category) = $this->get_form('qtype_gapselect_edit_form');
 163  
 164          $submitteddata = [
 165                  'category' => $category->id,
 166                  'questiontext' => ['text' => 'Test [[1]] question [[2]]', 'format' => FORMAT_HTML],
 167                  'choices' => [
 168                          ['answer' => 'frog'],
 169                          ['answer' => '<b>toad</b>'],
 170                  ],
 171          ];
 172  
 173          $errors = $form->validation($submitteddata, []);
 174  
 175          $this->assertArrayNotHasKey('choices[0]', $errors);
 176          $this->assertEquals('&lt;b&gt; is not allowed. (No HTML is allowed here.)',
 177                  $errors['choices[1]']);
 178      }
 179  }