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 qbank_comment\privacy;
18
 
19
use comment;
20
use context;
21
use context_course;
22
use core_privacy\local\metadata\collection;
23
use qbank_comment\privacy\provider;
24
use core_privacy\local\request\approved_userlist;
25
use stdClass;
26
 
27
/**
28
 * Privacy api tests.
29
 *
30
 * @package    qbank_comment
31
 * @copyright  2021 Catalyst IT Australia Pty Ltd
32
 * @author     Safat Shahin <safatshahin@catalyst-au.net>
33
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34
 */
35
class provider_test extends \core_privacy\tests\provider_testcase {
36
 
37
    /** @var stdClass A teacher who is only enrolled in course1. */
38
    protected $teacher1;
39
 
40
    /** @var stdClass A teacher who is only enrolled in course2. */
41
    protected $teacher2;
42
 
43
    /** @var stdClass A teacher who is enrolled in both course1 and course2. */
44
    protected $teacher3;
45
 
46
    /** @var stdClass A test course. */
47
    protected $course1;
48
 
49
    /** @var stdClass A test course. */
50
    protected $course2;
51
 
52
    /**
53
     * Set up function for tests in this class.
54
     */
55
    protected function setUp(): void {
56
        global $DB;
57
 
58
        $this->resetAfterTest();
59
        $this->setAdminUser();
60
 
61
        // Create courses.
62
        $generator = $this->getDataGenerator();
63
        $this->course1 = $generator->create_course();
64
        $this->course2 = $generator->create_course();
65
 
66
        // Create and enrol teachers.
67
        $this->teacher1 = $generator->create_user();
68
        $this->teacher2 = $generator->create_user();
69
        $this->teacher3 = $generator->create_user();
70
 
71
        $studentrole = $DB->get_record('role', ['shortname' => 'editingteacher']);
72
        $generator->enrol_user($this->teacher1->id,  $this->course1->id, $studentrole->id);
73
        $generator->enrol_user($this->teacher2->id,  $this->course2->id, $studentrole->id);
74
        $generator->enrol_user($this->teacher3->id,  $this->course1->id, $studentrole->id);
75
        $generator->enrol_user($this->teacher3->id,  $this->course2->id, $studentrole->id);
76
    }
77
 
78
    /**
79
     * Posts a comment on a given context.
80
     *
81
     * @param string $text The comment's text.
82
     * @param context $context The context on which we want to put the comment.
83
     */
84
    protected function add_comment($text, context $context) {
85
        $args = new stdClass;
86
        $args->context = $context;
87
        $args->area = 'question';
88
        $args->itemid = 0;
89
        $args->component = 'qbank_comment';
90
        $args->linktext = get_string('commentheader', 'qbank_comment');
91
        $args->notoggle = true;
92
        $args->autostart = true;
93
        $args->displaycancel = false;
94
        $comment = new comment($args);
95
 
96
        $comment->add($text);
97
    }
98
 
99
    /**
100
     * Test for provider::get_metadata().
101
     */
11 efrain 102
    public function test_get_metadata(): void {
1 efrain 103
        $collection = new collection('qbank_comment');
104
        $newcollection = provider::get_metadata($collection);
105
        $itemcollection = $newcollection->get_collection();
106
        $this->assertCount(1, $itemcollection);
107
 
108
        $link = reset($itemcollection);
109
 
110
        $this->assertEquals('core_comment', $link->get_name());
111
        $this->assertEmpty($link->get_privacy_fields());
112
        $this->assertEquals('privacy:metadata:core_comment', $link->get_summary());
113
    }
114
 
115
    /**
116
     * Test for provider::get_contexts_for_userid() when user had not posted any comments..
117
     */
11 efrain 118
    public function test_get_contexts_for_userid_no_comment(): void {
1 efrain 119
        $this->setUser($this->teacher1);
120
        $coursecontext1 = context_course::instance($this->course1->id);
121
        $this->add_comment('New comment', $coursecontext1);
122
 
123
        $this->setUser($this->teacher2);
124
        $contextlist = provider::get_contexts_for_userid($this->teacher2->id);
125
        $this->assertCount(0, $contextlist);
126
    }
127
 
128
    /**
129
     * Test for provider::get_contexts_for_userid().
130
     */
11 efrain 131
    public function test_get_contexts_for_userid(): void {
1 efrain 132
        $coursecontext1 = context_course::instance($this->course1->id);
133
        $coursecontext2 = context_course::instance($this->course2->id);
134
 
135
        $this->setUser($this->teacher3);
136
        $this->add_comment('New comment', $coursecontext1);
137
        $this->add_comment('New comment', $coursecontext1);
138
        $this->add_comment('New comment', $coursecontext2);
139
 
140
        $contextlist = provider::get_contexts_for_userid($this->teacher3->id);
141
        $this->assertCount(2, $contextlist);
142
 
143
        $contextids = $contextlist->get_contextids();
144
        $this->assertEqualsCanonicalizing([$coursecontext1->id, $coursecontext2->id], $contextids);
145
    }
146
 
147
    /**
148
     * Test for provider::export_user_data() when the user has not posted any comments.
149
     */
11 efrain 150
    public function test_export_for_context_no_comment(): void {
1 efrain 151
        $coursecontext1 = context_course::instance($this->course1->id);
152
        $coursecontext2 = context_course::instance($this->course2->id);
153
 
154
        $this->setUser($this->teacher1);
155
        $this->add_comment('New comment', $coursecontext1);
156
 
157
        $this->setUser($this->teacher2);
158
 
159
        $this->setUser($this->teacher2);
160
        $this->export_context_data_for_user($this->teacher1->id, $coursecontext2, 'qbank_comment');
161
        $writer = \core_privacy\local\request\writer::with_context($coursecontext2);
162
        $this->assertFalse($writer->has_any_data());
163
    }
164
 
165
    /**
166
     * Test for provider::export_user_data().
167
     */
11 efrain 168
    public function test_export_for_context(): void {
1 efrain 169
        $coursecontext1 = context_course::instance($this->course1->id);
170
        $coursecontext2 = context_course::instance($this->course2->id);
171
 
172
        $this->setUser($this->teacher3);
173
        $this->add_comment('New comment', $coursecontext1);
174
        $this->add_comment('New comment', $coursecontext1);
175
        $this->add_comment('New comment', $coursecontext2);
176
 
177
        // Export all of the data for the context.
178
        $this->export_context_data_for_user($this->teacher3->id, $coursecontext1, 'qbank_comment');
179
        $writer = \core_privacy\local\request\writer::with_context($coursecontext1);
180
        $this->assertTrue($writer->has_any_data());
181
    }
182
 
183
    /**
184
     * Test for provider::delete_data_for_all_users_in_context().
185
     */
11 efrain 186
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 187
        global $DB;
188
 
189
        $coursecontext1 = context_course::instance($this->course1->id);
190
        $coursecontext2 = context_course::instance($this->course2->id);
191
 
192
        $this->setUser($this->teacher1);
193
        $this->add_comment('New comment', $coursecontext1);
194
 
195
        $this->setUser($this->teacher2);
196
        $this->add_comment('New comment', $coursecontext2);
197
 
198
        $this->setUser($this->teacher3);
199
        $this->add_comment('New comment', $coursecontext1);
200
        $this->add_comment('New comment', $coursecontext1);
201
        $this->add_comment('New comment', $coursecontext2);
202
 
203
        // Before deletion, we should have 3 comments in $coursecontext1 and 2 comments in $coursecontext2.
204
        $this->assertEquals(
205
                3,
206
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext1->id])
207
        );
