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_forum;
18
 
19
use mod_forum_external;
20
use mod_forum_tests_generator_trait;
21
 
22
defined('MOODLE_INTERNAL') || die();
23
 
24
global $CFG;
25
 
26
require_once($CFG->dirroot . '/mod/forum/externallib.php');
27
require_once(__DIR__ . '/generator_trait.php');
28
 
29
/**
30
 * The discussion_list vault tests.
31
 *
32
 * @package    mod_forum
33
 * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
34
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35
 */
1441 ariadna 36
final class vaults_discussion_list_test extends \advanced_testcase {
1 efrain 37
    // Make use of the test generator trait.
38
    use mod_forum_tests_generator_trait;
39
 
40
    /** @var \mod_forum\local\vaults\discussion_list */
41
    private $vault;
42
 
43
    /**
44
     * Set up function for tests.
45
     */
46
    public function setUp(): void {
1441 ariadna 47
        parent::setUp();
1 efrain 48
        $vaultfactory = \mod_forum\local\container::get_vault_factory();
49
        $this->vault = $vaultfactory->get_discussions_in_forum_vault();
50
    }
51
 
52
    /**
53
     * Test get_from_id.
54
     */
11 efrain 55
    public function test_get_from_id(): void {
1 efrain 56
        $this->resetAfterTest();
57
 
58
        $datagenerator = $this->getDataGenerator();
59
        $vault = $this->vault;
60
        $user = $datagenerator->create_user();
61
        $course = $datagenerator->create_course();
62
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
63
        [$discussion, $post] = $this->helper_post_to_forum($forum, $user);
64
 
65
        $discussionlist = $vault->get_from_id($discussion->id);
66
 
67
        $this->assertEquals($discussion->id, $discussionlist->get_discussion()->get_id());
68
        $this->assertEquals($post->id, $discussionlist->get_first_post()->get_id());
69
        $this->assertEquals($user->id, $discussionlist->get_first_post_author()->get_id());
70
        $this->assertEquals($user->id, $discussionlist->get_latest_post_author()->get_id());
71
    }
72
 
73
    /**
74
     * Test get_from_forum_id.
75
     */
11 efrain 76
    public function test_get_from_forum_id(): void {
1 efrain 77
        $this->resetAfterTest();
78
 
79
        $datagenerator = $this->getDataGenerator();
80
        $vault = $this->vault;
81
        $user = $datagenerator->create_user();
82
        self::setUser($user);
83
        $course = $datagenerator->create_course();
84
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
85
 
86
        $this->getDataGenerator()->enrol_user($user->id, $course->id, null, 'manual');
87
 
88
        $this->assertEquals([], $vault->get_from_forum_id($forum->id, true, $user->id, null,
89
            0, 0));
90
 
91
        $now = time();
92
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 10, 'timemodified' => 1]);
93
        [$discussion2, $post2] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 9, 'timemodified' => 2]);
94
        [$hiddendiscussion, $post3] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now + 10, 'timemodified' => 3]);
95
        [$discussion3, $post4] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 8, 'timemodified' => 4]);
96
 
97
        // By default orders the discussions by last post.
98
        $summaries = array_values($vault->get_from_forum_id($forum->id, false, null, null,
99
            0, 0));
100
        $this->assertCount(3, $summaries);
101
        $this->assertEquals($discussion3->id, $summaries[0]->get_discussion()->get_id());
102
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
103
        $this->assertEquals($discussion1->id, $summaries[2]->get_discussion()->get_id());
104
 
105
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null, null,
106
            0, 0));
107
        $this->assertCount(4, $summaries);
108
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
109
        $this->assertEquals($discussion3->id, $summaries[1]->get_discussion()->get_id());
110
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
111
        $this->assertEquals($discussion1->id, $summaries[3]->get_discussion()->get_id());
112
 
113
        $summaries = array_values($vault->get_from_forum_id($forum->id, false, $user->id, null,
114
            0, 0));
115
        $this->assertCount(4, $summaries);
116
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
117
        $this->assertEquals($discussion3->id, $summaries[1]->get_discussion()->get_id());
118
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
119
        $this->assertEquals($discussion1->id, $summaries[3]->get_discussion()->get_id());
120
 
121
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null, null,
122
            1, 0));
