16
16
17
17
namespace mod_assign ;
18
18
19
+ use context_course ;
20
+ use core \task \manager ;
19
21
use core_component ;
22
+ use core_grades \penalty_exemption ;
20
23
use core_grades \penalty_manager ;
21
24
use grade_item ;
22
25
use mod_assign_test_generator ;
@@ -40,6 +43,16 @@ final class penalty_test extends \advanced_testcase {
40
43
// Use the generator helper.
41
44
use mod_assign_test_generator;
42
45
46
+ /**
47
+ * Reset the test environment after each test.
48
+ *
49
+ * @return void
50
+ */
51
+ protected function setUp (): void {
52
+ parent ::setUp ();
53
+ $ this ->resetAfterTest ();
54
+ }
55
+
43
56
/**
44
57
* Set up test
45
58
*
@@ -76,7 +89,6 @@ protected function set_up_test(): array {
76
89
* @covers ::assign_supports
77
90
*/
78
91
public function test_penalty_support (): void {
79
- $ this ->resetAfterTest ();
80
92
$ this ->setAdminUser ();
81
93
82
94
// Assign should be in the supported list.
@@ -150,7 +162,6 @@ public function test_apply_penalty(
150
162
): void {
151
163
global $ DB ;
152
164
153
- $ this ->resetAfterTest ();
154
165
[$ course , $ student ] = $ this ->set_up_test ();
155
166
156
167
// Assignment.
@@ -224,8 +235,6 @@ public function test_apply_penalty(
224
235
public function test_recalculate_penalty (): void {
225
236
global $ DB ;
226
237
227
- $ this ->resetAfterTest ();
228
-
229
238
[$ course , $ student ] = $ this ->set_up_test ();
230
239
231
240
// Assignment.
@@ -276,4 +285,53 @@ public function test_recalculate_penalty(): void {
276
285
// Check the grade.
277
286
$ this ->assertEquals (50 , $ gradeitem ->get_final ($ student ->id )->finalgrade );
278
287
}
288
+
289
+ /**
290
+ * Test recalculating penalties for hidden groups and users.
291
+ *
292
+ * @covers \mod_assign\task\recalculate_penalties::queue
293
+ *
294
+ * @return void
295
+ */
296
+ public function test_recalculate_penalties (): void {
297
+ global $ DB ;
298
+
299
+ // Setup the course.
300
+ $ course = $ this ->getDataGenerator ()->create_course (['groupmode ' => SEPARATEGROUPS ]);
301
+ $ context = context_course::instance ($ course ->id );
302
+ $ this ->getDataGenerator ()->create_module ('assign ' , ['course ' => $ course ->id ]);
303
+ $ group = $ this ->getDataGenerator ()->create_group (['courseid ' => $ course ->id , 'visibility ' => GROUPS_VISIBILITY_NONE ]);
304
+
305
+ // Setup users.
306
+ $ teacher = $ this ->getDataGenerator ()->create_and_enrol ($ course , 'teacher ' );
307
+ $ student = $ this ->getDataGenerator ()->create_and_enrol ($ course , 'student ' );
308
+ groups_add_member ($ group , $ student );
309
+
310
+ // Enable grade penalties for the assign module.
311
+ penalty_manager::enable_module ('assign ' );
312
+
313
+ // Log in as the teacher.
314
+ $ this ->setUser ($ teacher );
315
+
316
+ // Check initial capabilities.
317
+ $ this ->assertNotEmpty (groups_get_members ($ group ->id ));
318
+
319
+ // Update capabilities to prevent viewing hidden groups.
320
+ $ roleid = $ DB ->get_field ('role ' , 'id ' , ['shortname ' => 'teacher ' ]);
321
+ assign_capability ('moodle/course:viewhiddengroups ' , CAP_PREVENT , $ roleid , $ context ->id );
322
+
323
+ // Check updated capabilities.
324
+ $ this ->assertEmpty (groups_get_members ($ group ->id ));
325
+
326
+ // Create an exemption, triggering penalty recalculation.
327
+ $ exemption = penalty_exemption::exempt_group ($ group ->id , $ context ->id );
328
+ $ this ->assertCount (1 , manager::get_adhoc_tasks (\mod_assign \task \recalculate_penalties::class));
329
+
330
+ // Log in as admin to always view hidden groups.
331
+ $ this ->setAdminUser ();
332
+
333
+ // Delete the exemption, triggering penalty recalculation.
334
+ $ exemption ->delete ();
335
+ $ this ->assertCount (2 , manager::get_adhoc_tasks (\mod_assign \task \recalculate_penalties::class));
336
+ }
279
337
}
0 commit comments