MDL-51852 mod_forum: Respect timed discussions in emails
authorAndrew Nicols <andrew@nicols.co.uk>
Wed, 28 Oct 2015 07:01:25 +0000 (15:01 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Tue, 16 Feb 2016 23:57:57 +0000 (07:57 +0800)
mod/forum/classes/output/forum_post.php
mod/forum/tests/output_email_test.php [new file with mode: 0644]

index 431dad6..1ca93c1 100644 (file)
@@ -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 (file)
index 0000000..a13e09f
--- /dev/null
@@ -0,0 +1,191 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * The module forums tests
+ *
+ * @package    mod_forum
+ * @copyright  2016 Andrew Nicols <andrew@nicols.co.uk>
+ * @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 <andrew@nicols.co.uk>
+ * @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());
+    }
+}