123
        $this->assertCount(1, $summaries);
124
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
125
 
126
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null, null,
127
            1, 1));
128
        $this->assertCount(1, $summaries);
129
        $this->assertEquals($discussion3->id, $summaries[0]->get_discussion()->get_id());
130
 
131
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null, null,
132
            1, 2));
133
        $this->assertCount(1, $summaries);
134
        $this->assertEquals($discussion2->id, $summaries[0]->get_discussion()->get_id());
135
 
136
        // Create 2 replies for $post1.
137
        $this->helper_reply_to_post($post1, $user);
138
        $this->helper_reply_to_post($post1, $user);
139
        // Create 3 replies for $post2.
140
        $this->helper_reply_to_post($post2, $user);
141
        $this->helper_reply_to_post($post2, $user);
142
        $this->helper_reply_to_post($post2, $user);
143
        // Create 1 reply for $post3.
144
        $this->helper_reply_to_post($post3, $user);
145
 
146
        // Sort discussions by last post DESC.
147
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
148
            $vault::SORTORDER_LASTPOST_DESC, 0, 0));
149
        $this->assertCount(4, $summaries);
150
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
151
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
152
        $this->assertEquals($discussion1->id, $summaries[2]->get_discussion()->get_id());
153
        $this->assertEquals($discussion3->id, $summaries[3]->get_discussion()->get_id());
154
 
155
        // Sort discussions by last post ASC.
156
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
157
            $vault::SORTORDER_LASTPOST_ASC, 0, 0));
158
        $this->assertCount(4, $summaries);
159
        $this->assertEquals($discussion3->id, $summaries[0]->get_discussion()->get_id());
160
        $this->assertEquals($discussion1->id, $summaries[1]->get_discussion()->get_id());
161
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
162
        $this->assertEquals($hiddendiscussion->id, $summaries[3]->get_discussion()->get_id());
163
 
164
        // Sort discussions by replies DESC.
165
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
166
            $vault::SORTORDER_REPLIES_DESC, 0, 0));
167
        $this->assertCount(4, $summaries);
168
        $this->assertEquals($discussion2->id, $summaries[0]->get_discussion()->get_id());
169
        $this->assertEquals($discussion1->id, $summaries[1]->get_discussion()->get_id());
170
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
171
        $this->assertEquals($discussion3->id, $summaries[3]->get_discussion()->get_id());
172
 
173
        // Sort discussions by replies ASC.
174
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
175
            $vault::SORTORDER_REPLIES_ASC, 0, 0));
176
        $this->assertCount(4, $summaries);
177
        $this->assertEquals($discussion3->id, $summaries[0]->get_discussion()->get_id());
178
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
179
        $this->assertEquals($discussion1->id, $summaries[2]->get_discussion()->get_id());
180
        $this->assertEquals($discussion2->id, $summaries[3]->get_discussion()->get_id());
181
 
182
        // Sort discussions by discussion created DESC.
183
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
184
            $vault::SORTORDER_CREATED_DESC, 0, 0));
185
        $this->assertCount(4, $summaries);
186
        $this->assertEquals($discussion3->id, $summaries[0]->get_discussion()->get_id());
187
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
188
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
189
        $this->assertEquals($discussion1->id, $summaries[3]->get_discussion()->get_id());
190
 
191
        // Sort discussions by discussion created ASC.
192
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
193
            $vault::SORTORDER_CREATED_ASC, 0, 0));
194
        $this->assertCount(4, $summaries);
195
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
196
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
197
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
198
        $this->assertEquals($discussion3->id, $summaries[3]->get_discussion()->get_id());
199
 
200
        // Sort discussions when there is a pinned discussion.
201
        $this->pin_discussion($discussion1);
202
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
203
            $vault::SORTORDER_LASTPOST_ASC, 0, 0));
204
        $this->assertCount(4, $summaries);
205
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
206
        $this->assertEquals($discussion3->id, $summaries[1]->get_discussion()->get_id());
207
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
208
        $this->assertEquals($hiddendiscussion->id, $summaries[3]->get_discussion()->get_id());
209
 
210
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
211
            $vault::SORTORDER_LASTPOST_DESC, 0, 0));
212
        $this->assertCount(4, $summaries);
