Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?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/>.

/**
 * This file contains the class that handles testing of the calendar events.
 *
 * @package core_calendar
 * @copyright 2014 Ankit Agarwal <ankit.agrr@gmail.com>
 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace core_calendar\event;

use core_calendar_externallib_testcase;

defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/calendar/tests/externallib_test.php');

/**
 * This file contains the class that handles testing of the calendar events.
 *
 * @package core_calendar
 * @copyright 2014 Ankit Agarwal <ankit.agrr@gmail.com>
 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class events_test extends \advanced_testcase {

    /**
     * The test user.
     */
    private $user;

    /**
     * The test course.
     */
    private $course;

    /**
     * Test set up.
     */
    protected function setUp(): void {
        global $USER;
        // The user we are going to test this on.
        $this->setAdminUser();
        $this->user = $USER;
        $this->course = self::getDataGenerator()->create_course();
    }

    /**
     * Tests for calendar_event_created event.
     */
    public function test_calendar_event_created() {

        $this->resetAfterTest();

        // Catch the events.
        $sink = $this->redirectEvents();

        // Create a calendar event.
        $record = new \stdClass();
        $record->courseid = 0;
        $time = time();
        $calevent = \core_calendar\externallib_test::create_calendar_event('event', $this->user->id, 'user', 0, $time,
                $record); // User event.

        // Capture the event.
        $events = $sink->get_events();
        $sink->clear();

        // Validate the event.
        $event = $events[0];
        $this->assertInstanceOf('\core\event\calendar_event_created', $event);
        $this->assertEquals('event', $event->objecttable);
        $this->assertEquals(0, $event->courseid);
        $this->assertEquals($calevent->context, $event->get_context());
< $expectedlog = array(0, 'calendar', 'add', 'event.php?action=edit&amp;id=' . $calevent->id , $calevent->name);
$other = array('repeatid' => 0, 'timestart' => $time, 'name' => 'event'); $this->assertEquals($other, $event->other);
< $this->assertEventLegacyLogData($expectedlog, $event);
$this->assertEventContextNotUsed($event); // Now we create a repeated course event. $record = new \stdClass(); $record->courseid = $this->course->id; $calevent = \core_calendar\externallib_test::create_calendar_event('course', $this->user->id, 'course', 10, $time, $record); $events = $sink->get_events(); $sink->close(); $this->assertEquals(10, count($events)); foreach ($events as $event) { $this->assertInstanceOf('\core\event\calendar_event_created', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals($this->course->id, $event->courseid); $this->assertEquals($calevent->context, $event->get_context()); } } /** * Tests for event validations related to calendar_event_created event. */ public function test_calendar_event_created_validations() { $this->resetAfterTest(); $context = \context_user::instance($this->user->id); // Test not setting other['repeatid']. try { \core\event\calendar_event_created::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'timestart' => time(), 'name' => 'event' ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_created to be triggered without other['repeatid']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'repeatid\' value must be set in other.', $e->getMessage()); } // Test not setting other['name']. try { \core\event\calendar_event_created::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'repeatid' => 0, 'timestart' => time(), ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_created to be triggered without other['name']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'name\' value must be set in other.', $e->getMessage()); } // Test not setting other['timestart']. try { \core\event\calendar_event_created::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'name' => 'event', 'repeatid' => 0, ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_deleted to be triggered without other['timestart']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'timestart\' value must be set in other.', $e->getMessage()); } } /** * Tests for calendar_event_updated event. */ public function test_calendar_event_updated() { $this->resetAfterTest(); // Create a calendar event. $record = new \stdClass(); $record->courseid = 0; $time = time(); $calevent = \core_calendar\externallib_test::create_calendar_event('event', $this->user->id, 'user', 0, $time, $record); // User event. // Catch the events. $sink = $this->redirectEvents(); $prop = new \stdClass(); $prop->name = 'new event'; $calevent->update($prop); // Update calender event. // Capture the event. $events = $sink->get_events(); // Validate the event. $event = $events[0]; $this->assertInstanceOf('\core\event\calendar_event_updated', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals(0, $event->courseid); $this->assertEquals($calevent->context, $event->get_context());
< $expectedlog = array(0, 'calendar', 'edit', 'event.php?action=edit&amp;id=' . $calevent->id , $calevent->name); < $this->assertEventLegacyLogData($expectedlog, $event);
$other = array('repeatid' => 0, 'timestart' => $time, 'name' => 'new event'); $this->assertEquals($other, $event->other); $this->assertEventContextNotUsed($event); // Now we create a repeated course event and update it. $record = new \stdClass(); $record->courseid = $this->course->id; $calevent = \core_calendar\externallib_test::create_calendar_event('course', $this->user->id, 'course', 10, time(), $record); $sink->clear(); $prop = new \stdClass(); $prop->name = 'new event'; $prop->repeateditall = true; $calevent->update($prop); // Update calender event. $events = $sink->get_events(); $sink->close(); $this->assertEquals(10, count($events)); foreach ($events as $event) { $this->assertInstanceOf('\core\event\calendar_event_updated', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals($this->course->id, $event->courseid); $this->assertEquals($calevent->context, $event->get_context()); } } /** * Tests for calendar_event_updated event. */ public function test_calendar_event_updated_toggle_visibility() { global $DB; $siteid = 0; $this->resetAfterTest(); // Create a calendar event. $time = time(); $calevent = \core_calendar\externallib_test::create_calendar_event('Some wickedly awesome event yo!', $this->user->id, 'user', 0, $time); // Updated the visibility of the calendar event. $sink = $this->redirectEvents(); $calevent->toggle_visibility(); $dbrecord = $DB->get_record('event', array('id' => $calevent->id), '*', MUST_EXIST); $events = $sink->get_events(); // Validate the calendar_event_updated event. $event = $events[0]; $this->assertInstanceOf('\core\event\calendar_event_updated', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals($siteid, $event->courseid); $this->assertEquals($calevent->context, $event->get_context());
< $expectedlog = [$siteid, 'calendar', 'edit', 'event.php?action=edit&amp;id=' . $calevent->id , $calevent->name]; < $this->assertEventLegacyLogData($expectedlog, $event);
$other = array('repeatid' => 0, 'timestart' => $time, 'name' => 'Some wickedly awesome event yo!'); $this->assertEquals($other, $event->other); $this->assertEventContextNotUsed($event); $this->assertEquals($dbrecord, $event->get_record_snapshot('event', $event->objectid)); } /** * Tests for event validations related to calendar_event_created event. */ public function test_calendar_event_updated_validations() { $this->resetAfterTest(); $context = \context_user::instance($this->user->id); // Test not setting other['repeatid']. try { \core\event\calendar_event_updated::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'timestart' => time(), 'name' => 'event' ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_updated to be triggered without other['repeatid']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'repeatid\' value must be set in other.', $e->getMessage()); } // Test not setting other['name']. try { \core\event\calendar_event_updated::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'repeatid' => 0, 'timestart' => time(), ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_updated to be triggered without other['name']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'name\' value must be set in other.', $e->getMessage()); } // Test not setting other['timestart']. try { \core\event\calendar_event_updated::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'name' => 'event', 'repeatid' => 0, ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_deleted to be triggered without other['timestart']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'timestart\' value must be set in other.', $e->getMessage()); } } /** * Tests for calendar_event_deleted event. */ public function test_calendar_event_deleted() { global $DB; $this->resetAfterTest(); // Create a calendar event. $record = new \stdClass(); $record->courseid = 0; $record->repeatid = 0; $time = time(); $calevent = \core_calendar\externallib_test::create_calendar_event('event', $this->user->id, 'user', 0, $time, $record); // User event. $dbrecord = $DB->get_record('event', array('id' => $calevent->id), '*', MUST_EXIST); // Catch the events. $sink = $this->redirectEvents(); $calevent->delete(false); $events = $sink->get_events(); // Validate the event. $event = $events[0]; $this->assertInstanceOf('\core\event\calendar_event_deleted', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals(0, $event->courseid); $this->assertEquals($calevent->context, $event->get_context()); $other = array('repeatid' => 0, 'timestart' => $time, 'name' => 'event'); $this->assertEquals($other, $event->other); $this->assertEventContextNotUsed($event); $this->assertEquals($dbrecord, $event->get_record_snapshot('event', $event->objectid)); // Now we create a repeated course event and delete it. $record = new \stdClass(); $record->courseid = $this->course->id; $calevent = \core_calendar\externallib_test::create_calendar_event('course', $this->user->id, 'course', 10, time(), $record); $sink->clear(); $prop = new \stdClass(); $prop->name = 'new event'; $prop->repeateditall = true; $calevent->delete(true); $events = $sink->get_events(); $sink->close(); $this->assertEquals(10, count($events)); foreach ($events as $event) { $this->assertInstanceOf('\core\event\calendar_event_deleted', $event); $this->assertEquals('event', $event->objecttable); $this->assertEquals($this->course->id, $event->courseid); $this->assertEquals($calevent->context, $event->get_context()); } } /** * Tests for event validations related to calendar_event_deleted event. */ public function test_calendar_event_deleted_validations() { $this->resetAfterTest(); $context = \context_user::instance($this->user->id); // Test not setting other['repeatid']. try { \core\event\calendar_event_deleted::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'timestart' => time(), 'name' => 'event' ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_deleted to be triggered without other['repeatid']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'repeatid\' value must be set in other.', $e->getMessage()); } // Test not setting other['name']. try { \core\event\calendar_event_deleted::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'repeatid' => 0, 'timestart' => time(), ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_deleted to be triggered without other['name']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'name\' value must be set in other.', $e->getMessage()); } // Test not setting other['timestart']. try { \core\event\calendar_event_deleted::create(array( 'context' => $context, 'objectid' => 2, 'other' => array( 'name' => 'event', 'repeatid' => 0, ) )); $this->fail("Event validation should not allow \\core\\event\\calendar_event_deleted to be triggered without other['timestart']"); } catch (\coding_exception $e) { $this->assertStringContainsString('The \'timestart\' value must be set in other.', $e->getMessage()); } } /** * Tests for calendar_subscription_added event for a site subscription. */ public function test_calendar_subscription_created_site() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'site'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; // Trigger and capture the event. $sink = $this->redirectEvents(); $id = calendar_add_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_created', $event); $this->assertEquals($id, $event->objectid); $this->assertEquals($subscription->courseid, $event->other['courseid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_added event for a category subscription. */ public function test_calendar_subscription_created_category() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $categoryid = $this->course->category; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'category'; $subscription->name = 'test'; $subscription->categoryid = $categoryid; // Trigger and capture the event. $sink = $this->redirectEvents(); $id = calendar_add_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_created', $event); $this->assertEquals($id, $event->objectid); $this->assertEquals($categoryid, $event->other['categoryid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('courseid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_added event for a course subscription. */ public function test_calendar_subscription_created_course() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'course'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; // Trigger and capture the event. $sink = $this->redirectEvents(); $id = calendar_add_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_created', $event); $this->assertEquals($id, $event->objectid); $this->assertEquals($subscription->courseid, $event->other['courseid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_added event for a group subscription. */ public function test_calendar_subscription_created_group() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $courseid = $this->course->id; $groupid = 42; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'group'; $subscription->name = 'test'; $subscription->courseid = $courseid; $subscription->groupid = $groupid; // Trigger and capture the event. $sink = $this->redirectEvents(); $id = calendar_add_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_created', $event); $this->assertEquals($id, $event->objectid); $this->assertEquals($courseid, $event->other['courseid']); $this->assertEquals($groupid, $event->other['groupid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_updated event for a site subscription. */ public function test_calendar_subscription_updated_site() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'site'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; $subscription->id = calendar_add_subscription($subscription); // Now edit it. $subscription->name = 'awesome'; // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_update_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_updated', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($subscription->courseid, $event->other['courseid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_updated event for a category subscription. */ public function test_calendar_subscription_updated_category() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $categoryid = $this->course->category; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'category'; $subscription->name = 'test'; $subscription->categoryid = $categoryid; $subscription->id = calendar_add_subscription($subscription); // Now edit it. $subscription->name = 'awesome'; // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_update_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_updated', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($categoryid, $event->other['categoryid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('courseid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_updated event for a group subscription. */ public function test_calendar_subscription_updated_course() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'course'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; $subscription->id = calendar_add_subscription($subscription); // Now edit it. $subscription->name = 'awesome'; // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_update_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_updated', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($this->course->id, $event->other['courseid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_updated event for a course subscription. */ public function test_calendar_subscription_updated_group() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $courseid = $this->course->id; $groupid = 42; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'group'; $subscription->name = 'test'; $subscription->courseid = $courseid; $subscription->groupid = $groupid; $subscription->id = calendar_add_subscription($subscription); // Now edit it. $subscription->name = 'awesome'; // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_update_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_updated', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($this->course->id, $event->other['courseid']); $this->assertEquals($groupid, $event->other['groupid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_deleted event for a site subscription. */ public function test_calendar_subscription_deleted_site() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'site'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; $subscription->id = calendar_add_subscription($subscription); // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_delete_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_deleted', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($subscription->courseid, $event->other['courseid']); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_deleted event for a category subscription. */ public function test_calendar_subscription_deleted_category() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $categoryid = $this->course->category; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'category'; $subscription->name = 'test'; $subscription->categoryid = $categoryid; $subscription->id = calendar_add_subscription($subscription); // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_delete_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_deleted', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($categoryid, $event->other['categoryid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('courseid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_deleted event for a course. */ public function test_calendar_subscription_deleted_course() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'course'; $subscription->name = 'test'; $subscription->courseid = $this->course->id; $subscription->id = calendar_add_subscription($subscription); // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_delete_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_deleted', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($this->course->id, $event->other['courseid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertArrayNotHasKey('groupid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } /** * Tests for calendar_subscription_deleted event for a group. */ public function test_calendar_subscription_deleted_group() { global $CFG; require_once($CFG->dirroot . '/calendar/lib.php'); $this->resetAfterTest(true); $courseid = $this->course->id; $groupid = 42; // Create a mock subscription. $subscription = new \stdClass(); $subscription->eventtype = 'group'; $subscription->name = 'test'; $subscription->groupid = $groupid; $subscription->courseid = $courseid; $subscription->id = calendar_add_subscription($subscription); // Trigger and capture the event. $sink = $this->redirectEvents(); calendar_delete_subscription($subscription); $events = $sink->get_events(); $event = reset($events); // Check that the event data is valid. $this->assertInstanceOf('\core\event\calendar_subscription_deleted', $event); $this->assertEquals($subscription->id, $event->objectid); $this->assertEquals($this->course->id, $event->other['courseid']); $this->assertEquals($groupid, $event->other['groupid']); $this->assertEquals($subscription->eventtype, $event->other['eventtype']); $this->assertArrayNotHasKey('categoryid', $event->other); $this->assertDebuggingNotCalled(); $sink->close(); } }