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