213
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
214
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
215
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
216
        $this->assertEquals($discussion3->id, $summaries[3]->get_discussion()->get_id());
217
 
218
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, null,
219
            $vault::SORTORDER_REPLIES_DESC, 0, 0));
220
        $this->assertCount(4, $summaries);
221
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
222
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
223
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
224
        $this->assertEquals($discussion3->id, $summaries[3]->get_discussion()->get_id());
225
 
226
        // Sort discussions where there is a pinned discussion and several starred discussions.
227
        $this->star_discussion($discussion3, 1);
228
        $this->star_discussion($hiddendiscussion, 1);
229
 
230
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, $user->id,
231
            $vault::SORTORDER_REPLIES_DESC, 0, 0));
232
        $this->assertCount(4, $summaries);
233
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
234
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
235
        $this->assertEquals($discussion3->id, $summaries[2]->get_discussion()->get_id());
236
        $this->assertEquals($discussion2->id, $summaries[3]->get_discussion()->get_id());
237
 
238
        $summaries = array_values($vault->get_from_forum_id($forum->id, true, $user->id,
239
            $vault::SORTORDER_REPLIES_ASC, 0, 0));
240
        $this->assertCount(4, $summaries);
241
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
242
        $this->assertEquals($discussion3->id, $summaries[1]->get_discussion()->get_id());
243
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
244
        $this->assertEquals($discussion2->id, $summaries[3]->get_discussion()->get_id());
245
    }
246
 
247
    /**
248
     * Test get_from_forum_id_and_group_id.
249
     */
11 efrain 250
    public function test_get_from_forum_id_and_group_id(): void {
1 efrain 251
        $this->resetAfterTest();
252
 
253
        $datagenerator = $this->getDataGenerator();
254
        $vault = $this->vault;
255
        $user = $datagenerator->create_user();
256
        self::setUser($user);
257
        $course = $datagenerator->create_course();
258
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
259
        $this->getDataGenerator()->enrol_user($user->id, $course->id, null, 'manual');
260
 
1441 ariadna 261
        $this->assertEquals([], $vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true, $user->id,
262
            null, 0, 0));
1 efrain 263
 
264
        $now = time();
1441 ariadna 265
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 10, 'timemodified' => $now + 1]);
266
        [$discussion2, $post2] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 9, 'timemodified' => $now + 2]);
267
        [$hiddendiscussion, $post3] = $this->helper_post_to_forum(
268
            $forum,
269
            $user,
270
            ['timestart' => $now + 10, 'timemodified' => $now + 3]
271
        );
1 efrain 272
        [$groupdiscussion1, $post4] = $this->helper_post_to_forum(
273
            $forum,
274
            $user,
1441 ariadna 275
            ['timestart' => $now - 8, 'timemodified' => $now + 4, 'groupid' => 1]
1 efrain 276
        );
277
        [$groupdiscussion2, $post5] = $this->helper_post_to_forum(
278
            $forum,
279
            $user,
1441 ariadna 280
            ['timestart' => $now - 7, 'timemodified' => $now + 5, 'groupid' => 2]
1 efrain 281
        );
282
        [$hiddengroupdiscussion, $post6] = $this->helper_post_to_forum(
283
            $forum,
284
            $user,
1441 ariadna 285
            ['timestart' => $now + 11, 'timemodified' => $now + 6, 'groupid' => 3]
1 efrain 286
        );
287
 
288
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
289
            null, null, 0, 0));
290
        $this->assertCount(6, $summaries);
291
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
292
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
293
        $this->assertEquals($groupdiscussion2->id, $summaries[2]->get_discussion()->get_id());
294
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
295
        $this->assertEquals($discussion2->id, $summaries[4]->get_discussion()->get_id());
296
        $this->assertEquals($discussion1->id, $summaries[5]->get_discussion()->get_id());
297
 
298
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], false,
299
            $user->id, null, 0, 0));
300
        $this->assertCount(6, $summaries);
301
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
302
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
303
        $this->assertEquals($groupdiscussion2->id, $summaries[2]->get_discussion()->get_id());
304
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
305
        $this->assertEquals($discussion2->id, $summaries[4]->get_discussion()->get_id());
306
        $this->assertEquals($discussion1->id, $summaries[5]->get_discussion()->get_id());
307
 
308
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
309
            null, null, 1, 0));