208
        $this->assertEquals(
209
                2,
210
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext2->id])
211
        );
212
 
213
        // Delete data based on context.
214
        provider::delete_data_for_all_users_in_context($coursecontext1);
215
 
216
        // After deletion, the comments for $coursecontext1 should have been deleted.
217
        $this->assertEquals(
218
                0,
219
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext1->id])
220
        );
221
        $this->assertEquals(
222
                2,
223
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext2->id])
224
        );
225
    }
226
 
227
    /**
228
     * Test for provider::delete_data_for_user().
229
     */
11 efrain 230
    public function test_delete_data_for_user(): void {
1 efrain 231
        global $DB;
232
 
233
        $coursecontext1 = context_course::instance($this->course1->id);
234
        $coursecontext2 = context_course::instance($this->course2->id);
235
 
236
        $this->setUser($this->teacher1);
237
        $this->add_comment('New comment', $coursecontext1);
238
 
239
        $this->setUser($this->teacher2);
240
        $this->add_comment('New comment', $coursecontext2);
241
 
242
        $this->setUser($this->teacher3);
243
        $this->add_comment('New comment', $coursecontext1);
244
        $this->add_comment('New comment', $coursecontext1);
245
        $this->add_comment('New comment', $coursecontext2);
246
 
247
        // Before deletion, we should have 3 comments in $coursecontext1 and 2 comments in $coursecontext2,
248
        // and 3 comments by student12 in $coursecontext1 and $coursecontext2 combined.
249
        $this->assertEquals(
250
                3,
251
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext1->id])
252
        );
