diff --git a/mod/feedback/tests/lib_test.php b/mod/feedback/tests/lib_test.php index 42764143eb5..a890ace137f 100644 --- a/mod/feedback/tests/lib_test.php +++ b/mod/feedback/tests/lib_test.php @@ -193,6 +193,42 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertTrue($actionevent->is_actionable()); } + /** + * Test calendar event provide action open, viewed by a different user. + */ + public function test_feedback_core_calendar_provide_event_action_open_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $now = time(); + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $course = $this->getDataGenerator()->create_course(); + $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual'); + + $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id, + 'timeopen' => $now - DAYSECS, 'timeclose' => $now + DAYSECS]); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + $factory = new \core_calendar\action_factory(); + + $this->setUser($user2); + + // User2 checking their events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent); + $this->assertEquals(get_string('answerquestions', 'feedback'), $actionevent->get_name()); + $this->assertInstanceOf('moodle_url', $actionevent->get_url()); + $this->assertEquals(1, $actionevent->get_item_count()); + $this->assertTrue($actionevent->is_actionable()); + } + /** * Test calendar event provide action closed. */ @@ -212,6 +248,38 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertNull($actionevent); } + /** + * Test calendar event provide action closed, viewed by a different user. + */ + public function test_feedback_core_calendar_provide_event_action_closed_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual'); + + $feedback = $this->getDataGenerator()->create_module('feedback', array('course' => $course->id, + 'timeclose' => time() - DAYSECS)); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + $factory = new \core_calendar\action_factory(); + $this->setUser($user2); + + // User2 checking their events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + + // No event on the dashboard if feedback is closed. + $this->assertNull($actionevent); + } + /** * Test calendar event action open in future. * @@ -236,6 +304,44 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertFalse($actionevent->is_actionable()); } + /** + * Test calendar event action open in future, viewed by a different user. + * + * @throws coding_exception + */ + public function test_feedback_core_calendar_provide_event_action_open_in_future_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual'); + + $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id, + 'timeopen' => time() + DAYSECS]); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + + $factory = new \core_calendar\action_factory(); + $this->setUser($user2); + + // User2 checking their events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + + $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent); + $this->assertEquals(get_string('answerquestions', 'feedback'), $actionevent->get_name()); + $this->assertInstanceOf('moodle_url', $actionevent->get_url()); + $this->assertEquals(1, $actionevent->get_item_count()); + $this->assertFalse($actionevent->is_actionable()); + } + /** * Test calendar event with no time specified. * @@ -259,6 +365,43 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertTrue($actionevent->is_actionable()); } + /** + * Test calendar event with no time specified, viewed by a different user. + * + * @throws coding_exception + */ + public function test_feedback_core_calendar_provide_event_action_no_time_specified_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual'); + + $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id]); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + + $factory = new \core_calendar\action_factory(); + $this->setUser($user2); + + // User2 checking their events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + + $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent); + $this->assertEquals(get_string('answerquestions', 'feedback'), $actionevent->get_name()); + $this->assertInstanceOf('moodle_url', $actionevent->get_url()); + $this->assertEquals(1, $actionevent->get_item_count()); + $this->assertTrue($actionevent->is_actionable()); + } + /** * A user that can not submit feedback should not have an action. */ @@ -286,6 +429,40 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertNull($action); } + /** + * A user that can not submit feedback should not have an action, viewed by a different user. + */ + public function test_feedback_core_calendar_provide_event_action_can_not_submit_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $course = $this->getDataGenerator()->create_course(); + $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id]); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + $cm = get_coursemodule_from_instance('feedback', $feedback->id); + $context = context_module::instance($cm->id); + $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual'); + + assign_capability('mod/feedback:complete', CAP_PROHIBIT, $studentrole->id, $context); + $factory = new \core_calendar\action_factory(); + $this->setUser($user2); + + // User2 checking their events. + + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + + $this->assertNull($actionevent); + } + /** * A user that has already submitted feedback should not have an action. */ @@ -321,6 +498,49 @@ class mod_feedback_lib_testcase extends advanced_testcase { $this->assertNull($action); } + /** + * A user that has already submitted feedback should not have an action, viewed by a different user. + */ + public function test_feedback_core_calendar_provide_event_action_already_submitted_for_user() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + $user = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $course = $this->getDataGenerator()->create_course(); + $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id]); + $event = $this->create_action_event($course->id, $feedback->id, FEEDBACK_EVENT_TYPE_OPEN); + $cm = get_coursemodule_from_instance('feedback', $feedback->id); + $context = context_module::instance($cm->id); + + $this->setUser($user); + + $record = [ + 'feedback' => $feedback->id, + 'userid' => $user->id, + 'timemodified' => time(), + 'random_response' => 0, + 'anonymous_response' => FEEDBACK_ANONYMOUS_NO, + 'courseid' => 0, + ]; + $DB->insert_record('feedback_completed', (object) $record); + + $factory = new \core_calendar\action_factory(); + $this->setUser($user2); + + // User2 checking their events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user2->id); + $this->assertNull($actionevent); + + // User2 checking $user's events. + $actionevent = mod_feedback_core_calendar_provide_event_action($event, $factory, $user->id); + + $this->assertNull($actionevent); + } + /** * Creates an action event. * diff --git a/mod/feedback/tests/privacy_test.php b/mod/feedback/tests/privacy_test.php index f983481538c..248eef8d640 100644 --- a/mod/feedback/tests/privacy_test.php +++ b/mod/feedback/tests/privacy_test.php @@ -524,22 +524,18 @@ class mod_feedback_privacy_testcase extends provider_testcase { * @return void */ protected function create_submission_with_answers($feedback, $user, $answers, $submissioncount = 1) { - global $DB, $USER; - $origuser = $USER; - $this->setUser($user); + global $DB; $modinfo = get_fast_modinfo($feedback->course); $cm = $modinfo->get_cm($feedback->cmid); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $feedback->course); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $feedback->course, false, null, null, $user->id); $feedbackcompletion->save_response_tmp((object) $answers); $feedbackcompletion->save_response(); $this->assertEquals($submissioncount, $DB->count_records('feedback_completed', ['feedback' => $feedback->id, 'userid' => $user->id])); $this->assertEquals(count($answers), $DB->count_records('feedback_value', [ 'completed' => $feedbackcompletion->get_completed()->id])); - - $this->setUser($origuser); } /** @@ -551,19 +547,15 @@ class mod_feedback_privacy_testcase extends provider_testcase { * @return void */ protected function create_tmp_submission_with_answers($feedback, $user, $answers) { - global $DB, $USER; - $origuser = $USER; - $this->setUser($user); + global $DB; $modinfo = get_fast_modinfo($feedback->course); $cm = $modinfo->get_cm($feedback->cmid); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $feedback->course); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $feedback->course, false, null, null, $user->id); $feedbackcompletion->save_response_tmp((object) $answers); $this->assertEquals(1, $DB->count_records('feedback_completedtmp', ['feedback' => $feedback->id, 'userid' => $user->id])); $this->assertEquals(2, $DB->count_records('feedback_valuetmp', [ 'completed' => $feedbackcompletion->get_current_completed_tmp()->id])); - - $this->setUser($origuser); } }