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
/**
18
 * Data provider tests.
19
 *
20
 * @package    mod_feedback
21
 * @category   test
22
 * @copyright  2018 Frédéric Massart
23
 * @author     Frédéric Massart <fred@branchup.tech>
24
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25
 */
26
namespace mod_feedback\privacy;
27
 
28
defined('MOODLE_INTERNAL') || die();
29
global $CFG;
30
 
31
use core_privacy\tests\provider_testcase;
32
use core_privacy\local\request\approved_contextlist;
33
use core_privacy\local\request\approved_userlist;
34
use core_privacy\local\request\transform;
35
use core_privacy\local\request\writer;
36
use mod_feedback\privacy\provider;
37
 
38
require_once($CFG->dirroot . '/mod/feedback/lib.php');
39
 
40
/**
41
 * Data provider testcase class.
42
 *
43
 * @package    mod_feedback
44
 * @category   test
45
 * @copyright  2018 Frédéric Massart
46
 * @author     Frédéric Massart <fred@branchup.tech>
47
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
48
 */
1441 ariadna 49
final class provider_test extends provider_testcase {
1 efrain 50
 
51
    public function setUp(): void {
1441 ariadna 52
        parent::setUp();
1 efrain 53
        $this->resetAfterTest();
54
    }
55
 
56
    /**
57
     * Test getting the contexts for a user.
58
     */
11 efrain 59
    public function test_get_contexts_for_userid(): void {
1 efrain 60
        global $DB;
61
        $dg = $this->getDataGenerator();
62
        $fg = $dg->get_plugin_generator('mod_feedback');
63
 
64
        $c1 = $dg->create_course();
65
        $c2 = $dg->create_course();
66
        $cm0a = $dg->create_module('feedback', ['course' => SITEID]);
67
        $cm1a = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
68
        $cm1b = $dg->create_module('feedback', ['course' => $c1]);
69
        $cm2a = $dg->create_module('feedback', ['course' => $c2]);
70
        $cm2b = $dg->create_module('feedback', ['course' => $c2]);
71
        $cm2c = $dg->create_module('feedback', ['course' => $c2]);
72
 
73
        $u1 = $dg->create_user();
74
        $u2 = $dg->create_user();
75
 
76
        foreach ([$cm0a, $cm1a, $cm1b, $cm2a] as $feedback) {
77
            $i1 = $fg->create_item_numeric($feedback);
78
            $i2 = $fg->create_item_multichoice($feedback);
79
            $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
80
 
81
            if ($feedback == $cm1b) {
82
                $this->create_submission_with_answers($feedback, $u2, $answers);
83
            } else {
84
                $this->create_submission_with_answers($feedback, $u1, $answers);
85
            }
86
        }
87
 
88
        // Unsaved submission for u1 in cm2b.
89
        $feedback = $cm2b;
90
        $i1 = $fg->create_item_numeric($feedback);
91
        $i2 = $fg->create_item_multichoice($feedback);
92
        $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
93
        $this->create_tmp_submission_with_answers($feedback, $u1, $answers);
94
 
95
        // Unsaved submission for u2 in cm2c.
96
        $feedback = $cm2c;
97
        $i1 = $fg->create_item_numeric($feedback);
98
        $i2 = $fg->create_item_multichoice($feedback);
99
        $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
100
        $this->create_tmp_submission_with_answers($feedback, $u2, $answers);
101
 
102
        $contextids = provider::get_contexts_for_userid($u1->id)->get_contextids();
103
        $this->assertCount(4, $contextids);
104
        $this->assertTrue(in_array(\context_module::instance($cm0a->cmid)->id, $contextids));
105
        $this->assertTrue(in_array(\context_module::instance($cm1a->cmid)->id, $contextids));
106
        $this->assertTrue(in_array(\context_module::instance($cm2a->cmid)->id, $contextids));
107
        $this->assertFalse(in_array(\context_module::instance($cm1b->cmid)->id, $contextids));
108
        $this->assertTrue(in_array(\context_module::instance($cm2b->cmid)->id, $contextids));
109
        $this->assertFalse(in_array(\context_module::instance($cm2c->cmid)->id, $contextids));
110
 
111
        $contextids = provider::get_contexts_for_userid($u2->id)->get_contextids();
112
        $this->assertCount(2, $contextids);
113
        $this->assertFalse(in_array(\context_module::instance($cm0a->cmid)->id, $contextids));
114
        $this->assertFalse(in_array(\context_module::instance($cm1a->cmid)->id, $contextids));
115
        $this->assertFalse(in_array(\context_module::instance($cm2a->cmid)->id, $contextids));
116
        $this->assertTrue(in_array(\context_module::instance($cm1b->cmid)->id, $contextids));
117
        $this->assertFalse(in_array(\context_module::instance($cm2b->cmid)->id, $contextids));
118
        $this->assertTrue(in_array(\context_module::instance($cm2c->cmid)->id, $contextids));
119
    }
120
 
121
    /**
122
     * Test getting the users in a context.
123
     */
11 efrain 124
    public function test_get_users_in_context(): void {
1 efrain 125
        global $DB;
126
        $dg = $this->getDataGenerator();
127
        $fg = $dg->get_plugin_generator('mod_feedback');
128
        $component = 'mod_feedback';
129
 
130
        $c1 = $dg->create_course();
131
        $c2 = $dg->create_course();
132
        $cm0 = $dg->create_module('feedback', ['course' => SITEID]);
133
        $cm1a = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
134
        $cm1b = $dg->create_module('feedback', ['course' => $c1]);
135
        $cm2 = $dg->create_module('feedback', ['course' => $c2]);
136
 
137
        $u1 = $dg->create_user();
138
        $u2 = $dg->create_user();
139
 
140
        foreach ([$cm0, $cm1a, $cm1b, $cm2] as $feedback) {
141
            $i1 = $fg->create_item_numeric($feedback);
142
            $i2 = $fg->create_item_multichoice($feedback);
143
            $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
144
 
145
            if ($feedback == $cm1b) {
146
                $this->create_submission_with_answers($feedback, $u2, $answers);
147
            } else {
148
                $this->create_submission_with_answers($feedback, $u1, $answers);
149
            }
150
        }
151
 
152
        // Unsaved submission for u2 in cm1a.
153
        $feedback = $cm1a;
154
        $i1 = $fg->create_item_numeric($feedback);
155
        $i2 = $fg->create_item_multichoice($feedback);
156
        $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
157
        $this->create_tmp_submission_with_answers($feedback, $u2, $answers);
158
 
159
        // Only u1 in cm0.
160
        $context = \context_module::instance($cm0->cmid);
161
        $userlist = new \core_privacy\local\request\userlist($context, $component);
162
        provider::get_users_in_context($userlist);
163
 
164
        $this->assertCount(1, $userlist);
165
        $this->assertEquals([$u1->id], $userlist->get_userids());
166
 
167
        $context = \context_module::instance($cm1a->cmid);
168
        $userlist = new \core_privacy\local\request\userlist($context, $component);
169
        provider::get_users_in_context($userlist);
170
 
171
        // Two submissions in cm1a: saved for u1, unsaved for u2.
172
        $this->assertCount(2, $userlist);
173
 
174
        $expected = [$u1->id, $u2->id];
175
        $actual = $userlist->get_userids();
176
        sort($expected);
177
        sort($actual);
178
 
179
        $this->assertEquals($expected, $actual);
180
 
181
        // Only u2 in cm1b.
182
        $context = \context_module::instance($cm1b->cmid);
183
        $userlist = new \core_privacy\local\request\userlist($context, $component);
184
        provider::get_users_in_context($userlist);
185
 
186
        $this->assertCount(1, $userlist);
187
        $this->assertEquals([$u2->id], $userlist->get_userids());
188
 
189
        // Only u1 in cm2.
190
        $context = \context_module::instance($cm2->cmid);
191
        $userlist = new \core_privacy\local\request\userlist($context, $component);
192
        provider::get_users_in_context($userlist);
193
 
194
        $this->assertCount(1, $userlist);
195
        $this->assertEquals([$u1->id], $userlist->get_userids());
196
    }
197
 
198
    /**
199
     * Test deleting user data.
200
     */
11 efrain 201
    public function test_delete_data_for_user(): void {
1 efrain 202
        global $DB;
203
        $dg = $this->getDataGenerator();
204
        $fg = $dg->get_plugin_generator('mod_feedback');
205
 
206
        $c1 = $dg->create_course();
207
        $c2 = $dg->create_course();
208
        $cm0a = $dg->create_module('feedback', ['course' => SITEID]);
209
        $cm1a = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
210
        $cm2a = $dg->create_module('feedback', ['course' => $c2]);
211
 
212
        $u1 = $dg->create_user();
213
        $u2 = $dg->create_user();
214
 
215
        // Create a bunch of data.
216
        foreach ([$cm1a, $cm0a, $cm2a] as $feedback) {
217
            $i1 = $fg->create_item_numeric($feedback);
218
            $i2 = $fg->create_item_multichoice($feedback);
219
            $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
220
 
221
            // Create u2 user data for this module.
222
            if ($feedback == $cm1a) {
223
                $this->create_submission_with_answers($feedback, $u2, $answers);
224
                $this->create_tmp_submission_with_answers($feedback, $u2, $answers);
225
            }
226
 
227
            $this->create_submission_with_answers($feedback, $u1, $answers);
228
            $this->create_tmp_submission_with_answers($feedback, $u1, $answers);
229
        }
230
 
231
        $appctx = new approved_contextlist($u1, 'mod_feedback', [
232
            \context_module::instance($cm0a->cmid)->id,
233
            \context_module::instance($cm1a->cmid)->id
234
        ]);
235
        provider::delete_data_for_user($appctx);
236
 
237
        // Confirm all data is gone in those, except for u2.
238
        foreach ([$cm0a, $cm1a] as $feedback) {
239
            $this->assert_no_feedback_data_for_user($feedback, $u1);
240
            if ($feedback == $cm1a) {
241
                $this->assert_feedback_data_for_user($feedback, $u2);
242
                $this->assert_feedback_tmp_data_for_user($feedback, $u2);
243
            }
244
        }
245
 
246
        // Confirm cm2a wasn't affected.
247
        $this->assert_feedback_data_for_user($cm2a, $u1);
248
        $this->assert_feedback_tmp_data_for_user($cm2a, $u1);
249
 
250
    }
251
 
252
    /**
253
     * Test deleting data within a context for an approved userlist.
254
     */
11 efrain 255
    public function test_delete_data_for_users(): void {
1 efrain 256
        global $DB;
257
        $dg = $this->getDataGenerator();
258
        $fg = $dg->get_plugin_generator('mod_feedback');
259
 
260
        $c1 = $dg->create_course();
261
        $c2 = $dg->create_course();
262
        $cm0 = $dg->create_module('feedback', ['course' => SITEID]);
263
        $cm1 = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
264
        $cm2 = $dg->create_module('feedback', ['course' => $c2]);
265
        $context0 = \context_module::instance($cm0->cmid);
266
        $context1 = \context_module::instance($cm1->cmid);
267
 
268
        $u1 = $dg->create_user();
269
        $u2 = $dg->create_user();
270
 
271
        // Create a bunch of data.
272
        foreach ([$cm0, $cm1, $cm2] as $feedback) {
273
            $i1 = $fg->create_item_numeric($feedback);
274
            $i2 = $fg->create_item_multichoice($feedback);
275
            $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
276
 
277
            $this->create_submission_with_answers($feedback, $u1, $answers);
278
            $this->create_tmp_submission_with_answers($feedback, $u1, $answers);
279
 
280
            $this->create_submission_with_answers($feedback, $u2, $answers);
281
            $this->create_tmp_submission_with_answers($feedback, $u2, $answers);
282
        }
283
 
284
        // Delete u1 from cm0, ensure u2 data is retained.
285
        $approveduserlist = new approved_userlist($context0, 'mod_feedback', [$u1->id]);
286
        provider::delete_data_for_users($approveduserlist);
287
 
288
        $this->assert_no_feedback_data_for_user($cm0, $u1);
289
        $this->assert_feedback_data_for_user($cm0, $u2);
290
        $this->assert_feedback_tmp_data_for_user($cm0, $u2);
291
 
292
        // Ensure cm1 unaffected by cm1 deletes.
293
        $this->assert_feedback_data_for_user($cm1, $u1);
294
        $this->assert_feedback_tmp_data_for_user($cm1, $u1);
295
        $this->assert_feedback_data_for_user($cm1, $u2);
296
        $this->assert_feedback_tmp_data_for_user($cm1, $u2);
297
 
298
        // Delete u1 and u2 from cm1, ensure no data is retained.
299
        $approveduserlist = new approved_userlist($context1, 'mod_feedback', [$u1->id, $u2->id]);
300
        provider::delete_data_for_users($approveduserlist);
301
 
302
        $this->assert_no_feedback_data_for_user($cm1, $u1);
303
        $this->assert_no_feedback_data_for_user($cm1, $u2);
304
 
305
        // Ensure cm2 is unaffected by any of the deletes.
306
        $this->assert_feedback_data_for_user($cm2, $u1);
307
        $this->assert_feedback_tmp_data_for_user($cm2, $u1);
308
        $this->assert_feedback_data_for_user($cm2, $u2);
309
        $this->assert_feedback_tmp_data_for_user($cm2, $u2);
310
    }
311
 
312
    /**
313
     * Test deleting a whole context.
314
     */
11 efrain 315
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 316
        global $DB;
317
        $dg = $this->getDataGenerator();
318
        $fg = $dg->get_plugin_generator('mod_feedback');
319
 
320
        $c1 = $dg->create_course();
321
        $c2 = $dg->create_course();
322
        $cm0a = $dg->create_module('feedback', ['course' => SITEID]);
323
        $cm1a = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
324
 
325
        $u1 = $dg->create_user();
326
        $u2 = $dg->create_user();
327
 
328
        // Create a bunch of data.
329
        foreach ([$cm1a, $cm0a] as $feedback) {
330
            $i1 = $fg->create_item_numeric($feedback);
331
            $i2 = $fg->create_item_multichoice($feedback);
332
            $answers = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
333
 
334
            $this->create_submission_with_answers($feedback, $u1, $answers);
335
            $this->create_tmp_submission_with_answers($feedback, $u1, $answers);
336
 
337
            $this->create_submission_with_answers($feedback, $u2, $answers);
338
            $this->create_tmp_submission_with_answers($feedback, $u2, $answers);
339
        }
340
 
341
        provider::delete_data_for_all_users_in_context(\context_module::instance($cm1a->cmid));
342
 
343
        $this->assert_no_feedback_data_for_user($cm1a, $u1);
344
        $this->assert_no_feedback_data_for_user($cm1a, $u2);
345
        $this->assert_feedback_data_for_user($cm0a, $u1);
346
        $this->assert_feedback_data_for_user($cm0a, $u2);
347
        $this->assert_feedback_tmp_data_for_user($cm0a, $u1);
348
        $this->assert_feedback_tmp_data_for_user($cm0a, $u2);
349
    }
