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
 * Unit tests for the repository_onedrive implementation of the privacy API.
18
 *
19
 * @package    repository_onedrive
20
 * @category   test
21
 * @copyright  2018 Zig Tan <zig@moodle.com>
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
namespace repository_onedrive\privacy;
25
 
26
defined('MOODLE_INTERNAL') || die();
27
use core_privacy\local\metadata\collection;
28
use core_privacy\local\request\writer;
29
use core_privacy\local\request\approved_contextlist;
30
use core_privacy\local\request\approved_userlist;
31
use repository_onedrive\privacy\provider;
32
/**
33
 * Unit tests for the repository_onedrive implementation of the privacy API.
34
 *
35
 * @copyright  2018 Zig Tan <zig@moodle.com>
36
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37
 */
1441 ariadna 38
final class provider_test extends \core_privacy\tests\provider_testcase {
1 efrain 39
 
40
    /**
41
     * Overriding setUp() function to always reset after tests.
42
     */
43
    public function setUp(): void {
1441 ariadna 44
        parent::setUp();
1 efrain 45
        $this->resetAfterTest(true);
46
    }
47
 
48
    /**
49
     * Test for provider::get_contexts_for_userid().
50
     */
11 efrain 51
    public function test_get_contexts_for_userid(): void {
1 efrain 52
        global $DB;
53
 
54
        // Test setup.
55
        $user = $this->getDataGenerator()->create_user();
56
        $this->setUser($user);
57
 
58
        // Add two repository_onedrive_access records for the User.
59
        $access = (object)[
60
            'usermodified' => $user->id,
61
            'itemid' => 'Some onedrive access item data',
62
            'permissionid' => 'Some onedrive access permission data',
63
            'timecreated' => date('u'),
64
            'timemodified' => date('u'),
65
        ];
66
        $DB->insert_record('repository_onedrive_access', $access);
67
        $access = (object)[
68
            'usermodified' => $user->id,
69
            'itemid' => 'Another onedrive access item data',
70
            'permissionid' => 'Another onedrive access permission data',
71
            'timecreated' => date('u'),
72
            'timemodified' => date('u'),
73
        ];
74
        $DB->insert_record('repository_onedrive_access', $access);
75
 
76
        // Test there are two repository_onedrive_access records for the User.
77
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user->id]);
78
        $this->assertCount(2, $access);
79
 
80
        // Test the User's retrieved contextlist contains only one context.
81
        $contextlist = provider::get_contexts_for_userid($user->id);
82
        $contexts = $contextlist->get_contexts();
83
        $this->assertCount(1, $contexts);
84
 
85
        // Test the User's contexts equal the User's own context.
86
        $context = reset($contexts);
87
        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
88
        $this->assertEquals($user->id, $context->instanceid);
89
    }
90
 
91
    /**
92
     * Test for provider::test_get_users_in_context().
93
     */
11 efrain 94
    public function test_get_users_in_context(): void {
1 efrain 95
        global $DB;
96
        $component = 'repository_onedrive';
97
 
98
        // Test setup.
99
        $user1 = $this->getDataGenerator()->create_user();
100
        $user2 = $this->getDataGenerator()->create_user();
101
        $u1id = $user1->id;
102
        $u2id = $user2->id;
103
 
104
        // Add a repository_onedrive_access records for each user.
105
        $this->setUser($user1);
106
        $access = (object)[
107
            'usermodified' => $u1id,
108
            'itemid' => 'Some onedrive access item data',
109
            'permissionid' => 'Some onedrive access permission data',
110
            'timecreated' => date('u'),
111
            'timemodified' => date('u'),
112
        ];
113
        $DB->insert_record('repository_onedrive_access', $access);
114
 
115
        $this->setUser($user2);
116
        $access = (object)[
117
            'usermodified' => $u2id,
118
            'itemid' => 'Another onedrive access item data',
119
            'permissionid' => 'Another onedrive access permission data',
120
            'timecreated' => date('u'),
121
            'timemodified' => date('u'),
122
        ];
123
        $DB->insert_record('repository_onedrive_access', $access);
124
 
125
        // Fetch the context of each user's access record.
126
        $contextlist = provider::get_contexts_for_userid($u1id);
127
        $u1contexts = $contextlist->get_contexts();
128
        $this->assertCount(1, $u1contexts);
129
 
130
        $contextlist = provider::get_contexts_for_userid($u2id);
131
        $u2contexts = $contextlist->get_contexts();
132
        $this->assertCount(1, $u2contexts);
133
 
134
        $contexts = [
135
            $u1id => $u1contexts[0],
136
            $u2id => $u2contexts[0],
137
        ];
138
 
139
        // Test context 1 only contains user 1.
140
        $userlist = new \core_privacy\local\request\userlist($contexts[$u1id], $component);
141
        provider::get_users_in_context($userlist);
142
 
143
        $this->assertCount(1, $userlist);
144
        $actual = $userlist->get_userids();
145
        $this->assertEquals([$u1id], $actual);
146
 
147
        // Test context 2 only contains user 2.
148
        $userlist = new \core_privacy\local\request\userlist($contexts[$u2id], $component);
149
        provider::get_users_in_context($userlist);
150
 
151
        $this->assertCount(1, $userlist);
152
        $actual = $userlist->get_userids();
153
        $this->assertEquals([$u2id], $actual);
154
 
155
        // Test the contexts match the users' contexts.
156
        $this->assertEquals($u1id, $contexts[$u1id]->instanceid);
157
        $this->assertEquals($u2id, $contexts[$u2id]->instanceid);
158
    }