310
        $this->assertCount(1, $summaries);
311
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
312
 
313
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
314
            null, null, 1, 1));
315
        $this->assertCount(1, $summaries);
316
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
317
 
318
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
319
            null, null, 1, 2));
320
        $this->assertCount(1, $summaries);
321
        $this->assertEquals($groupdiscussion2->id, $summaries[0]->get_discussion()->get_id());
322
 
323
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], false,
324
            null, null, 0, 0));
325
        $this->assertCount(4, $summaries);
326
        $this->assertEquals($groupdiscussion2->id, $summaries[0]->get_discussion()->get_id());
327
        $this->assertEquals($groupdiscussion1->id, $summaries[1]->get_discussion()->get_id());
328
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
329
        $this->assertEquals($discussion1->id, $summaries[3]->get_discussion()->get_id());
330
 
331
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [], true,
332
            null, null, 0, 0));
333
        $this->assertCount(3, $summaries);
334
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
335
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
336
        $this->assertEquals($discussion1->id, $summaries[2]->get_discussion()->get_id());
337
 
338
        // Add 4 replies to $post1.
339
        $this->helper_reply_to_post($post1, $user);
340
        $this->helper_reply_to_post($post1, $user);
341
        $this->helper_reply_to_post($post1, $user);
342
        $this->helper_reply_to_post($post1, $user);
343
        // Add 5 replies to $post2.
344
        $this->helper_reply_to_post($post2, $user);
345
        $this->helper_reply_to_post($post2, $user);
346
        $this->helper_reply_to_post($post2, $user);
347
        $this->helper_reply_to_post($post2, $user);
348
        $this->helper_reply_to_post($post2, $user);
349
        // Add 3 replies to $post3.
350
        $this->helper_reply_to_post($post3, $user);
351
        $this->helper_reply_to_post($post3, $user);
352
        $this->helper_reply_to_post($post3, $user);
353
        // Add 2 replies to $post4.
354
        $this->helper_reply_to_post($post4, $user);
355
        $this->helper_reply_to_post($post4, $user);
356
        // Add 1 reply to $post5.
357
        $this->helper_reply_to_post($post5, $user);
358
 
359
        // Sort discussions by last post DESC.
360
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
361
            $user->id, $vault::SORTORDER_LASTPOST_DESC, 0, 0));
362
        $this->assertCount(6, $summaries);
1441 ariadna 363
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
364
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
365
        $this->assertEquals($groupdiscussion2->id, $summaries[2]->get_discussion()->get_id());
366
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
1 efrain 367
        $this->assertEquals($discussion2->id, $summaries[4]->get_discussion()->get_id());
368
        $this->assertEquals($discussion1->id, $summaries[5]->get_discussion()->get_id());
369
 
370
        // Sort discussions by last post ASC.
371
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
372
            $user->id, $vault::SORTORDER_LASTPOST_ASC, 0, 0));
373
        $this->assertCount(6, $summaries);
374
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
375
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
1441 ariadna 376
        $this->assertEquals($groupdiscussion1->id, $summaries[2]->get_discussion()->get_id());
377
        $this->assertEquals($groupdiscussion2->id, $summaries[3]->get_discussion()->get_id());
378
        $this->assertEquals($hiddendiscussion->id, $summaries[4]->get_discussion()->get_id());
379
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[5]->get_discussion()->get_id());
1 efrain 380
 
381
        // Sort discussions by replies DESC.
382
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
383
            $user->id, $vault::SORTORDER_REPLIES_DESC, 0, 0));
384
        $this->assertCount(6, $summaries);
385
        $this->assertEquals($discussion2->id, $summaries[0]->get_discussion()->get_id());
386
        $this->assertEquals($discussion1->id, $summaries[1]->get_discussion()->get_id());
387
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
388
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
389
        $this->assertEquals($groupdiscussion2->id, $summaries[4]->get_discussion()->get_id());
390
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[5]->get_discussion()->get_id());
391
 
392
        // Sort discussions by replies ASC.
393
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
394
            $user->id, $vault::SORTORDER_REPLIES_ASC, 0, 0));
395
        $this->assertCount(6, $summaries);
396
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
397
        $this->assertEquals($groupdiscussion2->id, $summaries[1]->get_discussion()->get_id());
