MDL-84998 mod_assign: fix division by zero error

This commit is contained in:
Nathan Nguyen
2025-03-26 16:49:36 +11:00
parent aac280e0ea
commit d17f110f5c
2 changed files with 22 additions and 12 deletions
+6 -1
View File
@@ -137,7 +137,12 @@ class helper {
// Apply penalty.
$container = penalty_manager::apply_grade_penalty_to_user($userid, $gradeitem, $submissiondate, $duedate);
$deductedpercentage = $container->get_penalty() / $container->get_grade_before_penalties() * 100;
if ($container->get_grade_before_penalties() == 0) {
// There is no deduction applied to grade 0.
$deductedpercentage = 0;
} else {
$deductedpercentage = $container->get_penalty() / $container->get_grade_before_penalties() * 100;
}
// Store the assign grade penalty.
$DB->set_field_select(
+16 -11
View File
@@ -101,20 +101,23 @@ final class penalty_test extends \advanced_testcase {
return [
// Submission date, Due date, User override, Group override, Extension due date, Expected messages, Expected grade.
// No overrides.
[DAYSECS, DAYSECS, null, null, null, ['Submission date: 86400', 'Due date: 86400'], 50],
[DAYSECS + 1, DAYSECS, null, null, null, ['Submission date: 86401', 'Due date: 86400'], 30],
[50, DAYSECS, DAYSECS, null, null, null, ['Submission date: 86400', 'Due date: 86400'], 50],
[50, DAYSECS + 1, DAYSECS, null, null, null, ['Submission date: 86401', 'Due date: 86400'], 30],
// User override.
[DAYSECS + 1, DAYSECS, DAYSECS + 1, null, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[DAYSECS + 2, DAYSECS, DAYSECS + 1, null, null, ['Submission date: 86402', 'Due date: 86401'], 30],
[50, DAYSECS + 1, DAYSECS, DAYSECS + 1, null, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[50, DAYSECS + 2, DAYSECS, DAYSECS + 1, null, null, ['Submission date: 86402', 'Due date: 86401'], 30],
// Group override.
[DAYSECS + 1, DAYSECS, null, DAYSECS + 1, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[DAYSECS + 2, DAYSECS, null, DAYSECS + 1, null, ['Submission date: 86402', 'Due date: 86401'], 30],
[50, DAYSECS + 1, DAYSECS, null, DAYSECS + 1, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[50, DAYSECS + 2, DAYSECS, null, DAYSECS + 1, null, ['Submission date: 86402', 'Due date: 86401'], 30],
// User and group override.
[DAYSECS + 1, DAYSECS, DAYSECS + 1, DAYSECS + 2, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[DAYSECS + 2, DAYSECS, DAYSECS + 1, DAYSECS + 2, null, ['Submission date: 86402', 'Due date: 86401'], 30],
[50, DAYSECS + 1, DAYSECS, DAYSECS + 1, DAYSECS + 2, null, ['Submission date: 86401', 'Due date: 86401'], 50],
[50, DAYSECS + 2, DAYSECS, DAYSECS + 1, DAYSECS + 2, null, ['Submission date: 86402', 'Due date: 86401'], 30],
// User, group override and extension.
[DAYSECS + 3, DAYSECS, DAYSECS + 1, DAYSECS + 2, DAYSECS + 3, ['Submission date: 86403', 'Due date: 86403'], 50],
[DAYSECS + 4, DAYSECS, DAYSECS + 1, DAYSECS + 2, DAYSECS + 3, ['Submission date: 86404', 'Due date: 86403'], 30],
[50, DAYSECS + 3, DAYSECS, DAYSECS + 1, DAYSECS + 2, DAYSECS + 3, ['Submission date: 86403', 'Due date: 86403'], 50],
[50, DAYSECS + 4, DAYSECS, DAYSECS + 1, DAYSECS + 2, DAYSECS + 3, ['Submission date: 86404', 'Due date: 86403'], 30],
// Zero grade.
[0, DAYSECS, DAYSECS, null, null, null, [], 0],
[0, DAYSECS + 1, DAYSECS, null, null, null, [], 0],
];
}
@@ -125,6 +128,7 @@ final class penalty_test extends \advanced_testcase {
*
* @covers \mod_assign\penalty\helper::apply_penalty_to_submission
*
* @param float $usergrade the grade given to user.
* @param int $submissiondate The submission date.
* @param int $duedate The due date.
* @param int $useroverrideduedate The user override due date.
@@ -135,6 +139,7 @@ final class penalty_test extends \advanced_testcase {
*
*/
public function test_apply_penalty(
$usergrade,
$submissiondate,
$duedate,
$useroverrideduedate,
@@ -194,7 +199,7 @@ final class penalty_test extends \advanced_testcase {
$this->submit_for_grading($student, $assign);
// Submission date.
$DB->set_field('assign_submission', 'timemodified', $submissiondate, ['userid' => $student->id]);
$assign->testable_apply_grade_to_user((object)['grade' => 50.0], $student->id, 0);
$assign->testable_apply_grade_to_user((object)['grade' => $usergrade], $student->id, 0);
// Expect debug messages.
$this->assertdebuggingcalledcount(count($expectedmessages), $expectedmessages);