350
 
351
    /**
352
     * Test exporting data.
353
     */
11 efrain 354
    public function test_export_user_data(): void {
1 efrain 355
        global $DB;
356
        $dg = $this->getDataGenerator();
357
        $fg = $dg->get_plugin_generator('mod_feedback');
358
 
359
        $c1 = $dg->create_course();
360
        $c2 = $dg->create_course();
361
        $cm0a = $dg->create_module('feedback', ['course' => SITEID]);
362
        $cm1a = $dg->create_module('feedback', ['course' => $c1, 'anonymous' => FEEDBACK_ANONYMOUS_NO]);
363
        $cm2a = $dg->create_module('feedback', ['course' => $c2, 'anonymous' => FEEDBACK_ANONYMOUS_YES, 'multiple_submit' => 1]);
364
        $cm2b = $dg->create_module('feedback', ['course' => $c2]);
365
        $cm2c = $dg->create_module('feedback', ['course' => $c2]);
366
 
367
        $u1 = $dg->create_user();
368
        $u2 = $dg->create_user();
369
 
370
        // Create a bunch of data.
371
        foreach ([$cm0a, $cm1a, $cm2a, $cm2b] as $feedback) {
372
            $i1 = $fg->create_item_numeric($feedback, ['name' => 'Q1', 'label' => 'L1']);
373
            $i2 = $fg->create_item_multichoice($feedback, ['name' => 'Q2', 'label' => 'L2']);
374
            $answersu1 = ['numeric_' . $i1->id => '1', 'multichoice_' . $i2->id => [1]];
375
            $answersu2 = ['numeric_' . $i1->id => '2', 'multichoice_' . $i2->id => [2]];
376
 
377
            if ($cm0a == $feedback) {
378
                $this->create_submission_with_answers($feedback, $u1, $answersu1);
379
                $this->create_tmp_submission_with_answers($feedback, $u1, $answersu1);
380
            } else if ($cm1a == $feedback) {
381
                $this->create_tmp_submission_with_answers($feedback, $u1, $answersu1);
382
            } else if ($cm2a == $feedback) {
383
                $this->create_submission_with_answers($feedback, $u1, $answersu1);
384
                $this->create_submission_with_answers($feedback, $u1, ['numeric_' . $i1->id => '1337'], 2);
385
            } else if ($cm2c == $feedback) {
386
                $this->create_submission_with_answers($feedback, $u1, $answersu1);
387
                $this->create_tmp_submission_with_answers($feedback, $u1, $answersu1);
388
            }
389
 
390
            $this->create_submission_with_answers($feedback, $u2, $answersu2);
391
            $this->create_tmp_submission_with_answers($feedback, $u2, $answersu2);
392
        }
393
 
394
        $appctx = new approved_contextlist($u1, 'mod_feedback', [
395
            \context_module::instance($cm0a->cmid)->id,
396
            \context_module::instance($cm1a->cmid)->id,
397
            \context_module::instance($cm2a->cmid)->id,
398
            \context_module::instance($cm2b->cmid)->id,
399
        ]);
400
        provider::export_user_data($appctx);
401
 
402
        // CM0A.
403
        $data = writer::with_context(\context_module::instance($cm0a->cmid))->get_data();
404
        $this->assertCount(2, $data->submissions);
405
        $submission = $data->submissions[0];
406
        $this->assertEquals(transform::yesno(false), $submission['inprogress']);
407
        $this->assertEquals(transform::yesno(true), $submission['anonymousresponse']);
408
        $this->assertCount(2, $submission['answers']);
409
        $this->assertEquals('Q1', $submission['answers'][0]['question']);
410
        $this->assertEquals('1', $submission['answers'][0]['answer']);
411
        $this->assertEquals('Q2', $submission['answers'][1]['question']);
412
        $this->assertEquals('a', $submission['answers'][1]['answer']);
413
        $submission = $data->submissions[1];
414
        $this->assertEquals(transform::yesno(true), $submission['inprogress']);
415
        $this->assertEquals(transform::yesno(true), $submission['anonymousresponse']);
416
        $this->assertCount(2, $submission['answers']);
417
        $this->assertEquals('Q1', $submission['answers'][0]['question']);
418
        $this->assertEquals('1', $submission['answers'][0]['answer']);
419
        $this->assertEquals('Q2', $submission['answers'][1]['question']);
420
        $this->assertEquals('a', $submission['answers'][1]['answer']);
421
 
422
        // CM1A.
423
        $data = writer::with_context(\context_module::instance($cm1a->cmid))->get_data();
424
        $this->assertCount(1, $data->submissions);
425
        $submission = $data->submissions[0];
426
        $this->assertEquals(transform::yesno(true), $submission['inprogress']);
427
        $this->assertEquals(transform::yesno(false), $submission['anonymousresponse']);
428
        $this->assertCount(2, $submission['answers']);
429
        $this->assertEquals('Q1', $submission['answers'][0]['question']);
430
        $this->assertEquals('1', $submission['answers'][0]['answer']);
431
        $this->assertEquals('Q2', $submission['answers'][1]['question']);
432
        $this->assertEquals('a', $submission['answers'][1]['answer']);
433
 
434
        // CM2A.
435
        $data = writer::with_context(\context_module::instance($cm2a->cmid))->get_data();
436
        $this->assertCount(2, $data->submissions);
437
        $submission = $data->submissions[0];
438
        $this->assertEquals(transform::yesno(false), $submission['inprogress']);
439
        $this->assertEquals(transform::yesno(true), $submission['anonymousresponse']);
440
        $this->assertCount(2, $submission['answers']);
441
        $this->assertEquals('Q1', $submission['answers'][0]['question']);
442
        $this->assertEquals('1', $submission['answers'][0]['answer']);
443
        $this->assertEquals('Q2', $submission['answers'][1]['question']);
444
        $this->assertEquals('a', $submission['answers'][1]['answer']);
445
        $submission = $data->submissions[1];
446
        $this->assertEquals(transform::yesno(false), $submission['inprogress']);
447
        $this->assertEquals(transform::yesno(true), $submission['anonymousresponse']);
448
        $this->assertCount(1, $submission['answers']);
449
        $this->assertEquals('Q1', $submission['answers'][0]['question']);
450
        $this->assertEquals('1337', $submission['answers'][0]['answer']);
451
 
452
        // CM2B (no data).
453
        $data = writer::with_context(\context_module::instance($cm2b->cmid))->get_data();
454
        $this->assertEmpty($data);
455
 
456
        // CM2C (not exported).
457
        $data = writer::with_context(\context_module::instance($cm2b->cmid))->get_data();
458
        $this->assertEmpty($data);
459
    }
