From e6a6b0819638b92e3de229a98512f886377b32ab Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Fri, 26 Feb 2021 21:36:36 +1100 Subject: [PATCH] MDL-70818 mod_forum: implement activity_dates for the forum module --- mod/forum/classes/dates.php | 57 +++++++++++++++++++ mod/forum/lang/en/forum.php | 1 + mod/forum/tests/dates_test.php | 100 +++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 mod/forum/classes/dates.php create mode 100644 mod/forum/tests/dates_test.php diff --git a/mod/forum/classes/dates.php b/mod/forum/classes/dates.php new file mode 100644 index 0000000000000..18814f996f1e2 --- /dev/null +++ b/mod/forum/classes/dates.php @@ -0,0 +1,57 @@ +. + +/** + * Contains the class for fetching the important dates in mod_forum for a given module instance and a user. + * + * @package mod_forum + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +declare(strict_types=1); + +namespace mod_forum; + +use core\activity_dates; + +/** + * Class for fetching the important dates in mod_forum for a given module instance and a user. + * + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class dates extends activity_dates { + + /** + * Returns a list of important dates in mod_forum + * + * @return array + */ + protected function get_dates(): array { + $duedate = $this->cm->customdata['duedate'] ?? null; + $dates = []; + + if ($duedate) { + $dates[] = [ + 'label' => get_string('activitydate:due', 'mod_forum'), + 'timestamp' => (int) $duedate, + ]; + } + + return $dates; + } +} diff --git a/mod/forum/lang/en/forum.php b/mod/forum/lang/en/forum.php index 1e65390357725..db8db3afd9561 100644 --- a/mod/forum/lang/en/forum.php +++ b/mod/forum/lang/en/forum.php @@ -23,6 +23,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +$string['activitydate:due'] = 'Due:'; $string['activityoverview'] = 'There are new forum posts'; $string['actionsforgraderinterface'] = 'Actions for the grader interface'; $string['actionsforpost'] = 'Actions for post'; diff --git a/mod/forum/tests/dates_test.php b/mod/forum/tests/dates_test.php new file mode 100644 index 0000000000000..e53517a95a48f --- /dev/null +++ b/mod/forum/tests/dates_test.php @@ -0,0 +1,100 @@ +. + +/** + * Contains unit tests for mod_forum\dates. + * + * @package mod_forum + * @category test + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +declare(strict_types=1); + +namespace mod_forum; + +use advanced_testcase; +use cm_info; +use core\activity_dates; + +/** + * Class for unit testing mod_forum\dates. + * + * @copyright 2021 Shamim Rezaie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class dates_test extends advanced_testcase { + + /** + * Data provider for get_dates_for_module(). + * @return array[] + */ + public function get_dates_for_module_provider(): array { + $now = time(); + $before = $now - DAYSECS; + $after = $now + DAYSECS; + + return [ + 'without any dates' => [ + null, [] + ], + 'future due date' => [ + $after, [ + ['label' => 'Due:', 'timestamp' => $after], + ] + ], + 'due date is past' => [ + $before, [ + ['label' => 'Due:', 'timestamp' => $before], + ] + ], + ]; + } + + /** + * Test for get_dates_for_module(). + * + * @dataProvider get_dates_for_module_provider + * @param int|null $duedate Forum's due date. + * @param array $expected The expected value of calling get_dates_for_module() + */ + public function test_get_dates_for_module(?int $duedate, array $expected) { + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($user->id, $course->id); + + $data = ['course' => $course->id]; + if ($duedate) { + $data['duedate'] = $duedate; + } + + $this->setAdminUser(); + $forum = $this->getDataGenerator()->create_module('forum', $data); + + $this->setUser($user); + + $cm = get_coursemodule_from_instance('forum', $forum->id); + // Make sure we're using a cm_info object. + $cm = cm_info::create($cm); + + $dates = activity_dates::get_dates_for_module($cm, (int) $user->id); + + $this->assertEquals($expected, $dates); + } +}