398
        $this->assertEquals($groupdiscussion1->id, $summaries[2]->get_discussion()->get_id());
399
        $this->assertEquals($hiddendiscussion->id, $summaries[3]->get_discussion()->get_id());
400
        $this->assertEquals($discussion1->id, $summaries[4]->get_discussion()->get_id());
401
        $this->assertEquals($discussion2->id, $summaries[5]->get_discussion()->get_id());
402
 
403
        // Sort discussions by discussion created DESC.
404
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
405
            $user->id, $vault::SORTORDER_CREATED_DESC, 0, 0));
406
        $this->assertCount(6, $summaries);
407
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[0]->get_discussion()->get_id());
408
        $this->assertEquals($groupdiscussion2->id, $summaries[1]->get_discussion()->get_id());
409
        $this->assertEquals($groupdiscussion1->id, $summaries[2]->get_discussion()->get_id());
410
        $this->assertEquals($hiddendiscussion->id, $summaries[3]->get_discussion()->get_id());
411
        $this->assertEquals($discussion2->id, $summaries[4]->get_discussion()->get_id());
412
        $this->assertEquals($discussion1->id, $summaries[5]->get_discussion()->get_id());
413
 
414
        // Sort discussions by discussion created ASC.
415
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true,
416
            $user->id, $vault::SORTORDER_CREATED_ASC, 0, 0));
417
        $this->assertCount(6, $summaries);
418
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
419
        $this->assertEquals($discussion2->id, $summaries[1]->get_discussion()->get_id());
420
        $this->assertEquals($hiddendiscussion->id, $summaries[2]->get_discussion()->get_id());
421
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
422
        $this->assertEquals($groupdiscussion2->id, $summaries[4]->get_discussion()->get_id());
423
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[5]->get_discussion()->get_id());
424
 
425
        // Sort discussions when there is a pinned discussion.
426
        $this->pin_discussion($discussion1);
427
        $this->pin_discussion($hiddendiscussion);
428
 
1441 ariadna 429
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true, null,
1 efrain 430
            $vault::SORTORDER_LASTPOST_DESC, 0, 0));
431
        $this->assertCount(6, $summaries);
432
        $this->assertEquals($hiddendiscussion->id, $summaries[0]->get_discussion()->get_id());
433
        $this->assertEquals($discussion1->id, $summaries[1]->get_discussion()->get_id());
1441 ariadna 434
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[2]->get_discussion()->get_id());
435
        $this->assertEquals($groupdiscussion2->id, $summaries[3]->get_discussion()->get_id());
436
        $this->assertEquals($groupdiscussion1->id, $summaries[4]->get_discussion()->get_id());
1 efrain 437
        $this->assertEquals($discussion2->id, $summaries[5]->get_discussion()->get_id());
438
 
1441 ariadna 439
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true, null,
1 efrain 440
            $vault::SORTORDER_LASTPOST_ASC, 0, 0));
441
        $this->assertCount(6, $summaries);
442
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
443
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
444
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
1441 ariadna 445
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
446
        $this->assertEquals($groupdiscussion2->id, $summaries[4]->get_discussion()->get_id());
447
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[5]->get_discussion()->get_id());
1 efrain 448
 
1441 ariadna 449
        $summaries = array_values($vault->get_from_forum_id_and_group_id($forum->id, [1, 2, 3], true, null,
1 efrain 450
            $vault::SORTORDER_REPLIES_DESC, 0, 0));
451
        $this->assertCount(6, $summaries);
452
        $this->assertEquals($discussion1->id, $summaries[0]->get_discussion()->get_id());
453
        $this->assertEquals($hiddendiscussion->id, $summaries[1]->get_discussion()->get_id());
454
        $this->assertEquals($discussion2->id, $summaries[2]->get_discussion()->get_id());
455
        $this->assertEquals($groupdiscussion1->id, $summaries[3]->get_discussion()->get_id());
456
        $this->assertEquals($groupdiscussion2->id, $summaries[4]->get_discussion()->get_id());
457
        $this->assertEquals($hiddengroupdiscussion->id, $summaries[5]->get_discussion()->get_id());
458
    }
459
 
460
    /**
461
     * Test get_total_discussion_count_from_forum_id.
462
     */
