From a6fc917168788eddca7a534b959a5e1b61d205f3 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Wed, 28 Oct 2015 15:01:25 +0800 Subject: [PATCH] MDL-51852 mod_forum: Respect timed discussions in emails --- mod/forum/classes/output/forum_post.php | 29 ++-- mod/forum/tests/output_email_test.php | 191 ++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 11 deletions(-) create mode 100644 mod/forum/tests/output_email_test.php diff --git a/mod/forum/classes/output/forum_post.php b/mod/forum/classes/output/forum_post.php index 431dad61b2e..1ca93c1f2d2 100644 --- a/mod/forum/classes/output/forum_post.php +++ b/mod/forum/classes/output/forum_post.php @@ -41,69 +41,69 @@ class forum_post implements \renderable { * * @var object $course */ - private $course = null; + protected $course = null; /** * The course module for the forum. * * @var object $cm */ - private $cm = null; + protected $cm = null; /** * The forum that the post is in. * * @var object $forum */ - private $forum = null; + protected $forum = null; /** * The discussion that the forum post is in. * * @var object $discussion */ - private $discussion = null; + protected $discussion = null; /** * The forum post being displayed. * * @var object $post */ - private $post = null; + protected $post = null; /** * Whether the user can reply to this post. * * @var boolean $canreply */ - private $canreply = false; + protected $canreply = false; /** * Whether to override forum display when displaying usernames. * @var boolean $viewfullnames */ - private $viewfullnames = false; + protected $viewfullnames = false; /** * The user that is reading the post. * * @var object $userto */ - private $userto = null; + protected $userto = null; /** * The user that wrote the post. * * @var object $author */ - private $author = null; + protected $author = null; /** * An associative array indicating which keys on this object should be writeable. * * @var array $writablekeys */ - private $writablekeys = array( + protected $writablekeys = array( 'viewfullnames' => true, ); @@ -448,7 +448,14 @@ class forum_post implements \renderable { * @return string. */ public function get_postdate() { - return userdate($this->post->modified, "", \core_date::get_user_timezone($this->get_postto())); + global $CFG; + + $postmodified = $this->post->modified; + if (!empty($CFG->forum_enabletimedposts) && ($this->discussion->timestart > $postmodified)) { + $postmodified = $this->discussion->timestart; + } + + return userdate($postmodified, "", \core_date::get_user_timezone($this->get_postto())); } /** diff --git a/mod/forum/tests/output_email_test.php b/mod/forum/tests/output_email_test.php new file mode 100644 index 00000000000..a13e09f9957 --- /dev/null +++ b/mod/forum/tests/output_email_test.php @@ -0,0 +1,191 @@ +. + +/** + * The module forums tests + * + * @package mod_forum + * @copyright 2016 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Tests for the forum output/email class. + * + * @copyright 2016 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_forum_output_email_testcase extends advanced_testcase { + /** + * Data provider for the postdate function tests. + */ + public function postdate_provider() { + return array( + 'Timed discussions disabled, timestart unset' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 0, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + ), + 'expectation' => 1000, + ), + 'Timed discussions disabled, timestart set and newer' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 0, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + 'timestart' => 2000, + ), + 'expectation' => 1000, + ), + 'Timed discussions disabled, timestart set but older' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 0, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + 'timestart' => 500, + ), + 'expectation' => 1000, + ), + 'Timed discussions enabled, timestart unset' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 1, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + ), + 'expectation' => 1000, + ), + 'Timed discussions enabled, timestart set and newer' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 1, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + 'timestart' => 2000, + ), + 'expectation' => 2000, + ), + 'Timed discussions enabled, timestart set but older' => array( + 'globalconfig' => array( + 'forum_enabletimedposts' => 1, + ), + 'forumconfig' => array( + ), + 'postconfig' => array( + 'modified' => 1000, + ), + 'discussionconfig' => array( + 'timestart' => 500, + ), + 'expectation' => 1000, + ), + ); + } + + /** + * Test for the forum email renderable postdate. + * + * @dataProvider postdate_provider + * + * @param array $globalconfig The configuration to set on $CFG + * @param array $forumconfig The configuration for this forum + * @param array $postconfig The configuration for this post + * @param array $discussionconfig The configuration for this discussion + * @param string $expectation The expected date + */ + public function test_postdate($globalconfig, $forumconfig, $postconfig, $discussionconfig, $expectation) { + global $CFG, $DB; + $this->resetAfterTest(true); + + // Apply the global configuration. + foreach ($globalconfig as $key => $value) { + $CFG->$key = $value; + } + + // Create the fixture. + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $forum = $this->getDataGenerator()->create_module('forum', (object) array('course' => $course->id)); + $cm = get_coursemodule_from_instance('forum', $forum->id, $course->id, false, MUST_EXIST); + + $this->getDataGenerator()->enrol_user($user->id, $course->id); + + // Create a new discussion. + $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion( + (object) array_merge($discussionconfig, array( + 'course' => $course->id, + 'forum' => $forum->id, + 'userid' => $user->id, + ))); + + // Apply the discussion configuration. + // Some settings are ignored by the generator and must be set manually. + $discussion = $DB->get_record('forum_discussions', array('id' => $discussion->id)); + foreach ($discussionconfig as $key => $value) { + $discussion->$key = $value; + } + $DB->update_record('forum_discussions', $discussion); + + // Apply the post configuration. + // Some settings are ignored by the generator and must be set manually. + $post = $DB->get_record('forum_posts', array('discussion' => $discussion->id)); + foreach ($postconfig as $key => $value) { + $post->$key = $value; + } + $DB->update_record('forum_posts', $post); + + // Create the renderable. + $renderable = new mod_forum\output\forum_post_email( + $course, + $cm, + $forum, + $discussion, + $post, + $user, + $user, + true + ); + + // Check the postdate matches our expectations. + $this->assertEquals(userdate($expectation, "", \core_date::get_user_timezone($user)), $renderable->get_postdate()); + } +}