Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 39 and 401]

   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_customfield;
  18  
  19  use core_customfield_generator;
  20  use customfield_checkbox;
  21  use customfield_date;
  22  use customfield_select;
  23  use customfield_text;
  24  use customfield_textarea;
  25  
  26  /**
  27   * Functional test for class data_controller.
  28   *
  29   * @package    core_customfield
  30   * @category   test
  31   * @copyright  2018 Toni Barbera <toni@moodle.com>
  32   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  33   */
  34  class data_controller_test extends \advanced_testcase {
  35  
  36      /**
  37       * Get generator.
  38       *
  39       * @return core_customfield_generator
  40       */
  41      protected function get_generator(): core_customfield_generator {
  42          return $this->getDataGenerator()->get_plugin_generator('core_customfield');
  43      }
  44  
  45      /**
  46       * Test for function data_controller::create()
  47       */
  48      public function test_constructor() {
  49          global $DB;
  50          $this->resetAfterTest();
  51  
  52          // Create a course, fields category and fields.
  53          $course = $this->getDataGenerator()->create_course();
  54          $category0 = $this->get_generator()->create_category(['name' => 'aaaa']);
  55  
  56          // Add fields to this category.
  57          $fielddata                = new \stdClass();
  58          $fielddata->categoryid    = $category0->get('id');
  59          $fielddata->configdata    = "{\"required\":\"0\",\"uniquevalues\":\"0\",\"locked\":\"0\",\"visibility\":\"0\",
  60                                      \"defaultvalue\":\"\",\"displaysize\":0,\"maxlength\":0,\"ispassword\":\"0\",
  61                                      \"link\":\"\",\"linktarget\":\"\"}";
  62  
  63          $fielddata->type = 'checkbox';
  64          $field0 = $this->get_generator()->create_field($fielddata);
  65          $fielddata->type = 'date';
  66          $field1 = $this->get_generator()->create_field($fielddata);
  67          $fielddata->type = 'select';
  68          $field2 = $this->get_generator()->create_field($fielddata);
  69          $fielddata->type = 'text';
  70          $field3 = $this->get_generator()->create_field($fielddata);
  71          $fielddata->type = 'textarea';
  72          $field4 = $this->get_generator()->create_field($fielddata);
  73  
  74          $params = ['instanceid' => $course->id, 'contextid' => \context_course::instance($course->id)->id];
  75  
  76          // Generate new data_controller records for these fields, specifying field controller or fieldid or both.
  77          $data0 = data_controller::create(0, (object)$params, $field0);
  78          $this->assertInstanceOf(customfield_checkbox\data_controller::class, $data0);
  79          $data1 = data_controller::create(0,
  80              (object)($params + ['fieldid' => $field1->get('id')]), $field1);
  81          $this->assertInstanceOf(customfield_date\data_controller::class, $data1);
  82          $data2 = data_controller::create(0,
  83              (object)($params + ['fieldid' => $field2->get('id')]));
  84          $this->assertInstanceOf(customfield_select\data_controller::class, $data2);
  85          $data3 = data_controller::create(0, (object)$params, $field3);
  86          $this->assertInstanceOf(customfield_text\data_controller::class, $data3);
  87          $data4 = data_controller::create(0, (object)$params, $field4);
  88          $this->assertInstanceOf(customfield_textarea\data_controller::class, $data4);
  89  
  90          // Save data so we can have ids.
  91          $data0->save();
  92          $data1->save();
  93          $data2->save();
  94          $data3->save();
  95          $data4->save();
  96  
  97          // Retrieve data by id.
  98          $this->assertInstanceOf(customfield_checkbox\data_controller::class, data_controller::create($data0->get('id')));
  99          $this->assertInstanceOf(customfield_date\data_controller::class, data_controller::create($data1->get('id')));
 100  
 101          // Retrieve data by id and field.
 102          $this->assertInstanceOf(customfield_select\data_controller::class,
 103              data_controller::create($data2->get('id'), null, $field2));
 104  
 105          // Retrieve data by record without field.
 106          $datarecord = $DB->get_record(\core_customfield\data::TABLE, ['id' => $data3->get('id')], '*', MUST_EXIST);
 107          $this->assertInstanceOf(customfield_text\data_controller::class, data_controller::create(0, $datarecord));
 108  
 109          // Retrieve data by record with field.
 110          $datarecord = $DB->get_record(\core_customfield\data::TABLE, ['id' => $data4->get('id')], '*', MUST_EXIST);
 111          $this->assertInstanceOf(customfield_textarea\data_controller::class, data_controller::create(0, $datarecord, $field4));
 112  
 113      }
 114  
 115      /**
 116       * Test for function \core_customfield\field_controller::create() in case of wrong parameters
 117       */
 118      public function test_constructor_errors() {
 119          global $DB;
 120          $this->resetAfterTest();
 121  
 122          // Create a category, field and data.
 123          $category = $this->get_generator()->create_category();
 124          $field = $this->get_generator()->create_field(['categoryid' => $category->get('id')]);
 125          $course = $this->getDataGenerator()->create_course();
 126          $data = data_controller::create(0, (object)['instanceid' => $course->id,
 127              'contextid' => \context_course::instance($course->id)->id], $field);
 128          $data->save();
 129  
 130          $datarecord = $DB->get_record(\core_customfield\data::TABLE, ['id' => $data->get('id')], '*', MUST_EXIST);
 131  
 132          // Both id and record give warning.
 133          $d = data_controller::create($datarecord->id, $datarecord);
 134          $debugging = $this->getDebuggingMessages();
 135          $this->assertEquals(1, count($debugging));
 136          $this->assertEquals('Too many parameters, either id need to be specified or a record, but not both.',
 137              $debugging[0]->message);
 138          $this->resetDebugging();
 139          $this->assertInstanceOf(customfield_text\data_controller::class, $d);
 140  
 141          // Retrieve non-existing data.
 142          try {
 143              data_controller::create($datarecord->id + 1);
 144              $this->fail('Expected exception');
 145          } catch (\dml_missing_record_exception $e) {
 146              $this->assertStringMatchesFormat('Can\'t find data record in database table customfield_data%a', $e->getMessage());
 147              $this->assertEquals(\dml_missing_record_exception::class, get_class($e));
 148          }
 149  
 150          // Missing field id.
 151          try {
 152              data_controller::create(0, (object)['instanceid' => $course->id]);
 153              $this->fail('Expected exception');
 154          } catch (\coding_exception $e) {
 155              $this->assertEquals('Coding error detected, it must be fixed by a programmer: Not enough parameters to ' .
 156                  'initialise data_controller - unknown field', $e->getMessage());
 157              $this->assertEquals(\coding_exception::class, get_class($e));
 158          }
 159  
 160          // Mismatching field id.
 161          try {
 162              data_controller::create(0, (object)['instanceid' => $course->id, 'fieldid' => $field->get('id') + 1], $field);
 163              $this->fail('Expected exception');
 164          } catch (\coding_exception $e) {
 165              $this->assertEquals('Coding error detected, it must be fixed by a programmer: Field id from the record ' .
 166                  'does not match field from the parameter', $e->getMessage());
 167              $this->assertEquals(\coding_exception::class, get_class($e));
 168          }
 169  
 170          // Nonexisting class.
 171          try {
 172              $field->set('type', 'invalid');
 173              data_controller::create(0, (object)['instanceid' => $course->id], $field);
 174              $this->fail('Expected exception');
 175          } catch (\moodle_exception $e) {
 176              $this->assertEquals('Field type invalid not found', $e->getMessage());
 177              $this->assertEquals(\moodle_exception::class, get_class($e));
 178          }
 179      }
 180  }