Proyectos de Subversion Moodle

Rev

| 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
declare(strict_types=1);
18
 
19
namespace core_course\reportbuilder\datasource;
20
 
21
use core_course_category;
22
use core_reportbuilder_generator;
23
use core_reportbuilder_testcase;
24
use core_reportbuilder\local\filters\{category, select, text};
25
 
26
defined('MOODLE_INTERNAL') || die();
27
 
28
global $CFG;
29
require_once("{$CFG->dirroot}/reportbuilder/tests/helpers.php");
30
 
31
/**
32
 * Unit tests for course categories datasource
33
 *
34
 * @package     core_course
35
 * @covers      \core_course\reportbuilder\datasource\categories
36
 * @copyright   2023 Paul Holden <paulh@moodle.com>
37
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38
 */
39
class categories_test extends core_reportbuilder_testcase {
40
 
41
    /**
42
     * Test default datasource
43
     */
44
    public function test_datasource_default(): void {
45
        $this->resetAfterTest();
46
 
47
        $category = $this->getDataGenerator()->create_category(['name' => 'Zoo', 'idnumber' => 'Z01']);
48
        $course = $this->getDataGenerator()->create_course(['category' => $category->id]);
49
 
50
        /** @var core_reportbuilder_generator $generator */
51
        $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
52
        $report = $generator->create_report(['name' => 'My report', 'source' => categories::class, 'default' => 1]);
53
 
54
        $content = $this->get_custom_report_content($report->get('id'));
55
        $this->assertCount(2, $content);
56
 
57
        // Default columns are name, idnumber, coursecount. Sorted by name ascending.
58
        $this->assertEquals([
59
            [get_string('defaultcategoryname'), '', 0],
60
            [$category->get_formatted_name(), $category->idnumber, 1],
61
        ], array_map('array_values', $content));
62
    }
63
 
64
    /**
65
     * Test datasource columns that aren't added by default
66
     */
67
    public function test_datasource_non_default_columns(): void {
68
        global $DB;
69
 
70
        $this->resetAfterTest();
71
 
72
        set_config('allowcategorythemes', true);
73
 
74
        $category = $this->getDataGenerator()->create_category([
75
            'name' => 'Zoo',
76
            'idnumber' => 'Z01',
77
            'description' => 'Animals',
78
            'theme' => 'boost',
79
        ]);
80
        $course = $this->getDataGenerator()->create_course(['category' => $category->id, 'fullname' => 'Zebra']);
81
 
82
        // Add a cohort.
83
        $cohort = $this->getDataGenerator()->create_cohort(['contextid' => $category->get_context()->id, 'name' => 'My cohort']);
84
 
85
        // Assign a role.
86
        $managerrole = $DB->get_field('role', 'id', ['shortname' => 'manager']);
87
        $user = $this->getDataGenerator()->create_user();
88
        role_assign($managerrole, $user->id, $category->get_context()->id);
89
 
90
        /** @var core_reportbuilder_generator $generator */
91
        $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
92
        $report = $generator->create_report(['name' => 'My report', 'source' => categories::class, 'default' => 0]);
93
 
94
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:namewithlink',
95
            'sortenabled' => 1]);
96
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:path']);
97
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:description']);
98
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:theme']);
99
 
100
        // Add column from each of our entities.
101
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course:fullname']);
102
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'cohort:name']);
103
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'role:name']);
104
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);
105
 
106
        $content = $this->get_custom_report_content($report->get('id'));
107
        $this->assertCount(2, $content);
108
 
109
        [$namewithlink, $path, $description, $theme, $coursename, $cohortname, $rolename, $userfullname] =
110
            array_values($content[0]);
111
        $this->assertStringContainsString(get_string('defaultcategoryname'), $namewithlink);
112
        $this->assertEquals(get_string('defaultcategoryname'), $path);
113
        $this->assertEmpty($description);
114
        $this->assertEmpty($theme);
115
        $this->assertEmpty($coursename);
116
        $this->assertEmpty($cohortname);
117
        $this->assertEmpty($rolename);
118
        $this->assertEmpty($userfullname);
119
 
120
        [$namewithlink, $path, $description, $theme, $coursename, $cohortname, $rolename, $userfullname] =
121
            array_values($content[1]);
122
        $this->assertStringContainsString($category->get_formatted_name(), $namewithlink);
123
        $this->assertEquals($category->get_nested_name(false), $path);
124
        $this->assertEquals(format_text($category->description, $category->descriptionformat), $description);
125
        $this->assertEquals('Boost', $theme);
126
        $this->assertEquals($course->fullname, $coursename);
127
        $this->assertEquals($cohort->name, $cohortname);
128
        $this->assertEquals('Manager', $rolename);
129
        $this->assertEquals(fullname($user), $userfullname);
130
    }
131
 
132
    /**
133
     * Data provider for {@see test_datasource_filters}
134
     *
135
     * @return array[]
136
     */
