diff --git a/calendar/lib.php b/calendar/lib.php index e0c9b83041f..371b7ecb966 100644 --- a/calendar/lib.php +++ b/calendar/lib.php @@ -2801,8 +2801,6 @@ function calendar_add_subscription($sub) { $sub->pollinterval = 0; } - $cache = cache::make('core', 'calendar_subscriptions'); - if (!empty($sub->name)) { if (empty($sub->id)) { $id = $DB->insert_record('event_subscriptions', $sub); @@ -2810,9 +2808,7 @@ function calendar_add_subscription($sub) { return $id; } else { // Why are we doing an update here? - $DB->update_record('event_subscriptions', $sub); - // update cache. - $cache->set($sub->id, $sub); + calendar_update_subscription($sub); return $sub->id; } } else { @@ -2920,11 +2916,7 @@ function calendar_process_subscription_row($subscriptionid, $pollinterval, $acti break; } $sub->pollinterval = $pollinterval; - $DB->update_record('event_subscriptions', $sub); - - // update the cache. - $cache = cache::make('core', 'calendar_subscriptions'); - $cache->set($sub->id, $sub); + calendar_update_subscription($sub); // Update the events. return "

".get_string('subscriptionupdated', 'calendar', $sub->name)."

" . calendar_update_subscription_events($subscriptionid); @@ -3049,13 +3041,33 @@ function calendar_update_subscription_events($subscriptionid) { $ical = calendar_get_icalendar($sub->url); $return = calendar_import_icalendar_events($ical, $sub->courseid, $subscriptionid); $sub->lastupdated = time(); - $DB->update_record('event_subscriptions', $sub); - // Update the cache. - $cache = cache::make('core', 'calendar_subscriptions'); - $cache->set($subscriptionid, $sub); + calendar_update_subscription($sub); return $return; } +/** + * Update a calendar subscription. Also updates the associated cache. + * + * @param stdClass|array $subscription Subscription record. + * @throws coding_exception If something goes wrong + * @since Moodle 2.5 + */ +function calendar_update_subscription($subscription) { + global $DB; + + if (is_array($subscription)) { + $subscription = (object)$subscription; + } + if (empty($subscription->id) || !$DB->record_exists('event_subscriptions', array('id' => $subscription->id))) { + throw new coding_exception('Cannot update a subscription without a valid id'); + } + + $DB->update_record('event_subscriptions', $subscription); + // Update cache. + $cache = cache::make('core', 'calendar_subscriptions'); + $cache->set($subscription->id, $subscription); +} + /** * Checks to see if the user can edit a given subscription feed. * diff --git a/calendar/tests/calendarical_test.php b/calendar/tests/calendarical_test.php new file mode 100644 index 00000000000..7b4e1175fec --- /dev/null +++ b/calendar/tests/calendarical_test.php @@ -0,0 +1,77 @@ +. + +/** + * Calendar Ical unit tests + * + * @package core_calendar + * @copyright 2013 Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + + +/** + * Unit tests for ical APIs. + * + * @package core_calendar + * @copyright 2013 Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 2.5 + */ +class core_calendar_ical_testcase extends advanced_testcase { + + /** + * Tests set up + */ + protected function setUp() { + global $CFG; + require_once($CFG->dirroot . '/calendar/lib.php'); + } + + public function test_calendar_update_subscription() { + $this->resetAfterTest(true); + + $subscription = new stdClass(); + $subscription->eventtype = 'site'; + $subscription->name = 'test'; + $id = calendar_add_subscription($subscription); + + $subscription = new stdClass(); + $subscription->id = $id; + $subscription->name = 'awesome'; + calendar_update_subscription($subscription); + $sub = calendar_get_subscription($id); + $this->assertEquals($subscription->name, $sub->name); + + $subscription = new stdClass(); + $subscription->id = $id; + $subscription->name = 'awesome2'; + $subscription->pollinterval = 604800; + calendar_update_subscription($subscription); + $sub = calendar_get_subscription($id); + $this->assertEquals($subscription->name, $sub->name); + $this->assertEquals($subscription->pollinterval, $sub->pollinterval); + + $subscription = new stdClass(); + $subscription->name = 'awesome4'; + $this->setExpectedException('coding_exception'); + calendar_update_subscription($subscription); + } +} diff --git a/calendar/upgrade.txt b/calendar/upgrade.txt index 54262b0211e..72a666ae5b0 100644 --- a/calendar/upgrade.txt +++ b/calendar/upgrade.txt @@ -8,6 +8,9 @@ required changes in code: * calendar_update_subscription_events() now throws a dml_exception instead of moodle_exception for bad subscriptions * calendar_get_mini() function now has optional $placement and $courseid paramaters. +optional - no changes needed: +* calendar_update_subscription() should now be used to update Ical subscriptions. + === 2.4 === required changes in code: