$record['pinned'] = FORUM_DISCUSSION_UNPINNED;
}
+ if (isset($record['mailed'])) {
+ $mailed = $record['mailed'];
+ }
+
$record = (object) $record;
// Add the discussion.
$record->id = forum_add_discussion($record, null, null, $record->userid);
- if (isset($timemodified)) {
- // Enforce the time modified.
+ if (isset($timemodified) || isset($mailed)) {
$post = $DB->get_record('forum_posts', array('discussion' => $record->id));
- $record->timemodified = $timemodified;
- $post->modified = $post->created = $timemodified;
- $DB->update_record('forum_discussions', $record);
+ if (isset($mailed)) {
+ $post->mailed = $mailed;
+ }
+
+ if (isset($timemodified)) {
+ // Enforce the time modified.
+ $record->timemodified = $timemodified;
+ $post->modified = $post->created = $timemodified;
+
+ $DB->update_record('forum_discussions', $record);
+ }
+
$DB->update_record('forum_posts', $post);
}
// Null check.
$this->assertEmpty($neighbours['next']);
}
+
+ /**
+ * @dataProvider forum_get_unmailed_posts_provider
+ */
+ public function test_forum_get_unmailed_posts($discussiondata, $enabletimedposts, $expectedcount, $expectedreplycount) {
+ global $CFG, $DB;
+
+ $this->resetAfterTest();
+
+ // Configure timed posts.
+ $CFG->forum_enabletimedposts = $enabletimedposts;
+
+ $course = $this->getDataGenerator()->create_course();
+ $forum = $this->getDataGenerator()->create_module('forum', ['course' => $course->id]);
+ $user = $this->getDataGenerator()->create_user();
+ $forumgen = $this->getDataGenerator()->get_plugin_generator('mod_forum');
+
+ $record = new stdClass();
+ $record->course = $course->id;
+ $record->userid = $user->id;
+ $record->forum = $forum->id;
+ if (isset($discussiondata['timecreated'])) {
+ $record->timemodified = time() + $discussiondata['timecreated'];
+ }
+ if (isset($discussiondata['timestart'])) {
+ $record->timestart = time() + $discussiondata['timestart'];
+ }
+ if (isset($discussiondata['timeend'])) {
+ $record->timeend = time() + $discussiondata['timeend'];
+ }
+ if (isset($discussiondata['mailed'])) {
+ $record->mailed = $discussiondata['mailed'];
+ }
+
+ $discussion = $forumgen->create_discussion($record);
+
+ // Fetch the unmailed posts.
+ $timenow = time();
+ $endtime = $timenow - $CFG->maxeditingtime;
+ $starttime = $endtime - 2 * DAYSECS;
+
+ $unmailed = forum_get_unmailed_posts($starttime, $endtime, $timenow);
+ $this->assertCount($expectedcount, $unmailed);
+
+ // Add a reply just outside the maxeditingtime.
+ $replyto = $DB->get_record('forum_posts', array('discussion' => $discussion->id));
+ $reply = new stdClass();
+ $reply->userid = $user->id;
+ $reply->discussion = $discussion->id;
+ $reply->parent = $replyto->id;
+ $reply->created = max($replyto->created, $endtime - 1);
+ $r = $forumgen->create_post($reply);
+
+ $unmailed = forum_get_unmailed_posts($starttime, $endtime, $timenow);
+ $this->assertCount($expectedreplycount, $unmailed);
+ }
+
+ public function forum_get_unmailed_posts_provider() {
+ return [
+ 'Untimed discussion; Single post; maxeditingtime not expired' => [
+ 'discussion' => [
+ ],
+ 'timedposts' => false,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ 'Untimed discussion; Single post; maxeditingtime expired' => [
+ 'discussion' => [
+ 'timecreated' => - DAYSECS,
+ ],
+ 'timedposts' => false,
+ 'postcount' => 1,
+ 'replycount' => 2,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime not expired' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => 0,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 1,
+ 'replycount' => 2,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend not reached' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ 'timeend' => + DAYSECS
+ ],
+ 'timedposts' => true,
+ 'postcount' => 1,
+ 'replycount' => 2,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend passed' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ 'timeend' => - HOURSECS,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timeend not reached' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timeend' => + DAYSECS
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 1,
+ ],
+ 'Timed discussion; Single post; Posted 1 week ago; timeend passed' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timeend' => - DAYSECS,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+
+ 'Previously mailed; Untimed discussion; Single post; maxeditingtime not expired' => [
+ 'discussion' => [
+ 'mailed' => 1,
+ ],
+ 'timedposts' => false,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+
+ 'Previously mailed; Untimed discussion; Single post; maxeditingtime expired' => [
+ 'discussion' => [
+ 'timecreated' => - DAYSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => false,
+ 'postcount' => 0,
+ 'replycount' => 1,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime not expired' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => 0,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 1,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend not reached' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ 'timeend' => + DAYSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 1,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timestart maxeditingtime expired; timeend passed' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timestart' => - DAYSECS,
+ 'timeend' => - HOURSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timeend not reached' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timeend' => + DAYSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 1,
+ ],
+ 'Previously mailed; Timed discussion; Single post; Posted 1 week ago; timeend passed' => [
+ 'discussion' => [
+ 'timecreated' => - WEEKSECS,
+ 'timeend' => - DAYSECS,
+ 'mailed' => 1,
+ ],
+ 'timedposts' => true,
+ 'postcount' => 0,
+ 'replycount' => 0,
+ ],
+ ];
+ }
}