$course = $forum->get_course_record();
$teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
- $this->setUser($teacher);
+
+ $this->execute_and_assert_fetch($forum, $options, $scale, $teacher, $teacher, $student);
+ }
+
+ /**
+ * Class mates should not get other's grades.
+ */
+ public function test_execute_fetch_does_not_return_data_to_other_students(): void {
+ $this->resetAfterTest();
+
+ $options = [
+ 'A',
+ 'B',
+ 'C'
+ ];
+ $scale = $this->getDataGenerator()->create_scale(['scale' => implode(',', $options)]);
+
+ $forum = $this->get_forum_instance([
+ // Negative numbers mean a scale.
+ 'grade_forum' => -1 * $scale->id
+ ]);
+ $course = $forum->get_course_record();
+ $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
+ $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
+ $evilstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
+
+ $this->expectException(\required_capability_exception::class);
+ $this->execute_and_assert_fetch($forum, $options, $scale, $evilstudent, $teacher, $student);
+ }
+
+ /**
+ * Grades can be returned to graded user.
+ */
+ public function test_execute_fetch_return_data_to_graded_user(): void {
+ $this->resetAfterTest();
+
+ $options = [
+ 'A',
+ 'B',
+ 'C'
+ ];
+ $scale = $this->getDataGenerator()->create_scale(['scale' => implode(',', $options)]);
+
+ $forum = $this->get_forum_instance([
+ // Negative numbers mean a scale.
+ 'grade_forum' => -1 * $scale->id
+ ]);
+ $course = $forum->get_course_record();
+ $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
+ $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
+
+ $this->execute_and_assert_fetch($forum, $options, $scale, $student, $teacher, $student);
+ }
+
+ /**
+ * Executes the fetch method with the given users and returns the result.
+ */
+ private function execute_and_assert_fetch ($forum, $options, $scale, $fetcheruser, $grader, $gradeduser) {
+
+ $this->setUser($grader);
$gradeitem = component_gradeitem::instance('mod_forum', $forum->get_context(), 'forum');
- $gradeitem->store_grade_from_formdata($student, $teacher, (object) [
+ $gradeitem->store_grade_from_formdata($gradeduser, $grader, (object) [
'grade' => 2,
]);
- $result = fetch::execute('mod_forum', (int) $forum->get_context()->id, 'forum', (int) $student->id);
+ $this->setUser($fetcheruser);
+
+ $result = fetch::execute('mod_forum', (int) $forum->get_context()->id, 'forum', (int) $gradeduser->id);
$result = external_api::clean_returnvalue(fetch::execute_returns(), $result);
$this->assertIsArray($result);
$this->assertEquals('core_grades/grades/grader/gradingpanel/scale', $result['templatename']);
- $result = fetch::execute('mod_forum', (int) $forum->get_context()->id, 'forum', (int) $student->id);
+ $result = fetch::execute('mod_forum', (int) $forum->get_context()->id, 'forum', (int) $gradeduser->id);
$result = external_api::clean_returnvalue(fetch::execute_returns(), $result);
$this->assertIsArray($result);
$this->assertEquals(3, $result['grade']['maxgrade']);
$this->assertArrayHasKey('gradedby', $result['grade']);
- $this->assertEquals(fullname($teacher), $result['grade']['gradedby']);
+ $this->assertEquals(fullname($grader), $result['grade']['gradedby']);
$this->assertArrayHasKey('options', $result['grade']);
$this->assertCount(count($options), $result['grade']['options']);