11 efrain 463
    public function test_get_total_discussion_count_from_forum_id(): void {
1 efrain 464
        $this->resetAfterTest();
465
 
466
        $datagenerator = $this->getDataGenerator();
467
        $vault = $this->vault;
468
        $user = $datagenerator->create_user();
469
        $course = $datagenerator->create_course();
470
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
471
 
472
        $this->assertEquals(0, $vault->get_total_discussion_count_from_forum_id($forum->id, true,
473
            null));
474
 
475
        $now = time();
476
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 10, 'timemodified' => 1]);
477
        [$discussion2, $post2] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 9, 'timemodified' => 2]);
478
        [$hiddendiscussion, $post3] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now + 10, 'timemodified' => 3]);
479
 
480
        $this->assertEquals(2, $vault->get_total_discussion_count_from_forum_id($forum->id, false,
481
            null));
482
        $this->assertEquals(3, $vault->get_total_discussion_count_from_forum_id($forum->id, true,
483
            null));
484
        $this->assertEquals(3, $vault->get_total_discussion_count_from_forum_id($forum->id, false,
485
            $user->id));
486
    }
487
 
488
    /**
489
     * Test get_total_discussion_count_from_forum_id_and_group_id.
490
     */
11 efrain 491
    public function test_get_total_discussion_count_from_forum_id_and_group_id(): void {
1 efrain 492
        $this->resetAfterTest();
493
 
494
        $datagenerator = $this->getDataGenerator();
495
        $vault = $this->vault;
496
        $user = $datagenerator->create_user();
497
        self::setUser($user);
498
        $course = $datagenerator->create_course();
499
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
500
 
501
        $this->assertEquals([], $vault->get_from_forum_id($forum->id, true, null,
502
            null, 0, 0));
503
 
504
        $now = time();
505
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 10, 'timemodified' => 1]);
506
        [$discussion2, $post2] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now - 9, 'timemodified' => 2]);
507
        [$hiddendiscussion, $post3] = $this->helper_post_to_forum($forum, $user, ['timestart' => $now + 10, 'timemodified' => 3]);
508
        [$groupdiscussion1, $post4] = $this->helper_post_to_forum(
509
            $forum,
510
            $user,
511
            ['timestart' => $now - 8, 'timemodified' => 4, 'groupid' => 1]
512
        );
513
        [$groupdiscussion2, $post5] = $this->helper_post_to_forum(
514
            $forum,
515
            $user,
516
            ['timestart' => $now - 7, 'timemodified' => 5, 'groupid' => 2]
517
        );
518
        [$hiddengroupdiscussion, $post6] = $this->helper_post_to_forum(
519
            $forum,
520
            $user,
521
            ['timestart' => $now + 11, 'timemodified' => 6, 'groupid' => 3]
522
        );
523
 
524
        $this->assertEquals(6, $vault->get_total_discussion_count_from_forum_id_and_group_id($forum->id, [1, 2, 3],
525
            true, null));
526
        $this->assertEquals(6, $vault->get_total_discussion_count_from_forum_id_and_group_id(
527
            $forum->id,
528
            [1, 2, 3],
529
            false,
530
            $user->id
531
        ));
532
        $this->assertEquals(4, $vault->get_total_discussion_count_from_forum_id_and_group_id($forum->id, [1, 2, 3],
533
            false, null));
534
        $this->assertEquals(3, $vault->get_total_discussion_count_from_forum_id_and_group_id($forum->id, [],
535
            true, null));
536
    }
537
 
538
    /**
539
     * Pin a duscussion.
540
     *
541
     * @param \stdClass $discussion
542
     */
543
    private function pin_discussion(\stdClass $discussion) {
544
        global $DB;
545
 
546
        $DB->update_record('forum_discussions',
547
            (object) array('id' => $discussion->id, 'pinned' => FORUM_DISCUSSION_PINNED));
548
    }
549
 
550
    /**
551
     * Star a duscussion.
552
     *
553
     * @param \stdClass $discussion
554
     * @param bool     $targetstate The new starred state of the discussion (0 => unstar, 1 => star)
555
     */
556
    private function star_discussion(\stdClass $discussion, bool $targetstate) {
557
        mod_forum_external::toggle_favourite_state($discussion->id, $targetstate);
558
    }
559
}