159
 
160
    /**
161
     * Test for provider::export_user_data().
162
     */
11 efrain 163
    public function test_export_user_data(): void {
1 efrain 164
        global $DB;
165
 
166
        // Test setup.
167
        $user = $this->getDataGenerator()->create_user();
168
        $this->setUser($user);
169
 
170
        // Add two repository_onedrive_access records for the User.
171
        $access = (object)[
172
            'usermodified' => $user->id,
173
            'itemid' => 'Some onedrive access item data',
174
            'permissionid' => 'Some onedrive access permission data',
175
            'timecreated' => date('u'),
176
            'timemodified' => date('u'),
177
        ];
178
        $DB->insert_record('repository_onedrive_access', $access);
179
        $access = (object)[
180
            'usermodified' => $user->id,
181
            'itemid' => 'Another onedrive access item data',
182
            'permissionid' => 'Another onedrive access permission data',
183
            'timecreated' => date('u'),
184
            'timemodified' => date('u'),
185
        ];
186
        $DB->insert_record('repository_onedrive_access', $access);
187
 
188
        // Test there are two repository_onedrive_access records for the User.
189
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user->id]);
190
        $this->assertCount(2, $access);
191
 
192
        // Test the User's retrieved contextlist contains only one context.
193
        $contextlist = provider::get_contexts_for_userid($user->id);
194
        $contexts = $contextlist->get_contexts();
195
        $this->assertCount(1, $contexts);
196
 
197
        // Test the User's contexts equal the User's own context.
198
        $context = reset($contexts);
199
        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
200
        $this->assertEquals($user->id, $context->instanceid);
201
        $approvedcontextlist = new approved_contextlist($user, 'repository_onedrive', $contextlist->get_contextids());
202
 
203
        // Retrieve repository_onedrive_access data only for this user.
204
        provider::export_user_data($approvedcontextlist);
205
 
206
        // Test the repository_onedrive_access data is exported at the User context level.
207
        $user = $approvedcontextlist->get_user();
208
        $contextuser = \context_user::instance($user->id);
209
        $writer = writer::with_context($contextuser);
210
        $this->assertTrue($writer->has_any_data());
211
    }
212
 
213
    /**
214
     * Test for provider::delete_data_for_all_users_in_context().
215
     */
11 efrain 216
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 217
        global $DB;
218
 
219
        // Test setup.
220
        $user = $this->getDataGenerator()->create_user();
221
        $this->setUser($user);
222
 
223
        // Add two repository_onedrive_access records for the User.
224
        $access = (object)[
225
            'usermodified' => $user->id,
226
            'itemid' => 'Some onedrive access item data',
227
            'permissionid' => 'Some onedrive access permission data',
228
            'timecreated' => date('u'),
229
            'timemodified' => date('u'),
230
        ];
231
        $DB->insert_record('repository_onedrive_access', $access);
232
        $access = (object)[
233
            'usermodified' => $user->id,
234
            'itemid' => 'Another onedrive access item data',
235
            'permissionid' => 'Another onedrive access permission data',
236
            'timecreated' => date('u'),
237
            'timemodified' => date('u'),
238
        ];
239
        $DB->insert_record('repository_onedrive_access', $access);
240
 
241
        // Test there are two repository_onedrive_access records for the User.
242
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user->id]);
243
        $this->assertCount(2, $access);
244
 
245
        // Test the User's retrieved contextlist contains only one context.
246
        $contextlist = provider::get_contexts_for_userid($user->id);
247
        $contexts = $contextlist->get_contexts();
248
        $this->assertCount(1, $contexts);
249
 
250
        // Test the User's contexts equal the User's own context.
251
        $context = reset($contexts);
252
        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
253
        $this->assertEquals($user->id, $context->instanceid);
254
 
255
        // Test delete all users content by context.
256
        provider::delete_data_for_all_users_in_context($context);
257
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user->id]);
258
        $this->assertCount(0, $access);
259
    }
260
 
261
    /**
262
     * Test for provider::delete_data_for_user().
263
     */
