MDL-60959 calendar: use related course in calendar_event_exporter
authorRyan Wyllie <ryan@moodle.com>
Wed, 8 Nov 2017 06:23:50 +0000 (06:23 +0000)
committerRyan Wyllie <ryan@moodle.com>
Tue, 9 Jan 2018 01:51:12 +0000 (01:51 +0000)
calendar/classes/external/calendar_event_exporter.php
calendar/tests/calendar_event_exporter_test.php

index ad97c96..a4d24ad 100644 (file)
@@ -93,6 +93,8 @@ class calendar_event_exporter extends event_exporter_base {
 
         $values = parent::get_other_values($output);
         $event = $this->event;
+        $course = $this->related['course'];
+        $hascourse = !empty($course);
 
         // By default all events that can be edited are
         // draggable.
@@ -109,12 +111,9 @@ class calendar_event_exporter extends event_exporter_base {
             $values['editurl'] = $editurl->out(false);
         } else if ($event->get_type() == 'category') {
             $url = $event->get_category()->get_proxied_instance()->get_view_link();
-        } else if ($event->get_type() == 'course') {
-            $url = course_get_url($event->get_course()->get('id') ?: SITEID);
         } else {
             // TODO MDL-58866 We do not have any way to find urls for events outside of course modules.
-            $course = $event->get_course()->get('id') ?: SITEID;
-            $url = course_get_url($course);
+            $url = course_get_url($hascourse ? $course : SITEID);
         }
 
         $values['url'] = $url->out(false);
@@ -165,11 +164,10 @@ class calendar_event_exporter extends event_exporter_base {
         }
 
         // Include course's shortname into the event name, if applicable.
-        $course = $this->event->get_course();
-        if ($course && $course->get('id') && $course->get('id') !== SITEID) {
+        if ($hascourse && $course->id !== SITEID) {
             $eventnameparams = (object) [
                 'name' => $values['popupname'],
-                'course' => format_string($course->get('shortname'), true, [
+                'course' => format_string($course->shortname, true, [
                         'context' => $this->related['context'],
                     ])
             ];
index 5ae3edb..4bfdd96 100644 (file)
@@ -26,6 +26,9 @@ defined('MOODLE_INTERNAL') || die();
 
 use core_calendar\external\calendar_event_exporter;
 use core_calendar\local\event\container;
+use core_calendar\type_factory;
+
+require_once(__DIR__ . '/helpers.php');
 
 /**
  * Calendar event exporter testcase.
@@ -147,4 +150,83 @@ class core_calendar_event_exporter_testcase extends advanced_testcase {
         $this->assertEquals($expected, $result['maxdaytimestamp']);
         $this->assertEquals($max[1], $result['maxdayerror']);
     }
+
+    /**
+     * Exporting a course event should generate the course URL.
+     */
+    public function test_calendar_event_exporter_course_url_course_event() {
+        global $CFG, $PAGE;
+        require_once($CFG->dirroot . '/course/lib.php');
+
+        $this->resetAfterTest(true);
+        $this->setAdminUser();
+        $generator = $this->getDataGenerator();
+        $user = $generator->create_user();
+        $course = $generator->create_course();
+        $context = context_course::instance($course->id);
+        $now = time();
+        $mapper = container::get_event_mapper();
+        $legacyevent = create_event([
+            'courseid' => $course->id,
+            'userid' => 1,
+            'eventtype' => 'course',
+            'timestart' => $now
+        ]);
+        $event = $mapper->from_legacy_event_to_event($legacyevent);
+        $exporter = new calendar_event_exporter($event, [
+            'context' => $context,
+            'course' => $course,
+            'moduleinstance' => null,
+            'daylink' => new moodle_url(''),
+            'type' => type_factory::get_calendar_instance(),
+            'today' => $now
+        ]);
+
+        $courseurl = course_get_url($course->id);
+        $expected = $courseurl->out(false);
+        $renderer = $PAGE->get_renderer('core_calendar');
+        $exportedevent = $exporter->export($renderer);
+
+        // The exported URL should be for the course.
+        $this->assertEquals($expected, $exportedevent->url);
+    }
+
+    /**
+     * Exporting a user event should generate the site course URL.
+     */
+    public function test_calendar_event_exporter_course_url_user_event() {
+        global $CFG, $PAGE;
+        require_once($CFG->dirroot . '/course/lib.php');
+
+        $this->resetAfterTest(true);
+        $this->setAdminUser();
+        $generator = $this->getDataGenerator();
+        $user = $generator->create_user();
+        $context = context_user::instance($user->id);
+        $now = time();
+        $mapper = container::get_event_mapper();
+        $legacyevent = create_event([
+            'courseid' => 0,
+            'userid' => $user->id,
+            'eventtype' => 'user',
+            'timestart' => $now
+        ]);
+        $event = $mapper->from_legacy_event_to_event($legacyevent);
+        $exporter = new calendar_event_exporter($event, [
+            'context' => $context,
+            'course' => null,
+            'moduleinstance' => null,
+            'daylink' => new moodle_url(''),
+            'type' => type_factory::get_calendar_instance(),
+            'today' => $now
+        ]);
+
+        $courseurl = course_get_url(SITEID);
+        $expected = $courseurl->out(false);
+        $renderer = $PAGE->get_renderer('core_calendar');
+        $exportedevent = $exporter->export($renderer);
+
+        // The exported URL should be for the site course.
+        $this->assertEquals($expected, $exportedevent->url);
+    }
 }