253
        $this->assertEquals(
254
                2,
255
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext2->id])
256
        );
257
        $this->assertEquals(
258
                3,
259
                $DB->count_records('comments', ['component' => 'qbank_comment', 'userid' => $this->teacher3->id])
260
        );
261
 
262
        $contextlist = new \core_privacy\local\request\approved_contextlist($this->teacher3, 'qbank_comment',
263
                [$coursecontext1->id, $coursecontext2->id]);
264
        provider::delete_data_for_user($contextlist);
265
 
266
        // After deletion, the comments for the student12 should have been deleted.
267
        $this->assertEquals(
268
                1,
269
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext1->id])
270
        );
271
        $this->assertEquals(
272
                1,
273
                $DB->count_records('comments', ['component' => 'qbank_comment', 'contextid' => $coursecontext2->id])
274
        );
275
        $this->assertEquals(
276
                0,
277
                $DB->count_records('comments', ['component' => 'qbank_comment', 'userid' => $this->teacher3->id])
278
        );
279
    }
280
 
281
    /**
282
     * Test that only users within a course context are fetched.
283
     */
11 efrain 284
    public function test_get_users_in_context(): void {
1 efrain 285
        $component = 'qbank_comment';
286
 
287
        $coursecontext1 = context_course::instance($this->course1->id);
288
        $coursecontext2 = context_course::instance($this->course2->id);
289
 
290
        $userlist1 = new \core_privacy\local\request\userlist($coursecontext1, $component);
291
        provider::get_users_in_context($userlist1);
292
        $this->assertCount(0, $userlist1);
293
 
294
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
295
        provider::get_users_in_context($userlist2);
296
        $this->assertCount(0, $userlist2);
297
 
298
        $this->setUser($this->teacher3);
299
        $this->add_comment('New comment', $coursecontext1);
300
        $this->add_comment('New comment', $coursecontext2);
301
        $this->setUser($this->teacher1);
302
        $this->add_comment('New comment', $coursecontext1);
303
 
304
        // The list of users should contain teacher3 and user1.
305
        provider::get_users_in_context($userlist1);
306
        $this->assertCount(2, $userlist1);
307
        $this->assertTrue(in_array($this->teacher1->id, $userlist1->get_userids()));
308
        $this->assertTrue(in_array($this->teacher3->id, $userlist1->get_userids()));
309
 
310
        // The list of users should contain teacher3.
311
        provider::get_users_in_context($userlist2);
312
        $this->assertCount(1, $userlist2);
313
        $expected = [$this->teacher3->id];
314
        $actual = $userlist2->get_userids();
315
        $this->assertEquals($expected, $actual);
316
    }
317
 
318
    /**
319
     * Test that data for users in approved userlist is deleted.
320
     */
11 efrain 321
    public function test_delete_data_for_users(): void {
1 efrain 322
        $component = 'qbank_comment';
323
 
324
        $coursecontext1 = context_course::instance($this->course1->id);
325
        $coursecontext2 = context_course::instance($this->course2->id);
326
 
327
        $this->setUser($this->teacher3);
328
        $this->add_comment('New comment', $coursecontext1);
329
        $this->add_comment('New comment', $coursecontext2);
330
        $this->setUser($this->teacher1);
331
        $this->add_comment('New comment', $coursecontext1);
332
 
333
        $userlist1 = new \core_privacy\local\request\userlist($coursecontext1, $component);
334
        provider::get_users_in_context($userlist1);
335
        $this->assertCount(2, $userlist1);
336
 
337
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
338
        provider::get_users_in_context($userlist2);
339
        $this->assertCount(1, $userlist2);
340
 
341
        // Convert $userlist1 into an approved_contextlist.
342
        $approvedlist1 = new approved_userlist($coursecontext1, $component, $userlist1->get_userids());
343
        // Delete using delete_data_for_user.
344
        provider::delete_data_for_users($approvedlist1);
345
 
346
        // Re-fetch users in coursecontext1.
347
        $userlist1 = new \core_privacy\local\request\userlist($coursecontext1, $component);
348
        provider::get_users_in_context($userlist1);
349
        // The user data in coursecontext1 should be deleted.
350
        $this->assertCount(0, $userlist1);
351
 
352
        // Re-fetch users in coursecontext2.
353
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
354
        provider::get_users_in_context($userlist2);
355
        // The user data in coursecontext2 should be still present.
356
        $this->assertCount(1, $userlist2);
357
    }
358
}