11 efrain 264
    public function test_delete_data_for_user(): void {
1 efrain 265
        global $DB;
266
 
267
        // Test setup.
268
        $user1 = $this->getDataGenerator()->create_user();
269
        $user2 = $this->getDataGenerator()->create_user();
270
        $this->setUser($user1);
271
 
272
        // Add 3 repository_onedrive_accesss records for User 1.
273
        $noaccess = 3;
274
        for ($a = 0; $a < $noaccess; $a++) {
275
            $access = (object)[
276
                'usermodified' => $user1->id,
277
                'itemid' => 'Some onedrive access item data - ' . $a,
278
                'permissionid' => 'Some onedrive access permission data - ' . $a,
279
                'timecreated' => date('u'),
280
                'timemodified' => date('u'),
281
            ];
282
            $DB->insert_record('repository_onedrive_access', $access);
283
        }
284
        // Add 1 repository_onedrive_accesss record for User 2.
285
        $access = (object)[
286
            'usermodified' => $user2->id,
287
            'itemid' => 'Some onedrive access item data',
288
            'permissionid' => 'Some onedrive access permission data',
289
            'timecreated' => date('u'),
290
            'timemodified' => date('u'),
291
        ];
292
        $DB->insert_record('repository_onedrive_access', $access);
293
 
294
        // Test the created repository_onedrive records for User 1 equals test number of access specified.
295
        $communities = $DB->get_records('repository_onedrive_access', ['usermodified' => $user1->id]);
296
        $this->assertCount($noaccess, $communities);
297
 
298
        // Test the created repository_onedrive records for User 2 equals 1.
299
        $communities = $DB->get_records('repository_onedrive_access', ['usermodified' => $user2->id]);
300
        $this->assertCount(1, $communities);
301
 
302
        // Test the deletion of repository_onedrive_access records for User 1 results in zero records.
303
        $contextlist = provider::get_contexts_for_userid($user1->id);
304
        $contexts = $contextlist->get_contexts();
305
        $this->assertCount(1, $contexts);
306
 
307
        // Test the User's contexts equal the User's own context.
308
        $context = reset($contexts);
309
        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
310
        $this->assertEquals($user1->id, $context->instanceid);
311
 
312
        $approvedcontextlist = new approved_contextlist($user1, 'repository_onedrive', $contextlist->get_contextids());
313
        provider::delete_data_for_user($approvedcontextlist);
314
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user1->id]);
315
        $this->assertCount(0, $access);
316
 
317
        // Test that User 2's single repository_onedrive_access record still exists.
318
        $contextlist = provider::get_contexts_for_userid($user2->id);
319
        $contexts = $contextlist->get_contexts();
320
        $this->assertCount(1, $contexts);
321
 
322
        // Test the User's contexts equal the User's own context.
323
        $context = reset($contexts);
324
        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
325
        $this->assertEquals($user2->id, $context->instanceid);
326
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user2->id]);
327
        $this->assertCount(1, $access);
328
    }
329
 
330
    /**
331
     * Test for provider::delete_data_for_users().
332
     */
11 efrain 333
    public function test_delete_data_for_users(): void {
1 efrain 334
        global $DB;
335
        $component = 'repository_onedrive';
336
 
337
        // Test setup.
338
        $user1 = $this->getDataGenerator()->create_user();
339
        $user2 = $this->getDataGenerator()->create_user();
340
        $this->setUser($user1);
341
 
342
        // Add 3 repository_onedrive_accesss records for User 1.
343
        $noaccess = 3;
344
        for ($a = 0; $a < $noaccess; $a++) {
345
            $access = (object)[
346
                'usermodified' => $user1->id,
347
                'itemid' => 'Some onedrive access item data for user 1 - ' . $a,
348
                'permissionid' => 'Some onedrive access permission data - ' . $a,
349
                'timecreated' => date('u'),
350
                'timemodified' => date('u'),
351
            ];
352
            $DB->insert_record('repository_onedrive_access', $access);
353
        }
354
        // Add 1 repository_onedrive_accesss record for User 2.
355
        $access = (object)[
356
            'usermodified' => $user2->id,
357
            'itemid' => 'Some onedrive access item data for user 2',
358
            'permissionid' => 'Some onedrive access permission data',
359
            'timecreated' => date('u'),
360
            'timemodified' => date('u'),
361
        ];
362
        $DB->insert_record('repository_onedrive_access', $access);
363
 
364
        // Test the created repository_onedrive records for User 1 equals test number of access specified.
365
        $communities = $DB->get_records('repository_onedrive_access', ['usermodified' => $user1->id]);
366
        $this->assertCount($noaccess, $communities);
367
 
368
        // Test the created repository_onedrive records for User 2 equals 1.
369
        $communities = $DB->get_records('repository_onedrive_access', ['usermodified' => $user2->id]);
370
        $this->assertCount(1, $communities);
371
 
372
        // Fetch the context of each user's access record.
373
        $contextlist = provider::get_contexts_for_userid($user1->id);
374
        $u1contexts = $contextlist->get_contexts();
375
 
376
        // Test the deletion of context 1 results in deletion of user 1's records only.
377
        $approveduserids = [$user1->id, $user2->id];
378
        $approvedlist = new approved_userlist($u1contexts[0], $component, $approveduserids);
379
        provider::delete_data_for_users($approvedlist);
380
 
381
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user1->id]);
382
        $this->assertCount(0, $access);
383
 
384
        // Ensure user 2's record still exists.
385
        $access = $DB->get_records('repository_onedrive_access', ['usermodified' => $user2->id]);
386
        $this->assertCount(1, $access);
387
    }
388
}