MDL-66143 course: Relative dates mode handling
authorJun Pataleta <jun@moodle.com>
Tue, 16 Jul 2019 02:28:15 +0000 (10:28 +0800)
committerJun Pataleta <jun@moodle.com>
Mon, 22 Jul 2019 03:52:41 +0000 (11:52 +0800)
* On course creation, make sure that we can enable relative dates mode
  only when the site setting is enabled.
* On course update, make sure that the relative dates mode setting
  cannot be changed.

course/lib.php
course/tests/courselib_test.php

index 52432a4..436e5a1 100644 (file)
@@ -2410,6 +2410,11 @@ function create_course($data, $editoroptions = NULL) {
         }
     }
 
+    if (empty($CFG->enablecourserelativedates)) {
+        // Make sure we're not setting the relative dates mode when the setting is disabled.
+        unset($data->relativedatesmode);
+    }
+
     if ($errorcode = course_validate_dates((array)$data)) {
         throw new moodle_exception($errorcode);
     }
@@ -2522,6 +2527,9 @@ function update_course($data, $editoroptions = NULL) {
     $oldcourse = course_get_format($data->id)->get_course();
     $context   = context_course::instance($oldcourse->id);
 
+    // Make sure we're not changing whatever the course's relativedatesmode setting is.
+    unset($data->relativedatesmode);
+
     // Capture the updated fields for the log data.
     $updatedfields = [];
     foreach (get_object_vars($oldcourse) as $field => $value) {
index fde58cc..8ccdea0 100644 (file)
@@ -745,6 +745,63 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertGreaterThan($oldtimemodified, $newtimemodified);
     }
 
+    /**
+     * Relative dates mode settings provider for course creation.
+     */
+    public function create_course_relative_dates_provider() {
+        return [
+            [0, 0, 0],
+            [0, 1, 0],
+            [1, 0, 0],
+            [1, 1, 1],
+        ];
+    }
+
+    /**
+     * Test create_course by attempting to change the relative dates mode.
+     *
+     * @dataProvider create_course_relative_dates_provider
+     * @param int $setting The value for the 'enablecourserelativedates' admin setting.
+     * @param int $mode The value for the course's 'relativedatesmode' field.
+     * @param int $expectedvalue The expected value of the 'relativedatesmode' field after course creation.
+     */
+    public function test_relative_dates_mode_for_course_creation($setting, $mode, $expectedvalue) {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        set_config('enablecourserelativedates', $setting);
+
+        // Generate a course with relative dates mode set to 1.
+        $course = $this->getDataGenerator()->create_course(['relativedatesmode' => $mode]);
+
+        // Verify that the relative dates match what's expected.
+        $relativedatesmode = $DB->get_field('course', 'relativedatesmode', ['id' => $course->id]);
+        $this->assertEquals($expectedvalue, $relativedatesmode);
+    }
+
+    /**
+     * Test update_course by attempting to change the relative dates mode.
+     */
+    public function test_relative_dates_mode_for_course_update() {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        set_config('enablecourserelativedates', 1);
+
+        // Generate a course with relative dates mode set to 1.
+        $course = $this->getDataGenerator()->create_course(['relativedatesmode' => 1]);
+
+        // Attempt to update the course with a changed relativedatesmode.
+        $course->relativedatesmode = 0;
+        update_course($course);
+
+        // Verify that the relative dates mode has not changed.
+        $relativedatesmode = $DB->get_field('course', 'relativedatesmode', ['id' => $course->id]);
+        $this->assertEquals(1, $relativedatesmode);
+    }
+
     public function test_course_add_cm_to_section() {
         global $DB;
         $this->resetAfterTest(true);