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,51 @@ 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
+ * @return void
293
+ */
294
+ public function test_recalculate_penalties (): void {
295
+ global $ DB ;
296
+
297
+ // Setup the course.
298
+ $ course = $ this ->getDataGenerator ()->create_course (['groupmode ' => SEPARATEGROUPS ]);
299
+ $ context = context_course::instance ($ course ->id );
300
+ $ this ->getDataGenerator ()->create_module ('assign ' , ['course ' => $ course ->id ]);
301
+ $ group = $ this ->getDataGenerator ()->create_group (['courseid ' => $ course ->id , 'visibility ' => GROUPS_VISIBILITY_NONE ]);
302
+
303
+ // Setup users.
304
+ $ teacher = $ this ->getDataGenerator ()->create_and_enrol ($ course , 'teacher ' );
305
+ $ student = $ this ->getDataGenerator ()->create_and_enrol ($ course , 'student ' );
306
+ groups_add_member ($ group , $ student );
307
+
308
+ // Enable grade penalties for the assign module.
309
+ penalty_manager::enable_module ('assign ' );
310
+
311
+ // Log in as the teacher.
312
+ $ this ->setUser ($ teacher );
313
+
314
+ // Check initial capabilities.
315
+ $ this ->assertNotEmpty (groups_get_members ($ group ->id ));
316
+
317
+ // Update capabilities to prevent viewing hidden groups.
318
+ $ roleid = $ DB ->get_field ('role ' , 'id ' , ['shortname ' => 'teacher ' ]);
319
+ assign_capability ('moodle/course:viewhiddengroups ' , CAP_PREVENT , $ roleid , $ context ->id );
320
+
321
+ // Check updated capabilities.
322
+ $ this ->assertEmpty (groups_get_members ($ group ->id ));
323
+
324
+ // Create an exemption, triggering penalty recalculation.
325
+ $ exemption = penalty_exemption::exempt_group ($ group ->id , $ context ->id );
326
+ $ this ->assertCount (1 , manager::get_adhoc_tasks (\mod_assign \task \recalculate_penalties::class));
327
+
328
+ // Log in as admin to always view hidden groups.
329
+ $ this ->setAdminUser ();
330
+
331
+ // Delete the exemption, triggering penalty recalculation.
332
+ $ exemption ->delete ();
333
+ $ this ->assertCount (2 , manager::get_adhoc_tasks (\mod_assign \task \recalculate_penalties::class));
334
+ }
279
335
}
0 commit comments