460
 
461
    /**
462
     * Assert there is no feedback data for a user.
463
     *
464
     * @param object $feedback The feedback.
465
     * @param object $user The user.
466
     * @return void
467
     */
468
    protected function assert_no_feedback_data_for_user($feedback, $user) {
469
        global $DB;
470
        $this->assertFalse($DB->record_exists('feedback_completed', ['feedback' => $feedback->id, 'userid' => $user->id]));
471
        $this->assertFalse($DB->record_exists('feedback_completedtmp', ['feedback' => $feedback->id, 'userid' => $user->id]));
472
 
473
        // Check that there aren't orphan values because we can't check by userid.
474
        $sql = "
475
            SELECT fv.id
476
              FROM {%s} fv
477
         LEFT JOIN {%s} fc
478
                ON fc.id = fv.completed
479
             WHERE fc.id IS NULL";
480
        $this->assertFalse($DB->record_exists_sql(sprintf($sql, 'feedback_value', 'feedback_completed'), []));
481
        $this->assertFalse($DB->record_exists_sql(sprintf($sql, 'feedback_valuetmp', 'feedback_completedtmp'), []));
482
    }
483
 
484
    /**
485
     * Assert there are submissions and answers for user.
486
     *
487
     * @param object $feedback The feedback.
488
     * @param object $user The user.
489
     * @param int $submissioncount The number of submissions.
490
     * @param int $valuecount The number of values per submission.
491
     * @return void
492
     */
