2013-01-26 09:39:48 +08:00
|
|
|
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
|
|
//
|
|
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
namespace core_grades;
|
|
|
|
|
|
|
|
use grade_plugin_return;
|
|
|
|
use grade_report_grader;
|
2013-01-26 09:39:48 +08:00
|
|
|
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
|
|
|
|
global $CFG;
|
|
|
|
require_once($CFG->dirroot.'/grade/lib.php');
|
|
|
|
require_once($CFG->dirroot.'/grade/report/grader/lib.php');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tests grade_report_grader (the grader report)
|
2022-04-02 21:34:46 +02:00
|
|
|
*
|
|
|
|
* @package core_grades
|
|
|
|
* @category test
|
|
|
|
* @copyright 2012 Andrew Davis
|
|
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
|
2013-01-26 09:39:48 +08:00
|
|
|
*/
|
2022-04-02 21:34:46 +02:00
|
|
|
class report_graderlib_test extends \advanced_testcase {
|
2013-01-26 09:39:48 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Tests grade_report_grader::process_data()
|
|
|
|
*
|
|
|
|
* process_data() processes submitted grade and feedback data
|
|
|
|
*/
|
|
|
|
public function test_process_data() {
|
|
|
|
global $DB, $CFG;
|
|
|
|
|
|
|
|
$this->resetAfterTest(true);
|
|
|
|
|
|
|
|
$course = $this->getDataGenerator()->create_course();
|
|
|
|
|
|
|
|
// Create and enrol a student.
|
2020-04-06 12:36:35 +02:00
|
|
|
$student = $this->getDataGenerator()->create_user(array('username' => 'student_sam'));
|
2013-01-26 09:39:48 +08:00
|
|
|
$role = $DB->get_record('role', array('shortname' => 'student'), '*', MUST_EXIST);
|
|
|
|
$this->getDataGenerator()->enrol_user($student->id, $course->id, $role->id);
|
|
|
|
|
|
|
|
// Test with limited grades.
|
|
|
|
$CFG->unlimitedgrades = 0;
|
|
|
|
|
|
|
|
$forummax = 80;
|
|
|
|
$forum1 = $this->getDataGenerator()->create_module('forum', array('assessed' => 1, 'scale' => $forummax, 'course' => $course->id));
|
|
|
|
// Switch the stdClass instance for a grade item instance.
|
2022-04-02 21:34:46 +02:00
|
|
|
$forum1 = \grade_item::fetch(array('itemtype' => 'mod', 'itemmodule' => 'forum', 'iteminstance' => $forum1->id, 'courseid' => $course->id));
|
2013-01-26 09:39:48 +08:00
|
|
|
|
2014-08-01 16:05:31 +08:00
|
|
|
$report = $this->create_report($course);
|
2013-01-26 09:39:48 +08:00
|
|
|
$testgrade = 60.00;
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$data = new \stdClass();
|
2013-01-26 09:39:48 +08:00
|
|
|
$data->id = $course->id;
|
|
|
|
$data->report = 'grader';
|
2014-10-15 12:22:10 +08:00
|
|
|
$data->timepageload = time();
|
2013-01-26 09:39:48 +08:00
|
|
|
|
|
|
|
$data->grade = array();
|
|
|
|
$data->grade[$student->id] = array();
|
|
|
|
$data->grade[$student->id][$forum1->id] = $testgrade;
|
|
|
|
|
|
|
|
$warnings = $report->process_data($data);
|
|
|
|
$this->assertEquals(count($warnings), 0);
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$studentgrade = \grade_grade::fetch(array('itemid' => $forum1->id, '' => $student->id));
|
2013-01-26 09:39:48 +08:00
|
|
|
$this->assertEquals($studentgrade->finalgrade, $testgrade);
|
|
|
|
|
|
|
|
// Grade above max. Should be pulled down to max.
|
|
|
|
$toobig = 200.00;
|
|
|
|
$data->grade[$student->id][$forum1->id] = $toobig;
|
2014-10-22 12:56:07 +08:00
|
|
|
$data->timepageload = time();
|
2013-01-26 09:39:48 +08:00
|
|
|
$warnings = $report->process_data($data);
|
|
|
|
$this->assertEquals(count($warnings), 1);
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$studentgrade = \grade_grade::fetch(array('itemid' => $forum1->id, '' => $student->id));
|
2013-01-26 09:39:48 +08:00
|
|
|
$this->assertEquals($studentgrade->finalgrade, $forummax);
|
|
|
|
|
|
|
|
// Grade below min. Should be pulled up to min.
|
|
|
|
$toosmall = -10.00;
|
|
|
|
$data->grade[$student->id][$forum1->id] = $toosmall;
|
2014-10-22 12:56:07 +08:00
|
|
|
$data->timepageload = time();
|
2013-01-26 09:39:48 +08:00
|
|
|
$warnings = $report->process_data($data);
|
|
|
|
$this->assertEquals(count($warnings), 1);
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$studentgrade = \grade_grade::fetch(array('itemid' => $forum1->id, '' => $student->id));
|
2013-01-26 09:39:48 +08:00
|
|
|
$this->assertEquals($studentgrade->finalgrade, 0);
|
|
|
|
|
|
|
|
// Test unlimited grades so we can give a student a grade about max.
|
|
|
|
$CFG->unlimitedgrades = 1;
|
|
|
|
|
|
|
|
$data->grade[$student->id][$forum1->id] = $toobig;
|
2014-10-22 12:56:07 +08:00
|
|
|
$data->timepageload = time();
|
2013-01-26 09:39:48 +08:00
|
|
|
$warnings = $report->process_data($data);
|
|
|
|
$this->assertEquals(count($warnings), 0);
|
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$studentgrade = \grade_grade::fetch(array('itemid' => $forum1->id, '' => $student->id));
|
2013-01-26 09:39:48 +08:00
|
|
|
$this->assertEquals($studentgrade->finalgrade, $toobig);
|
|
|
|
}
|
|
|
|
|
2014-08-01 16:05:31 +08:00
|
|
|
public function test_collapsed_preferences() {
|
|
|
|
$this->resetAfterTest(true);
|
|
|
|
|
|
|
|
$emptypreferences = array('aggregatesonly' => array(), 'gradesonly' => array());
|
|
|
|
|
|
|
|
$user1 = $this->getDataGenerator()->create_user();
|
|
|
|
$course1 = $this->getDataGenerator()->create_course();
|
|
|
|
$course2 = $this->getDataGenerator()->create_course();
|
|
|
|
$course3 = $this->getDataGenerator()->create_course();
|
|
|
|
|
|
|
|
$this->setUser($user1);
|
|
|
|
|
|
|
|
$report = $this->create_report($course1);
|
|
|
|
$this->assertEquals($emptypreferences, $report->collapsed);
|
|
|
|
|
|
|
|
// Validating preferences set/get for one course.
|
2014-10-03 10:35:32 +08:00
|
|
|
$report->process_action('cg13', 'switch_minus');
|
2014-08-01 16:05:31 +08:00
|
|
|
$report = $this->create_report($course1);
|
|
|
|
$this->assertEquals(array(13), $report->collapsed['aggregatesonly']);
|
|
|
|
$this->assertEmpty($report->collapsed['gradesonly']);
|
|
|
|
|
2014-10-03 10:35:32 +08:00
|
|
|
$report->process_action('cg13', 'switch_plus');
|
2014-08-01 16:05:31 +08:00
|
|
|
$report = $this->create_report($course1);
|
|
|
|
$this->assertEmpty($report->collapsed['aggregatesonly']);
|
|
|
|
$this->assertEquals(array(13), $report->collapsed['gradesonly']);
|
|
|
|
|
2014-10-03 10:35:32 +08:00
|
|
|
$report->process_action('cg13', 'switch_whole');
|
2014-08-01 16:05:31 +08:00
|
|
|
$report = $this->create_report($course1);
|
|
|
|
$this->assertEquals($emptypreferences, $report->collapsed);
|
|
|
|
|
|
|
|
// Validating preferences set/get for several courses.
|
|
|
|
|
|
|
|
$course1cats = $course2cats = $course3cats = array();
|
|
|
|
for ($i=0;$i<10;$i++) {
|
|
|
|
$course1cats[] = $this->create_grade_category($course1)->id;
|
|
|
|
$course2cats[] = $this->create_grade_category($course2)->id;
|
|
|
|
$course3cats[] = $this->create_grade_category($course3)->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
foreach ($course1cats as $catid) {
|
2014-10-03 10:35:32 +08:00
|
|
|
$report1->process_action('cg'.$catid, 'switch_minus');
|
2014-08-01 16:05:31 +08:00
|
|
|
}
|
|
|
|
$report2 = $this->create_report($course2);
|
|
|
|
foreach ($course2cats as $catid) {
|
2014-10-03 10:35:32 +08:00
|
|
|
$report2->process_action('cg'.$catid, 'switch_minus');
|
|
|
|
$report2->process_action('cg'.$catid, 'switch_plus');
|
2014-08-01 16:05:31 +08:00
|
|
|
}
|
|
|
|
$report3 = $this->create_report($course3);
|
|
|
|
foreach ($course3cats as $catid) {
|
2014-10-03 10:35:32 +08:00
|
|
|
$report3->process_action('cg'.$catid, 'switch_minus');
|
2014-08-01 16:05:31 +08:00
|
|
|
if (($i++)%2) {
|
2014-10-03 10:35:32 +08:00
|
|
|
$report3->process_action('cg'.$catid, 'switch_plus');
|
2014-08-01 16:05:31 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals(10, count($report1->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(0, count($report1->collapsed['gradesonly']));
|
|
|
|
$report2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals(0, count($report2->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(10, count($report2->collapsed['gradesonly']));
|
|
|
|
$report3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals(5, count($report3->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(5, count($report3->collapsed['gradesonly']));
|
|
|
|
|
|
|
|
// Test upgrade script.
|
|
|
|
// Combine data generated for user1 and set it in the old format for user2, Try to retrieve it and make sure it is converted.
|
|
|
|
|
|
|
|
$user2 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = array(
|
|
|
|
'aggregatesonly' => array_merge($report1->collapsed['aggregatesonly'], $report2->collapsed['aggregatesonly'], $report3->collapsed['aggregatesonly']),
|
|
|
|
'gradesonly' => array_merge($report1->collapsed['gradesonly'], $report2->collapsed['gradesonly'], $report3->collapsed['gradesonly']),
|
|
|
|
);
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user2);
|
|
|
|
|
|
|
|
$this->setUser($user2);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals($report1->collapsed, $convertedreport1->collapsed);
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals($report2->collapsed, $convertedreport2->collapsed);
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals($report3->collapsed, $convertedreport3->collapsed);
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
|
|
|
|
// Test overflowing the setting with non-existing categories (only validated if new setting size exceeds 1333 chars).
|
|
|
|
|
|
|
|
$toobigvalue = $expectedvalue = $report1->collapsed;
|
|
|
|
for ($i = 0; strlen(json_encode($toobigvalue)) < 1333; $i++) {
|
|
|
|
$toobigvalue[($i < 7) ? 'gradesonly' : 'aggregatesonly'][] = $course1cats[9] + 1 + $i;
|
|
|
|
}
|
|
|
|
$lastvalue = array_pop($toobigvalue['gradesonly']);
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories'.$course1->id, json_encode($toobigvalue));
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
2014-10-03 10:35:32 +08:00
|
|
|
$report1->process_action('cg'.$lastvalue, 'switch_minus');
|
2014-08-01 16:05:31 +08:00
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals($expectedvalue, $report1->collapsed);
|
|
|
|
|
|
|
|
// Test overflowing the setting with existing categories.
|
|
|
|
|
|
|
|
$toobigvalue = $report1->collapsed;
|
|
|
|
for ($i = 0; strlen(json_encode($toobigvalue)) < 1333; $i++) {
|
|
|
|
$catid = $this->create_grade_category($course1)->id;
|
|
|
|
$toobigvalue[($i < 7) ? 'gradesonly' : 'aggregatesonly'][] = $catid;
|
|
|
|
}
|
|
|
|
$lastcatid = array_pop($toobigvalue['gradesonly']);
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories'.$course1->id, json_encode($toobigvalue));
|
|
|
|
$toobigvalue['aggregatesonly'][] = $lastcatid;
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
2014-10-03 10:35:32 +08:00
|
|
|
$report1->process_action('cg'.$lastcatid, 'switch_minus');
|
2014-08-01 16:05:31 +08:00
|
|
|
|
|
|
|
// One last value should be removed from both arrays.
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals(count($toobigvalue['aggregatesonly']) - 1, count($report1->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(count($toobigvalue['gradesonly']) - 1, count($report1->collapsed['gradesonly']));
|
|
|
|
}
|
|
|
|
|
MDL-74231 grader report: Fix case where old settings are empty / null
There is an edge case in the conversion from old collapse/expand
settings (stored as user preference) to the new ones that can lead
to notices / warnings / errors.
Before PHP 8, they weren't being detected, but now they are.
Basically, if some of the expected components of the preferences
are missing, then some array (array_diff(), array_intersect()..)
operations now are failing, because now those parameter functions
do require to be arrays (so empty strings or nulls aren't allowed).
Also, there were some cases where the old preference was not being
removed ever, so its removal has been moved to a common place at
the end of the function, where it's always evaluated in case
the preference still exists but is empty of contents.
I've tried to cover all the cases I've been able to imagine with
unit tests (empty information, some component not set, all components
not set...), have moved it to a new unit test because the one
already performing some tests with those old preferences was
already too long to add more cases.
2022-03-22 14:22:30 +01:00
|
|
|
/**
|
|
|
|
* Test some special cases of the conversion from old preferences to new ones
|
|
|
|
*
|
|
|
|
* @covers \grade_report_grader::get_collapsed_preferences
|
|
|
|
* @covers \grade_report_grader::filter_collapsed_categories
|
|
|
|
*/
|
|
|
|
public function test_old_collapsed_preferences() {
|
|
|
|
$this->resetAfterTest(true);
|
|
|
|
|
|
|
|
$user1 = $this->getDataGenerator()->create_user();
|
|
|
|
$course1 = $this->getDataGenerator()->create_course();
|
|
|
|
$course2 = $this->getDataGenerator()->create_course();
|
|
|
|
$course3 = $this->getDataGenerator()->create_course();
|
|
|
|
|
|
|
|
$course1cats = $course2cats = $course3cats = [];
|
|
|
|
for ($i = 0; $i < 10; $i++) {
|
|
|
|
$course1cats[] = $this->create_grade_category($course1)->id;
|
|
|
|
$course2cats[] = $this->create_grade_category($course2)->id;
|
|
|
|
$course3cats[] = $this->create_grade_category($course3)->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
// Collapse all the cats in course1.
|
|
|
|
foreach ($course1cats as $catid) {
|
|
|
|
$report1->process_action('cg'. $catid, 'switch_minus');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expand all the cats in course2.
|
|
|
|
$report2 = $this->create_report($course2);
|
|
|
|
foreach ($course2cats as $catid) {
|
|
|
|
$report2->process_action('cg'.$catid, 'switch_minus');
|
|
|
|
$report2->process_action('cg'.$catid, 'switch_plus');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Collapse odd cats and expand even cats in course3.
|
|
|
|
$report3 = $this->create_report($course3);
|
|
|
|
foreach ($course3cats as $catid) {
|
|
|
|
$report3->process_action('cg'.$catid, 'switch_minus');
|
|
|
|
if (($i++) % 2) {
|
|
|
|
$report3->process_action('cg'.$catid, 'switch_plus');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$report1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals(10, count($report1->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(0, count($report1->collapsed['gradesonly']));
|
|
|
|
$report2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals(0, count($report2->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(10, count($report2->collapsed['gradesonly']));
|
|
|
|
$report3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals(5, count($report3->collapsed['aggregatesonly']));
|
|
|
|
$this->assertEquals(5, count($report3->collapsed['gradesonly']));
|
|
|
|
|
|
|
|
// Use the preferences generated for user1 and set it in the old format for other users.
|
|
|
|
|
|
|
|
// User2: both gradesonly and aggregatesonly.
|
|
|
|
$user2 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = [
|
|
|
|
'gradesonly' => array_merge(
|
|
|
|
$report1->collapsed['gradesonly'],
|
|
|
|
$report2->collapsed['gradesonly'],
|
|
|
|
$report3->collapsed['gradesonly']),
|
|
|
|
'aggregatesonly' => array_merge(
|
|
|
|
$report1->collapsed['aggregatesonly'],
|
|
|
|
$report2->collapsed['aggregatesonly'],
|
|
|
|
$report3->collapsed['aggregatesonly']),
|
|
|
|
];
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user2);
|
|
|
|
|
|
|
|
$this->setUser($user2);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals($report1->collapsed['gradesonly'], $convertedreport1->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report1->collapsed['aggregatesonly'], $convertedreport1->collapsed['aggregatesonly']);
|
|
|
|
$newprefs1 = get_user_preferences('grade_report_grader_collapsed_categories' . $course1->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals($report1->collapsed['gradesonly'], json_decode($newprefs1, true)['gradesonly']);
|
|
|
|
$this->assertEquals($report1->collapsed['aggregatesonly'], json_decode($newprefs1, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals($report2->collapsed['gradesonly'], $convertedreport2->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report2->collapsed['aggregatesonly'], $convertedreport2->collapsed['aggregatesonly']);
|
|
|
|
$newprefs2 = get_user_preferences('grade_report_grader_collapsed_categories' . $course2->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals($report2->collapsed['gradesonly'], json_decode($newprefs2, true)['gradesonly']);
|
|
|
|
$this->assertEquals($report2->collapsed['aggregatesonly'], json_decode($newprefs2, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals($report3->collapsed['gradesonly'], $convertedreport3->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report3->collapsed['aggregatesonly'], $convertedreport3->collapsed['aggregatesonly']);
|
|
|
|
$newprefs3 = get_user_preferences('grade_report_grader_collapsed_categories' . $course3->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals($report3->collapsed['gradesonly'], json_decode($newprefs3, true)['gradesonly']);
|
|
|
|
$this->assertEquals($report3->collapsed['aggregatesonly'], json_decode($newprefs3, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
|
|
|
|
// User3: only gradesonly (missing aggregatesonly).
|
|
|
|
$user3 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = [
|
|
|
|
'gradesonly' => array_merge(
|
|
|
|
$report1->collapsed['gradesonly'],
|
|
|
|
$report2->collapsed['gradesonly'],
|
|
|
|
$report3->collapsed['gradesonly']),
|
|
|
|
];
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user3);
|
|
|
|
|
|
|
|
$this->setUser($user3);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals($report1->collapsed['gradesonly'], $convertedreport1->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['aggregatesonly']);
|
|
|
|
$newprefs1 = get_user_preferences('grade_report_grader_collapsed_categories' . $course1->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs1);
|
|
|
|
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals($report2->collapsed['gradesonly'], $convertedreport2->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['aggregatesonly']);
|
|
|
|
$newprefs2 = get_user_preferences('grade_report_grader_collapsed_categories' . $course2->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals($report2->collapsed['gradesonly'], json_decode($newprefs2, true)['gradesonly']);
|
|
|
|
$this->assertEquals([], json_decode($newprefs2, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals($report3->collapsed['gradesonly'], $convertedreport3->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['aggregatesonly']);
|
|
|
|
$newprefs3 = get_user_preferences('grade_report_grader_collapsed_categories' . $course3->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals($report3->collapsed['gradesonly'], json_decode($newprefs3, true)['gradesonly']);
|
|
|
|
$this->assertEquals([], json_decode($newprefs3, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
|
|
|
|
// User4: only aggregatesonly (missing gradesonly).
|
|
|
|
$user4 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = [
|
|
|
|
'aggregatesonly' => array_merge(
|
|
|
|
$report1->collapsed['aggregatesonly'],
|
|
|
|
$report2->collapsed['aggregatesonly'],
|
|
|
|
$report3->collapsed['aggregatesonly']),
|
|
|
|
];
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user4);
|
|
|
|
|
|
|
|
$this->setUser($user4);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report1->collapsed['aggregatesonly'], $convertedreport1->collapsed['aggregatesonly']);
|
|
|
|
$newprefs1 = get_user_preferences('grade_report_grader_collapsed_categories' . $course1->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals([], json_decode($newprefs1, true)['gradesonly']);
|
|
|
|
$this->assertEquals($report1->collapsed['aggregatesonly'], json_decode($newprefs1, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report2->collapsed['aggregatesonly'], $convertedreport2->collapsed['aggregatesonly']);
|
|
|
|
$newprefs2 = get_user_preferences('grade_report_grader_collapsed_categories' . $course2->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs2);
|
|
|
|
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals($report3->collapsed['aggregatesonly'], $convertedreport3->collapsed['aggregatesonly']);
|
|
|
|
$newprefs3 = get_user_preferences('grade_report_grader_collapsed_categories' . $course3->id); // Also verify new prefs.
|
|
|
|
$this->assertEquals([], json_decode($newprefs3, true)['gradesonly']);
|
|
|
|
$this->assertEquals($report3->collapsed['aggregatesonly'], json_decode($newprefs3, true)['aggregatesonly']);
|
|
|
|
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
|
|
|
|
// User5: both missing gradesonly and aggregatesonly.
|
|
|
|
$user5 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = [];
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user5);
|
|
|
|
|
|
|
|
$this->setUser($user5);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['aggregatesonly']);
|
|
|
|
$newprefs1 = get_user_preferences('grade_report_grader_collapsed_categories' . $course1->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs1);
|
|
|
|
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['aggregatesonly']);
|
|
|
|
$newprefs2 = get_user_preferences('grade_report_grader_collapsed_categories' . $course2->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs2);
|
|
|
|
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['aggregatesonly']);
|
|
|
|
$newprefs3 = get_user_preferences('grade_report_grader_collapsed_categories' . $course3->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs3);
|
|
|
|
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
|
|
|
|
// User6: both empty gradesonly and aggregatesonly.
|
|
|
|
$user6 = $this->getDataGenerator()->create_user();
|
|
|
|
$alldata = [
|
|
|
|
'gradesonly' => [],
|
|
|
|
'aggregatesonly' => []
|
|
|
|
];
|
|
|
|
set_user_preference('grade_report_grader_collapsed_categories', serialize($alldata), $user6);
|
|
|
|
|
|
|
|
$this->setUser($user6);
|
|
|
|
$convertedreport1 = $this->create_report($course1);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport1->collapsed['aggregatesonly']);
|
|
|
|
$newprefs1 = get_user_preferences('grade_report_grader_collapsed_categories' . $course1->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs1);
|
|
|
|
|
|
|
|
$convertedreport2 = $this->create_report($course2);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport2->collapsed['aggregatesonly']);
|
|
|
|
$newprefs2 = get_user_preferences('grade_report_grader_collapsed_categories' . $course2->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs2);
|
|
|
|
|
|
|
|
$convertedreport3 = $this->create_report($course3);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['gradesonly']);
|
|
|
|
$this->assertEquals([], $convertedreport3->collapsed['aggregatesonly']);
|
|
|
|
$newprefs3 = get_user_preferences('grade_report_grader_collapsed_categories' . $course3->id); // Also verify new prefs.
|
|
|
|
$this->assertNull($newprefs3);
|
|
|
|
|
|
|
|
// Make sure the old style user preference is removed now.
|
|
|
|
$this->assertEmpty(get_user_preferences('grade_report_grader_collapsed_categories'));
|
|
|
|
}
|
|
|
|
|
2017-01-09 14:24:11 +00:00
|
|
|
/**
|
|
|
|
* Tests the get_right_rows function with one 'normal' and one 'ungraded' quiz.
|
|
|
|
*
|
|
|
|
* Previously, with an ungraded quiz (which results in a grade item with type GRADETYPE_NONE)
|
|
|
|
* there was a bug in get_right_rows in some situations.
|
|
|
|
*/
|
|
|
|
public function test_get_right_rows() {
|
|
|
|
global $USER, $DB;
|
|
|
|
$this->resetAfterTest(true);
|
|
|
|
|
|
|
|
// Create manager and student on a course.
|
|
|
|
$generator = $this->getDataGenerator();
|
|
|
|
$manager = $generator->create_user();
|
|
|
|
$student = $generator->create_user();
|
|
|
|
$course = $generator->create_course();
|
|
|
|
$generator->enrol_user($manager->id, $course->id, 'manager');
|
|
|
|
$generator->enrol_user($student->id, $course->id, 'student');
|
|
|
|
|
|
|
|
// Create a couple of quizzes on the course.
|
|
|
|
$normalquiz = $generator->create_module('quiz', array('course' => $course->id,
|
|
|
|
'name' => 'NormalQuiz'));
|
|
|
|
$ungradedquiz = $generator->create_module('quiz', array('course' => $course->id,
|
|
|
|
'name' => 'UngradedQuiz'));
|
|
|
|
|
|
|
|
// Set the grade for the second one to 0 (note, you have to do this after creating it,
|
|
|
|
// otherwise it doesn't create an ungraded grade item).
|
|
|
|
$ungradedquiz->instance = $ungradedquiz->id;
|
|
|
|
quiz_set_grade(0, $ungradedquiz);
|
|
|
|
|
|
|
|
// Set current user.
|
|
|
|
$this->setUser($manager);
|
2021-07-06 10:27:24 +02:00
|
|
|
$USER->editing = false;
|
2017-01-09 14:24:11 +00:00
|
|
|
|
|
|
|
// Get the report.
|
|
|
|
$report = $this->create_report($course);
|
|
|
|
$report->load_users();
|
|
|
|
$report->load_final_grades();
|
|
|
|
$result = $report->get_right_rows(false);
|
|
|
|
|
|
|
|
// There should be 3 rows (2 header rows, plus the grades for the first user).
|
|
|
|
$this->assertCount(3, $result);
|
|
|
|
|
|
|
|
// The second row should contain 2 cells - one for the graded quiz and course total.
|
|
|
|
$this->assertCount(2, $result[1]->cells);
|
2020-09-01 00:44:13 +02:00
|
|
|
$this->assertStringContainsString('NormalQuiz', $result[1]->cells[0]->text);
|
|
|
|
$this->assertStringContainsString('Course total', $result[1]->cells[1]->text);
|
2017-01-09 14:24:11 +00:00
|
|
|
|
|
|
|
// User row should contain grade values '-'.
|
|
|
|
$this->assertCount(2, $result[2]->cells);
|
2020-09-01 00:44:13 +02:00
|
|
|
$this->assertStringContainsString('>-<', $result[2]->cells[0]->text);
|
|
|
|
$this->assertStringContainsString('>-<', $result[2]->cells[1]->text);
|
2017-01-09 14:24:11 +00:00
|
|
|
|
|
|
|
// Supposing the user cannot view hidden grades, this shouldn't make any difference (due
|
|
|
|
// to a bug, it previously did).
|
2022-04-02 21:34:46 +02:00
|
|
|
$context = \context_course::instance($course->id);
|
2017-01-09 14:24:11 +00:00
|
|
|
$managerroleid = $DB->get_field('role', 'id', array('shortname' => 'manager'));
|
|
|
|
assign_capability('moodle/grade:viewhidden', CAP_PROHIBIT, $managerroleid, $context->id, true);
|
|
|
|
$this->assertFalse(has_capability('moodle/grade:viewhidden', $context));
|
|
|
|
|
|
|
|
// Recreate the report. Confirm it returns successfully still.
|
|
|
|
$report = $this->create_report($course);
|
|
|
|
$report->load_users();
|
|
|
|
$report->load_final_grades();
|
|
|
|
$result = $report->get_right_rows(false);
|
|
|
|
$this->assertCount(3, $result);
|
|
|
|
}
|
|
|
|
|
2014-08-01 16:05:31 +08:00
|
|
|
private function create_grade_category($course) {
|
|
|
|
static $cnt = 0;
|
|
|
|
$cnt++;
|
2022-04-02 21:34:46 +02:00
|
|
|
$gradecat = new \grade_category(array('courseid' => $course->id, 'fullname' => 'Cat '.$cnt), false);
|
|
|
|
$gradecat->apply_default_settings();
|
|
|
|
$gradecat->apply_forced_settings();
|
|
|
|
$gradecat->insert();
|
|
|
|
return $gradecat;
|
2014-08-01 16:05:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
private function create_report($course) {
|
2013-01-26 09:39:48 +08:00
|
|
|
|
2022-04-02 21:34:46 +02:00
|
|
|
$coursecontext = \context_course::instance($course->id);
|
2013-01-26 09:39:48 +08:00
|
|
|
$gpr = new grade_plugin_return(array('type' => 'report', 'plugin'=>'grader', 'courseid' => $course->id));
|
|
|
|
$report = new grade_report_grader($course->id, $gpr, $coursecontext);
|
|
|
|
|
|
|
|
return $report;
|
|
|
|
}
|
|
|
|
}
|