Proyectos de Subversion Moodle

Rev

Rev 11 | | 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 mod_assign;
18
 
19
use context_module;
20
use assign;
21
 
22
/**
23
 * Downloader tests class for mod_assign.
24
 *
25
 * @package    mod_assign
26
 * @category   test
27
 * @copyright  2022 Ferran Recio <ferran@moodle.com>
28
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29
 * @coversDefaultClass \mod_assign\downloader
30
 */
1441 ariadna 31
final class downloader_test extends \advanced_testcase {
1 efrain 32
    /**
33
     * Setup to ensure that fixtures are loaded.
34
     */
35
    public static function setupBeforeClass(): void {
36
        global $CFG;
37
        require_once($CFG->dirroot . '/mod/assign/locallib.php');
38
    }
39
 
40
    /**
41
     * Test for load_filelist method.
42
     *
43
     * @covers ::load_filelist
44
     * @dataProvider load_filelist_provider
45
     *
46
     * @param bool $teamsubmission if the assign must have team submissions
47
     * @param array $groupmembers the groups definition
48
     * @param array|null $filterusers the filtered users (null for all users)
49
     * @param bool $blindmarking if the assign has blind marking
50
     * @param bool $downloadasfolder if the download as folder preference is set
51
     * @param array $expected the expected file list
52
     */
53
    public function test_load_filelist(
54
        bool $teamsubmission,
55
        array $groupmembers,
56
        ?array $filterusers,
57
        bool $blindmarking,
58
        bool $downloadasfolder,
59
        array $expected
11 efrain 60
    ): void {
1 efrain 61
        global $CFG;
62
        $this->resetAfterTest();
63
        $this->setAdminUser();
64
 
65
        if (!$downloadasfolder) {
66
            set_user_preference('assign_downloadasfolders', 0);
67
        }
68
 
69
        // Create course and enrols.
70
        $course = $this->getDataGenerator()->create_course();
71
        $users = [
72
            'student1' => $this->getDataGenerator()->create_and_enrol($course, 'student'),
73
            'student2' => $this->getDataGenerator()->create_and_enrol($course, 'student'),
74
            'student3' => $this->getDataGenerator()->create_and_enrol($course, 'student'),
75
            'student4' => $this->getDataGenerator()->create_and_enrol($course, 'student'),
76
            'student5' => $this->getDataGenerator()->create_and_enrol($course, 'student'),
77
        ];
78
 
79
        // Generate groups.
80
        $groups = [];
81
        foreach ($groupmembers as $groupname => $groupusers) {
82
            $group = $this->getDataGenerator()->create_group(['courseid' => $course->id, 'name' => $groupname]);
83
            foreach ($groupusers as $user) {
84
                groups_add_member($group, $users[$user]);
85
            }
86
            $groups[$groupname] = $group;
87
        }
88
 
89
        // Create activity.
90
        $params = [
91
            'course' => $course,
92
            'assignsubmission_file_enabled' => 1,
93
            'assignsubmission_file_maxfiles' => 12,
94
            'assignsubmission_file_maxsizebytes' => 1024 * 1024,
95
        ];
96
        if ($teamsubmission) {
97
            $params['teamsubmission'] = 1;
98
            $params['preventsubmissionnotingroup'] = false;
99
        }
100
        if ($blindmarking) {
101
            $params['blindmarking'] = 1;
102
        }
103
        $activity = $this->getDataGenerator()->create_module('assign', $params);
104
        $cm = get_coursemodule_from_id('assign', $activity->cmid, 0, false, MUST_EXIST);
105
        $context = context_module::instance($cm->id);
106
 
107
        // Generate submissions.
108
        $datagenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
109
        $files = [
110
            "mod/assign/tests/fixtures/submissionsample01.txt",
111
            "mod/assign/tests/fixtures/submissionsample02.txt"
112
        ];
113
        foreach ($users as $key => $user) {
114
            if ($key == 'student5') {
115
                continue;
116
            }
117
            $datagenerator->create_submission([
118
                'userid' => $user->id,
1441 ariadna 119
                'cmid' => $cm->id,
1 efrain 120
                'file' => implode(',', $files),
121
            ]);
122
        }
123
 
124
        // Generate file list.
125
        if ($filterusers) {
126
            foreach ($filterusers as $key => $identifier) {
127
                $filterusers[$key] = $users[$identifier]->id;
128
            }
129
        }
130
        $manager = new assign($context, $cm, $course);
131
        $downloader = new downloader($manager, $filterusers);
132
        $hasfiles = $downloader->load_filelist();
133
 
134
        // Expose protected filelist attribute.
135
        $rc = new \ReflectionClass(downloader::class);
136
        $rcp = $rc->getProperty('filesforzipping');
137
 
138
        // Add some replacements.
139
        $search = ['PARTICIPANT', 'DEFAULTTEAM'];
140
        $replace = [get_string('participant', 'mod_assign'), get_string('defaultteam', 'mod_assign')];
141
        foreach ($users as $identifier => $user) {
142
            $search[] = strtoupper($identifier . '.ID');
143
            $replace[] = $manager->get_uniqueid_for_user($user->id);
144
            $search[] = strtoupper($identifier);
145
            $replace[] = $this->prepare_filename_text(fullname($user));
146
        }
147
        foreach ($groups as $identifier => $group) {
148
            $search[] = strtoupper($identifier . '.ID');
149
            $replace[] = strtoupper($group->id);
150
            $search[] = strtoupper($identifier);
151
            $replace[] = $this->prepare_filename_text($group->name);
152
        }
153
 
154
        // Validate values.
155
        $filelist = $rcp->getValue($downloader);
156
        $result = array_keys($filelist);
157
 
158
        $this->assertEquals($hasfiles, !empty($expected));
159
        $this->assertCount(count($expected), $result);
160
        foreach ($expected as $path) {
161
            $value = str_replace($search, $replace, $path);
162
            $this->assertTrue(in_array($value, $result));
163
        }
164
    }
165
 
166
    /**
167
     * Internal helper to clean a filename text.
168
     *
169
     * @param string $text the text to transform
170
     * @return string the clean string
171
     */
172
    private function prepare_filename_text(string $text): string {
173
        return clean_filename(str_replace('_', ' ', $text));
174
    }
175
 
176
    /**
177
     * Data provider for test_load_filelist().
178
     *
179
     * @return array of scenarios
180
     */
1441 ariadna 181
    public static function load_filelist_provider(): array {
182
        $downloadasfoldertests = static::load_filelist_downloadasfolder_scenarios();
183
        $downloadasfilestests = static::load_filelist_downloadasfiles_scenarios();
1 efrain 184
        return array_merge(
185
            $downloadasfoldertests,
186
            $downloadasfilestests,
187
        );
188
    }
189
 
190
    /**
191
     * Generate the standard test scenarios for load_filelist with download as file.
192
     *
193
     * The scenarios are the same as download as folder but replacing the "/" of the files
194
     * by a "_" and setting the downloadasfolder to false.
195
     *
196
     * @return array of scenarios
197
     */
1441 ariadna 198
    private static function load_filelist_downloadasfiles_scenarios(): array {
199
        $result = static::load_filelist_downloadasfolder_scenarios("Download as files:");
1 efrain 200
        // Transform paths from files.
201
        foreach ($result as $scenario => $info) {
202
            $info['downloadasfolder'] = false;
203
            foreach ($info['expected'] as $key => $path) {
204
                $info['expected'][$key] = str_replace('/', '_', $path);
205
            }
206
            $result[$scenario] = $info;
207
        }
208
        return $result;
209
    }
210
 
211
    /**
212
     * Generate the standard test scenarios for load_filelist with download as folder.
213
     *
214
     * @param string $prefix the scenarios prefix
215
     * @return array of scenarios
216
     */
1441 ariadna 217
    private static function load_filelist_downloadasfolder_scenarios(
218
        string $prefix = "Download as folders:",
219
    ): array {
1 efrain 220
        return [
221
            // Test without team submissions.
222
            $prefix . ' All users without groups' => [
223
                'teamsubmission' => false,
224
                'groupmembers' => [],
225
                'filterusers' => null,
226
                'blindmarking' => false,
227
                'downloadasfolder' => true,
228
                'expected' => [
229
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample01.txt',
230
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample02.txt',
231
                    'STUDENT2_STUDENT2.ID_assignsubmission_file/submissionsample01.txt',
232
                    'STUDENT2_STUDENT2.ID_assignsubmission_file/submissionsample02.txt',
233
                    'STUDENT3_STUDENT3.ID_assignsubmission_file/submissionsample01.txt',
234
                    'STUDENT3_STUDENT3.ID_assignsubmission_file/submissionsample02.txt',
235
                    'STUDENT4_STUDENT4.ID_assignsubmission_file/submissionsample01.txt',
236
                    'STUDENT4_STUDENT4.ID_assignsubmission_file/submissionsample02.txt',
237
                ],
238
            ],
239
            $prefix . ' Filtered users' => [
240
                'teamsubmission' => false,
241
                'groupmembers' => [],
242
                'filterusers' => ['student1', 'student2'],
243
                'blindmarking' => false,
244
                'downloadasfolder' => true,
245
                'expected' => [
246
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample01.txt',
247
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample02.txt',
248
                    'STUDENT2_STUDENT2.ID_assignsubmission_file/submissionsample01.txt',
249
                    'STUDENT2_STUDENT2.ID_assignsubmission_file/submissionsample02.txt',
250
                ],
251
            ],
252
            $prefix . ' Filtering users without submissions' => [
253
                'teamsubmission' => false,
254
                'groupmembers' => [],
255
                'filterusers' => ['student1', 'student5'],
256
                'blindmarking' => false,
257
                'downloadasfolder' => true,
258
                'expected' => [
259
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample01.txt',
260
                    'STUDENT1_STUDENT1.ID_assignsubmission_file/submissionsample02.txt',
261
                ],
262
            ],
263
            $prefix . ' Asking only for users without submissions' => [
264
                'teamsubmission' => false,
265
                'groupmembers' => [],
266
                'filterusers' => ['student5'],
267
                'blindmarking' => false,
268
                'downloadasfolder' => true,
269
                'expected' => [],
270
            ],
271
            // Test with team submissions and no default team.
272
            $prefix . ' All users with all users in groups' => [
273
                'teamsubmission' => true,
274
                'groupmembers' => [
275
                    'group1' => ['student1'],
276
                    'group2' => ['student2', 'student3'],
277
                    'group3' => ['student4', 'student5'],
278
                ],
279
                'filterusers' => null,
280
                'blindmarking' => false,
281
                'downloadasfolder' => true,
282
                'expected' => [
283
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
284
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
285
                    'GROUP2_GROUP2.ID_assignsubmission_file/submissionsample01.txt',
286
                    'GROUP2_GROUP2.ID_assignsubmission_file/submissionsample02.txt',
287
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample01.txt',
288
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample02.txt',
289
                ],
290
            ],
291
            $prefix . ' Filtering users with disjoined groups' => [
292
                'teamsubmission' => true,
293
                'groupmembers' => [
294
                    'group1' => ['student1'],
295
                    'group2' => ['student2', 'student3'],
296
                    'group3' => ['student4', 'student5'],
297
                ],
298
                'filterusers' => ['student1', 'student2'],
299
                'blindmarking' => false,
300
                'downloadasfolder' => true,
301
                'expected' => [
302
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
303
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
304
                    'GROUP2_GROUP2.ID_assignsubmission_file/submissionsample01.txt',
305
                    'GROUP2_GROUP2.ID_assignsubmission_file/submissionsample02.txt',
306
                ],
307
            ],
308
            $prefix . ' Filtering users with default teams who does not do a submission' => [
309
                'teamsubmission' => true,
310
                'groupmembers' => [
311
                    'group1' => ['student1'],
312
                    'group2' => ['student2', 'student3'],
313
                    'group3' => ['student4', 'student5'],
314
                ],
315
                'filterusers' => ['student1', 'student5'],
316
                'blindmarking' => false,
317
                'downloadasfolder' => true,
318
                'expected' => [
319
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
320
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
321
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample01.txt',
322
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample02.txt',
323
                ],
324
            ],
325
            $prefix . ' Filtering users without submission but member of a group' => [
326
                'teamsubmission' => true,
327
                'groupmembers' => [
328
                    'group1' => ['student1'],
329
                    'group2' => ['student2', 'student3'],
330
                    'group3' => ['student4', 'student5'],
331
                ],
332
                'filterusers' => [
333
                    'student5'
334
                ],
335
                'blindmarking' => false,
336
                'downloadasfolder' => true,
337
                'expected' => [
338
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample01.txt',
339
                    'GROUP3_GROUP3.ID_assignsubmission_file/submissionsample02.txt',
340
                ],
341
            ],
342
            // Test with default team.
343
            $prefix . ' All users with users in the default team' => [
344
                'teamsubmission' => true,
345
                'groupmembers' => [
346
                    'group1' => ['student1', 'student2'],
347
                ],
348
                'filterusers' => null,
349
                'blindmarking' => false,
350
                'downloadasfolder' => true,
351
                'expected' => [
352
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
353
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
354
                    'DEFAULTTEAM_assignsubmission_file/submissionsample01.txt',
355
                    'DEFAULTTEAM_assignsubmission_file/submissionsample02.txt',
356
                ],
357
            ],
358
            $prefix . ' Filtered users in groups with users in the default team' => [
359
                'teamsubmission' => true,
360
                'groupmembers' => [
361
                    'group1' => ['student1', 'student2'],
362
                ],
363
                'filterusers' => ['student1', 'student2'],
364
                'blindmarking' => false,
365
                'downloadasfolder' => true,
366
                'expected' => [
367
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
368
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
369
                ],
370
            ],
371
            $prefix . ' Filtered users without groups with users in the default team' => [
372
                'teamsubmission' => true,
373
                'groupmembers' => [
374
                    'group1' => ['student1', 'student2'],
375
                ],
376
                'filterusers' => ['student3', 'student4'],
377
                'blindmarking' => false,
378
                'downloadasfolder' => true,
379
                'expected' => [
380
                    'DEFAULTTEAM_assignsubmission_file/submissionsample01.txt',
381
                    'DEFAULTTEAM_assignsubmission_file/submissionsample02.txt',
382
                ],
383
            ],
384
            $prefix . ' Filtered users with some users in the default team' => [
385
                'teamsubmission' => true,
386
                'groupmembers' => [
387
                    'group1' => ['student1', 'student2'],
388
                ],
389
                'filterusers' => ['student1', 'student3'],
390
                'blindmarking' => false,
391
                'downloadasfolder' => true,
392
                'expected' => [
393
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
394
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
395
                    'DEFAULTTEAM_assignsubmission_file/submissionsample01.txt',
396
                    'DEFAULTTEAM_assignsubmission_file/submissionsample02.txt',
397
                ],
398
            ],
399
            $prefix . ' Filtering users with joined groups' => [
400
                'teamsubmission' => true,
401
                'groupmembers' => [
402
                    'group1' => ['student1', 'student2'],
403
                    'group2' => ['student2', 'student3'],
404
                ],
405
                'filterusers' => ['student1', 'student2'],
406
                'blindmarking' => false,
407
                'downloadasfolder' => true,
408
                'expected' => [
409
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample01.txt',
410
                    'GROUP1_GROUP1.ID_assignsubmission_file/submissionsample02.txt',
411
                    'DEFAULTTEAM_assignsubmission_file/submissionsample01.txt',
412
                    'DEFAULTTEAM_assignsubmission_file/submissionsample02.txt',
413
                ],
414
            ],
415
            // Tests with blind marking.
416
            $prefix . ' All users without groups and blindmarking' => [
417
                'teamsubmission' => false,
418
                'groupmembers' => [],
419
                'filterusers' => null,
420
                'blindmarking' => true,
421
                'downloadasfolder' => true,
422
                'expected' => [
423
                    'PARTICIPANT_STUDENT1.ID_assignsubmission_file/submissionsample01.txt',
424
                    'PARTICIPANT_STUDENT1.ID_assignsubmission_file/submissionsample02.txt',
425
                    'PARTICIPANT_STUDENT2.ID_assignsubmission_file/submissionsample01.txt',
426
                    'PARTICIPANT_STUDENT2.ID_assignsubmission_file/submissionsample02.txt',
427
                    'PARTICIPANT_STUDENT3.ID_assignsubmission_file/submissionsample01.txt',
428
                    'PARTICIPANT_STUDENT3.ID_assignsubmission_file/submissionsample02.txt',
429
                    'PARTICIPANT_STUDENT4.ID_assignsubmission_file/submissionsample01.txt',
430
                    'PARTICIPANT_STUDENT4.ID_assignsubmission_file/submissionsample02.txt',
431
                ],
432
            ],
433
            $prefix . ' Filtered users without groups and blindmarking' => [
434
                'teamsubmission' => false,
435
                'groupmembers' => [],
436
                'filterusers' => ['student1', 'student2'],
437
                'blindmarking' => true,
438
                'downloadasfolder' => true,
439
                'expected' => [
440
                    'PARTICIPANT_STUDENT1.ID_assignsubmission_file/submissionsample01.txt',
441
                    'PARTICIPANT_STUDENT1.ID_assignsubmission_file/submissionsample02.txt',
442
                    'PARTICIPANT_STUDENT2.ID_assignsubmission_file/submissionsample01.txt',
443
                    'PARTICIPANT_STUDENT2.ID_assignsubmission_file/submissionsample02.txt',
444
                ],
445
            ],
446
        ];
447
    }
448
}