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
namespace report_loglive;
17
 
18
use advanced_testcase;
19
use context_course;
20
use core_user;
21
 
22
/**
23
 * Tests for table log and groups.
24
 *
25
 * @package    report_loglive
26
 * @copyright  2024 onwards Laurent David <laurent.david@moodle.com>
27
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
28
 */
29
class table_log_test extends advanced_testcase {
30
    /**
31
     * @var int The course with separate groups.
32
     */
33
    const COURSE_SEPARATE_GROUP = 0;
34
    /**
35
     * @var int The course with separate groups.
36
     */
37
    const COURSE_VISIBLE_GROUP = 1;
38
    /**
39
     * @var int The course with separate groups.
40
     */
41
    const COURSE_NO_GROUP = 2;
42
    /**
43
     * @var array The setup of users.
44
     */
45
    const SETUP_USER_DEFS = [
46
        // Make student2 also member of group1.
47
        'student' => [
48
            'student0' => ['group0'],
49
            'student1' => ['group1'],
50
            'student2' => ['group0', 'group1'],
51
            'student3' => [],
52
        ],
53
        // Make teacher2 also member of group1.
54
        'teacher' => [
55
            'teacher0' => ['group0'],
56
            'teacher1' => ['group1'],
57
            'teacher2' => ['group0', 'group1'],
58
            'teacher3' => [],
59
        ],
60
        // Make editingteacher also member of group1.
61
        'editingteacher' => [
62
            'editingteacher0' => ['group0'],
63
            'editingteacher1' => ['group1'],
64
            'editingteacher2' => ['group0', 'group1'],
65
        ],
66
    ];
67
    /**
68
     * @var array|\stdClass all users indexed by username.
69
     */
70
    private $users = [];
71
    /**
72
     * @var array The groups by courses (array of array).
73
     */
74
    private $groupsbycourse = [];
75
    /**
76
     * @var array The courses.
77
     */
78
    private $courses;
79
 
80
    /**
81
     * Data provider for test_get_table_logs.
82
     *
83
     * @return array
84
     */
85
    public static function get_report_logs_provider(): array {
86
        return [
87
            'separategroups: student 0' => [
88
                self::COURSE_SEPARATE_GROUP,
89
                'student0',
90
                // All users in group 0.
91
                [
92
                    'student0', 'student2',
93
                    'teacher0', 'teacher2',
94
                    'editingteacher0', 'editingteacher2',
95
                ],
96
            ],
97
            'separategroups: student 1' => [
98
                self::COURSE_SEPARATE_GROUP,
99
                'student1',
100
                // All users in group1.
101
                [
102
                    'student1', 'student2',
103
                    'teacher1', 'teacher2',
104
                    'editingteacher1', 'editingteacher2',
105
                ],
106
            ],
107
            'separategroups: student 2' => [
108
                self::COURSE_SEPARATE_GROUP,
109
                'student2',
110
                // All users in group0 and group1.
111
                [
112
                    'student0', 'student1', 'student2',
113
                    'teacher0', 'teacher1', 'teacher2',
114
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
115
                ],
116
            ],
117
            'separategroups: student3' => [
118
                self::COURSE_SEPARATE_GROUP,
119
                'student3',
120
                // Student 3 is not in any group so should only see user without a group.
121
                [
122
                    'student3',
123
                    'teacher3',
124
                ],
125
            ],
126
            'separategroups: editing teacher 0' => [
127
                self::COURSE_SEPARATE_GROUP,
128
                'editingteacher0',
129
                // All users including student 3 as we can see all users (event the one not in a group).
130
                [
131
                    'student0', 'student1', 'student2', 'student3',
132
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
133
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
134
                ],
135
            ],
136
            'separategroups: teacher 0' => [
137
                self::COURSE_SEPARATE_GROUP,
138
                'teacher0',
139
                // All users in group 0.
140
                [
141
                    'student0', 'student2',
142
                    'teacher0', 'teacher2',
143
                    'editingteacher0', 'editingteacher2',
144
                ],
145
            ],
146
            'separategroups: teacher 2' => [
147
                self::COURSE_SEPARATE_GROUP,
148
                'teacher2',
149
                // All users in group0 and group1.
150
                [
151
                    'student0', 'student1', 'student2',
152
                    'teacher0', 'teacher1', 'teacher2',
153
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
154
                ],
155
            ],
156
            'separategroups: teacher 3' => [
157
                self::COURSE_SEPARATE_GROUP,
158
                'teacher3',
159
                // Teacher 3 is not in any group so should only see user without a group.
160
                [
161
                    'student3',
162
                    'teacher3',
163
                ],
164
            ],
165
            'visiblegroup: editing teacher' => [
166
                self::COURSE_VISIBLE_GROUP,
167
                'editingteacher0',
168
                // All users.
169
                [
170
                    'student0', 'student1', 'student2', 'student3',
171
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
172
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
173
                ],
174
            ],
175
            'visiblegroup: student' => [
176
                self::COURSE_VISIBLE_GROUP,
177
                'student0',
178
                // All users.
179
                [
180
                    'student0', 'student1', 'student2', 'student3',
181
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
182
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
183
                ],
184
            ],
185
            'nogroup: teacher 0' => [
186
                self::COURSE_VISIBLE_GROUP,
187
                'teacher2',
188
                // All users.
189
                [
190
                    'student0', 'student1', 'student2', 'student3',
191
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
192
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
193
                ],
194
            ],
195
            'nogroup: editing teacher 0' => [
196
                self::COURSE_VISIBLE_GROUP,
197
                'editingteacher0',
198
                // All users.
199
                [
200
                    'student0', 'student1', 'student2', 'student3',
201
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
202
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
203
                ],
204
            ],
205
            'nogroup: student' => [
206
                self::COURSE_VISIBLE_GROUP,
207
                'student0',
208
                // All users.
209
                [
210
                    'student0', 'student1', 'student2', 'student3',
211
                    'teacher0', 'teacher1', 'teacher2', 'teacher3',
212
                    'editingteacher0', 'editingteacher1', 'editingteacher2',
213
                ],
214
            ],
215
        ];
216
    }
217
 
218
    /**
219
     * Set up a course with two groups, three students being each in one of the groups,
220
     * two teachers each in either group while the second teacher is also member of the other group.
221
     *
222
     * @return void
223
     * @throws \coding_exception
224
     */
225
    public function setUp(): void {
226
        global $DB;
227
        $this->resetAfterTest();
228
        $this->preventResetByRollback(); // This is to ensure that we can actually trigger event and record them in the log store.
229
        $this->courses[self::COURSE_SEPARATE_GROUP] = $this->getDataGenerator()->create_course(['groupmode' => SEPARATEGROUPS]);
230
        $this->courses[self::COURSE_VISIBLE_GROUP] = $this->getDataGenerator()->create_course(['groupmode' => VISIBLEGROUPS]);
231
        $this->courses[self::COURSE_NO_GROUP] = $this->getDataGenerator()->create_course();
232
 
233
        foreach ($this->courses as $coursetype => $course) {
234
            if ($coursetype == self::COURSE_NO_GROUP) {
235
                continue;
236
            }
237
            $this->groupsbycourse[$coursetype] = [];
238
            $this->groupsbycourse[$coursetype]['group0'] =
239
                $this->getDataGenerator()->create_group(['courseid' => $course->id, 'name' => 'group0']);
240
            $this->groupsbycourse[$coursetype]['group1'] =
241
                $this->getDataGenerator()->create_group(['courseid' => $course->id, 'name' => 'group1']);
242
        }
243
 
244
        foreach (self::SETUP_USER_DEFS as $role => $userdefs) {
245
            foreach ($userdefs as $username => $groups) {
246
                $user = $this->getDataGenerator()->create_user(
247
                    [
248
                        'username' => $username,
249
                        'firstname' => "FN{$role}{$username}",
250
                        'lastname' => "LN{$role}{$username}",
251
                    ]);
252
                foreach ($this->courses as $coursetype => $course) {
253
                    $this->getDataGenerator()->enrol_user($user->id, $course->id, $role);
254
                    foreach ($groups as $groupname) {
255
                        if ($coursetype == self::COURSE_NO_GROUP) {
256
                            continue;
257
                        }
258
                        $this->getDataGenerator()->create_group_member([
259
                            'groupid' => $this->groupsbycourse[$coursetype][$groupname]->id,
260
                            'userid' => $user->id,
261
                        ]);
262
                    }
263
                }
264
                $this->users[$username] = $user;
265
            }
266
        }
267
        // Configure log store.
268
        set_config('enabled_stores', 'logstore_standard', 'tool_log');
269
        get_log_manager(true);
270
        $DB->delete_records('logstore_standard_log');
271
 
272
        foreach ($this->courses as $course) {
273
            foreach ($this->users as $user) {
274
                $eventdata = [
275
                    'context' => context_course::instance($course->id),
276
                    'userid' => $user->id,
277
                ];
278
                $event = \core\event\course_viewed::create($eventdata);
279
                $event->trigger();
280
            }
281
        }
282
    }
283
 
284
    /**
285
     * Test table_log
286
     *
287
     * @param int $courseindex
288
     * @param string $username
289
     * @param array $expectedusers
290
     * @covers       \report_log_renderable::get_user_list
291
     * @dataProvider get_report_logs_provider
292
     * @return void
293
     */
294
    public function test_get_table_logs(int $courseindex, string $username, array $expectedusers): void {
295
        $manager = get_log_manager();
296
        $stores = $manager->get_readers();
297
        $store = $stores['logstore_standard'];
298
        // Build the report.
299
        $url = new \moodle_url("/report/loglive/index.php");
300
        $renderable = new \report_loglive_renderable('logstore_standard', $this->courses[$courseindex], $url);
301
        $table = $renderable->get_table();
302
        $currentuser = $this->users[$username];
303
        $this->setUser($currentuser->id);
304
        $store->flush();
305
        $table->query_db(100);
306
        $filteredevents =
307
            array_filter(
308
                $table->rawdata, fn($event) => get_class($event) === \core\event\course_viewed::class
309
            );
310
        $usernames = array_map(
311
            function($event) {
312
                $user = core_user::get_user($event->userid, '*', MUST_EXIST);
313
                return $user->username;
314
            },
315
            $filteredevents);
316
        sort($expectedusers);
317
        sort($usernames);
318
        $this->assertEquals($expectedusers, $usernames);
319
    }
320
}