Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
     */
11 efrain 48
    public function test_constructor(): void {
1 efrain 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
     */
11 efrain 118
    public function test_constructor_errors(): void {
1 efrain 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
}