137
    public static function datasource_filters_provider(): array {
138
        global $DB;
139
 
140
        return [
141
            // Category.
142
            'Filter category' => ['course_category:name', [
143
                'course_category:name_operator' => category::NOT_EQUAL_TO,
144
                'course_category:name_value' => -1,
145
            ], true],
146
            'Filter category (no match)' => ['course_category:name', [
147
                'course_category:name_operator' => category::EQUAL_TO,
148
                'course_category:name_value' => -1,
149
            ], false],
150
            'Filter category name' => ['course_category:text', [
151
                'course_category:text_operator' => text::IS_EQUAL_TO,
152
                'course_category:text_value' => 'Zoo',
153
            ], true],
154
            'Filter category name (no match)' => ['course_category:text', [
155
                'course_category:text_operator' => text::IS_EQUAL_TO,
156
                'course_category:text_value' => 'Plants',
157
            ], false],
158
            'Filter category idnumber' => ['course_category:idnumber', [
159
                'course_category:idnumber_operator' => text::IS_EQUAL_TO,
160
                'course_category:idnumber_value' => 'Z01',
161
            ], true],
162
            'Filter category idnumber (no match)' => ['course_category:idnumber', [
163
                'course_category:idnumber_operator' => text::IS_EQUAL_TO,
164
                'course_category:idnumber_value' => 'P01',
165
            ], false],
166
            'Filter category theme' => ['course_category:theme', [
167
                'course_category:theme_operator' => select::EQUAL_TO,
168
                'course_category:theme_value' => 'boost',
169
            ], true],
170
            'Filter category theme (no match)' => ['course_category:theme', [
171
                'course_category:theme_operator' => select::EQUAL_TO,
172
                'course_category:theme_value' => 'classic',
173
            ], false],
174
 
175
            // Course.
176
            'Filter course fullname' => ['course:fullname', [
177
                'course:fullname_operator' => text::IS_EQUAL_TO,
178
                'course:fullname_value' => 'Zebra',
179
            ], true],
180
            'Filter course fullname (no match)' => ['course:fullname', [
181
                'course:fullname_operator' => text::IS_EQUAL_TO,
182
                'course:fullname_value' => 'Python',
183
            ], false],
184
 
185
            // Cohort.
186
            'Filter cohort name' => ['cohort:name', [
187
                'cohort:name_operator' => text::IS_EQUAL_TO,
188
                'cohort:name_value' => 'My cohort',
189
            ], true],
190
            'Filter cohort name (no match)' => ['cohort:name', [
191
                'cohort:name_operator' => text::IS_EQUAL_TO,
192
                'cohort:name_value' => 'Not my cohort',
193
            ], false],
194
 
195
            // Role.
196
            'Filter role' => ['role:name', [
197
                'role:name_operator' => select::EQUAL_TO,
198
                'role:name_value' => $DB->get_field('role', 'id', ['shortname' => 'manager']),
199
            ], true],
200
            'Filter role (no match)' => ['role:name', [
201
                'role:name_operator' => select::EQUAL_TO,
202
                'role:name_value' => -1,
203
            ], false],
204
 
205
            // User.
206
            'Filter user firstname' => ['user:firstname', [
207
                'user:firstname_operator' => text::IS_EQUAL_TO,
208
                'user:firstname_value' => 'Zoe',
209
            ], true],
210
            'Filter user firstname (no match)' => ['user:firstname', [
211
                'user:firstname_operator' => text::IS_EQUAL_TO,
212
                'user:firstname_value' => 'Pedro',
213
            ], false],
214
        ];
215
    }
216
 
217
    /**
218
     * Test datasource filters
219
     *
220
     * @param string $filtername
221
     * @param array $filtervalues
222
     * @param bool $expectmatch
223
     *
224
     * @dataProvider datasource_filters_provider
225
     */
226
    public function test_datasource_filters(string $filtername, array $filtervalues, bool $expectmatch): void {
227
        global $DB;
228
 
229
        $this->resetAfterTest();
230
 
231
        set_config('allowcategorythemes', true);
232
 
233
        // Get the default category, modify it so we can filter each value.
234
        ($category = core_course_category::get_default())->update(['name' => 'Zoo', 'idnumber' => 'Z01', 'theme' => 'boost']);
235
        $course = $this->getDataGenerator()->create_course(['category' => $category->id, 'fullname' => 'Zebra']);
236
 
237
        // Add a cohort.
238
        $cohort = $this->getDataGenerator()->create_cohort(['contextid' => $category->get_context()->id, 'name' => 'My cohort']);
239
 
240
        // Assign a role.
241
        $managerrole = $DB->get_field('role', 'id', ['shortname' => 'manager']);
242
        $user = $this->getDataGenerator()->create_user(['firstname' => 'Zoe']);
243
        role_assign($managerrole, $user->id, $category->get_context()->id);
244
 
245
        /** @var core_reportbuilder_generator $generator */
246
        $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
247
 
248
        // Create report containing single idnumber column, and given filter.
249
        $report = $generator->create_report(['name' => 'My report', 'source' => categories::class, 'default' => 0]);
250
        $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:idnumber']);
251
 
252
        // Add filter, set it's values.
253
        $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => $filtername]);
254
        $content = $this->get_custom_report_content($report->get('id'), 0, $filtervalues);
255
 
256
        if ($expectmatch) {
257
            $this->assertCount(1, $content);
258
            $this->assertEquals($category->idnumber, reset($content[0]));
259
        } else {
260
            $this->assertEmpty($content);
261
        }
262
    }
263
 
264
    /**
265
     * Stress test datasource
266
     *
267
     * In order to execute this test PHPUNIT_LONGTEST should be defined as true in phpunit.xml or directly in config.php
268
     */
269
    public function test_stress_datasource(): void {
270
        if (!PHPUNIT_LONGTEST) {
271
            $this->markTestSkipped('PHPUNIT_LONGTEST is not defined');
272
        }
273
 
274
        $this->resetAfterTest();
275
 
276
        $category = $this->getDataGenerator()->create_category(['name' => 'My category']);
277
 
278
        $this->datasource_stress_test_columns(categories::class);
279
        $this->datasource_stress_test_columns_aggregation(categories::class);
280
        $this->datasource_stress_test_conditions(categories::class, 'course_category:idnumber');
281
    }
282
}