From 662c071f659c8026aed12896b295e91448922fb2 Mon Sep 17 00:00:00 2001 From: Neill Magill Date: Mon, 1 Apr 2019 11:36:20 +0100 Subject: [PATCH 1/2] MDL-65084 recent items: Test handling of deleted courses --- .../tests/helper_test.php | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 blocks/recentlyaccesseditems/tests/helper_test.php diff --git a/blocks/recentlyaccesseditems/tests/helper_test.php b/blocks/recentlyaccesseditems/tests/helper_test.php new file mode 100644 index 00000000000..a2e3fb33a08 --- /dev/null +++ b/blocks/recentlyaccesseditems/tests/helper_test.php @@ -0,0 +1,71 @@ +. + +/** + * Block recentlyaccesseditems helper tests. + * + * @package block_recentlyaccesseditems + * @copyright 2019 University of Nottingham + * @author Neill Magill + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +use block_recentlyaccesseditems\helper; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Block Recently accessed helper class tests. + * + * @package block_recentlyaccesseditems + * @copyright 2019 University of Nottingham + * @author Neill Magill + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class block_recentlyaccesseditems_helper_testcase extends advanced_testcase { + /** + * Tests that the get recent items method can handle getting records when courses have been deleted. + */ + public function test_get_recent_items() { + $this->resetAfterTest(); + $course = self::getDataGenerator()->create_course(); + $coursetodelete = self::getDataGenerator()->create_course(); + $user = self::getDataGenerator()->create_and_enrol($course, 'student'); + self::getDataGenerator()->enrol_user($user->id, $coursetodelete->id, 'student'); + + // Add an activity to each course. + $forum = self::getDataGenerator()->create_module('forum', ['course' => $course]); + $glossary = self::getDataGenerator()->create_module('glossary', ['course' => $coursetodelete]); + self::setUser($user); + + // Get the user to visit the activities. + $event1params = ['context' => context_module::instance($forum->cmid), 'objectid' => $forum->id]; + $event1 = \mod_forum\event\course_module_viewed::create($event1params); + $event1->trigger(); + $event2params = ['context' => context_module::instance($glossary->cmid), 'objectid' => $glossary->id]; + $event2 = \mod_glossary\event\course_module_viewed::create($event2params); + $event2->trigger(); + $recent1 = helper::get_recent_items(); + self::assertCount(2, $recent1); + $recentlinited = helper::get_recent_items(1); + self::assertCount(1, $recentlinited); + delete_course($coursetodelete, false); + + // There should be no errors if a course has been deleted. + $recent2 = helper::get_recent_items(); + self::assertCount(1, $recent2); + } +} From e597b883156486a225de7501bc88bda33078a878 Mon Sep 17 00:00:00 2001 From: Neill Magill Date: Mon, 1 Apr 2019 11:39:06 +0100 Subject: [PATCH 2/2] MDL-65084 recent items: Handle deleted courses The method should not cause errors when a course with activities that the user has visited no longer exists. Ensuring that we only get records for courses still in the database will stop any course not found erros from get_fast_modinfo() --- blocks/recentlyaccesseditems/classes/helper.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/blocks/recentlyaccesseditems/classes/helper.php b/blocks/recentlyaccesseditems/classes/helper.php index b7d2b72af6f..d1ac05b74ba 100644 --- a/blocks/recentlyaccesseditems/classes/helper.php +++ b/blocks/recentlyaccesseditems/classes/helper.php @@ -53,11 +53,13 @@ class helper { return $recentitems; } - // Determine sort sql clause. - $sort = 'timeaccess DESC'; - $paramsql = array('userid' => $userid); - $records = $DB->get_records('block_recentlyaccesseditems', $paramsql, $sort); + $sql = "SELECT rai.* + FROM {block_recentlyaccesseditems} rai + JOIN {course} c ON c.id = rai.courseid + WHERE userid = :userid + ORDER BY rai.timeaccess DESC"; + $records = $DB->get_records_sql($sql, $paramsql); $order = 0; // Get array of items by course. Use $order index to keep sql sorted results.