493
    protected function assert_feedback_data_for_user($feedback, $user, $submissioncount = 1, $valuecount = 2) {
494
        global $DB;
495
        $completeds = $DB->get_records('feedback_completed', ['feedback' => $feedback->id, 'userid' => $user->id]);
496
        $this->assertCount($submissioncount, $completeds);
497
        foreach ($completeds as $record) {
498
            $this->assertEquals($valuecount, $DB->count_records('feedback_value', ['completed' => $record->id]));
499
        }
500
    }
501
 
502
    /**
503
     * Assert there are temporary submissions and answers for user.
504
     *
505
     * @param object $feedback The feedback.
506
     * @param object $user The user.
507
     * @param int $submissioncount The number of submissions.
508
     * @param int $valuecount The number of values per submission.
509
     * @return void
510
     */
511
    protected function assert_feedback_tmp_data_for_user($feedback, $user, $submissioncount = 1, $valuecount = 2) {
512
        global $DB;
513
        $completedtmps = $DB->get_records('feedback_completedtmp', ['feedback' => $feedback->id, 'userid' => $user->id]);
514
        $this->assertCount($submissioncount, $completedtmps);
515
        foreach ($completedtmps as $record) {
516
            $this->assertEquals($valuecount, $DB->count_records('feedback_valuetmp', ['completed' => $record->id]));
517
        }
518
    }
519
 
520
    /**
521
     * Create an submission with answers.
522
     *
523
     * @param object $feedback The feedback.
524
     * @param object $user The user.
525
     * @param array $answers Answers.
526
     * @param int $submissioncount The number of submissions expected after this entry.
527
     * @return void
528
     */
529
    protected function create_submission_with_answers($feedback, $user, $answers, $submissioncount = 1) {
530
        global $DB;
531
 
532
        $modinfo = get_fast_modinfo($feedback->course);
533
        $cm = $modinfo->get_cm($feedback->cmid);
534
 
535
        $feedbackcompletion = new \mod_feedback_completion($feedback, $cm, $feedback->course, false, null, null, $user->id);
536
        $feedbackcompletion->save_response_tmp((object) $answers);
537
        $feedbackcompletion->save_response();
538
        $this->assertEquals($submissioncount, $DB->count_records('feedback_completed', ['feedback' => $feedback->id,
539
            'userid' => $user->id]));
540
        $this->assertEquals(count($answers), $DB->count_records('feedback_value', [
541
            'completed' => $feedbackcompletion->get_completed()->id]));
542
    }
543
 
544
    /**
545
     * Create a temporary submission with answers.
546
     *
547
     * @param object $feedback The feedback.
548
     * @param object $user The user.
549
     * @param array $answers Answers.
550
     * @return void
551
     */
552
    protected function create_tmp_submission_with_answers($feedback, $user, $answers) {
553
        global $DB;
554
 
555
        $modinfo = get_fast_modinfo($feedback->course);
556
        $cm = $modinfo->get_cm($feedback->cmid);
557
 
558
        $feedbackcompletion = new \mod_feedback_completion($feedback, $cm, $feedback->course, false, null, null, $user->id);
559
        $feedbackcompletion->save_response_tmp((object) $answers);
560
        $this->assertEquals(1, $DB->count_records('feedback_completedtmp', ['feedback' => $feedback->id, 'userid' => $user->id]));
561
        $this->assertEquals(2, $DB->count_records('feedback_valuetmp', [
562
            'completed' => $feedbackcompletion->get_current_completed_tmp()->id]));
563
    }
564
}