MDL-39846 require context when creating events

No more guessing or falling back to system context.
This commit is contained in:
Petr Škoda
2013-07-19 08:43:29 +02:00
parent 62401e8fd5
commit 27af3e625c
2 changed files with 49 additions and 29 deletions
+23 -16
View File
@@ -143,32 +143,39 @@ abstract class base {
$event->data['other'] = isset($data['other']) ? $data['other'] : null;
$event->data['relateduserid'] = isset($data['relateduserid']) ? $data['relateduserid'] : null;
$event->context = null;
if (isset($data['context'])) {
if (!empty($data['context'])) {
$event->context = $data['context'];
} else if (isset($data['contextid'])) {
$event->context = \context::instance_by_id($data['contextid']);
} else if ($event->data['courseid']) {
$event->context = \context_course::instance($event->data['courseid']);
} else if (isset($PAGE)) {
$event->context = $PAGE->context;
$event->data['contextid'] = $event->context->id;
$event->data['contextlevel'] = $event->context->contextlevel;
$event->data['contextinstanceid'] = $event->context->instanceid;
} else if (!empty($data['contextid'])) {
$event->context = null;
if (isset($data['contextlevel']) and isset($data['contextinstanceid'])) {
// Useful especially when deleting contexts because we can nto fetch it from DB anymore.
$event->data['contextid'] = $data['contextid'];
$event->data['contextlevel'] = $data['contextlevel'];
$event->data['contextinstanceid'] = $data['contextinstanceid'];
$event->context = \context::instance_by_id($data['contextid'], IGNORE_MISSING);
} else {
$event->context = \context::instance_by_id($data['contextid'], MUST_EXIST);
$event->data['contextid'] = $event->context->id;
$event->data['contextlevel'] = $event->context->contextlevel;
$event->data['contextinstanceid'] = $event->context->instanceid;
}
} else {
throw new \coding_exception('context (or contextid) is a required event property.');
}
if (!$event->context) {
$event->context = \context_system::instance();
}
$event->data['contextid'] = $event->context->id;
$event->data['contextlevel'] = $event->context->contextlevel;
$event->data['contextinstanceid'] = $event->context->instanceid;
if (!isset($event->data['courseid'])) {
if ($coursecontext = $event->context->get_course_context(false)) {
if ($event->context and $coursecontext = $event->context->get_course_context(false)) {
$event->data['courseid'] = $coursecontext->id;
} else {
$event->data['courseid'] = 0;
}
}
if (!array_key_exists('relateduserid', $data) and $event->context->contextlevel == CONTEXT_USER) {
if (!array_key_exists('relateduserid', $data) and $event->context and $event->context->contextlevel == CONTEXT_USER) {
$event->data['relateduserid'] = $event->context->instanceid;
}
+26 -13
View File
@@ -73,6 +73,12 @@ class core_event_testcase extends advanced_testcase {
} catch (\moodle_exception $e) {
$this->assertInstanceOf('coding_exception', $e);
}
$event2 = \core_tests\event\unittest_executed::create(array('courseid'=>1, 'contextid'=>$system->id, 'objectid'=>5, 'other'=>array('sample'=>null, 'xx'=>10)));
$this->assertSame($event->get_context(), $event2->get_context());
$event3 = \core_tests\event\unittest_executed::create(array('courseid'=>1, 'contextid'=>999, 'contextlevel'=>CONTEXT_COURSE, 'contextinstanceid'=>4554645, 'objectid'=>5, 'other'=>array('sample'=>null, 'xx'=>10)));
$this->assertSame(false, $event3->get_context());
}
public function test_observers_parsing() {
@@ -539,7 +545,14 @@ class core_event_testcase extends advanced_testcase {
}
public function test_bad_events() {
$event = \core_tests\event\bad_event1::create();
try {
$event = \core_tests\event\unittest_executed::create(array('courseid'=>1, 'other'=>array('sample'=>5, 'xx'=>10)));
$this->fail('Exception expected when context and contextid missing');
} catch (Exception $e) {
$this->assertInstanceOf('coding_exception', $e);
}
$event = \core_tests\event\bad_event1::create(array('context'=>\context_system::instance()));
try {
$event->trigger();
$this->fail('Exception expected when $data not valid');
@@ -547,7 +560,7 @@ class core_event_testcase extends advanced_testcase {
$this->assertInstanceOf('\coding_exception', $e);
}
$event = \core_tests\event\bad_event2::create();
$event = \core_tests\event\bad_event2::create(array('context'=>\context_system::instance()));
try {
$event->trigger();
$this->fail('Exception expected when $data not valid');
@@ -555,23 +568,23 @@ class core_event_testcase extends advanced_testcase {
$this->assertInstanceOf('\coding_exception', $e);
}
$event = \core_tests\event\bad_event3::create();
$event = \core_tests\event\bad_event3::create(array('context'=>\context_system::instance()));
@$event->trigger();
$this->assertDebuggingCalled();
$event = \core_tests\event\bad_event4::create();
$event = \core_tests\event\bad_event4::create(array('context'=>\context_system::instance()));
@$event->trigger();
$this->assertDebuggingCalled();
$event = \core_tests\event\bad_event5::create();
$event = \core_tests\event\bad_event5::create(array('context'=>\context_system::instance()));
@$event->trigger();
$this->assertDebuggingCalled();
$event = \core_tests\event\bad_event6::create();
$event = \core_tests\event\bad_event6::create(array('context'=>\context_system::instance()));
$event->trigger();
$this->assertDebuggingCalled();
$event = \core_tests\event\bad_event7::create(array('objectid'=>1));
$event = \core_tests\event\bad_event7::create(array('objectid'=>1, 'context'=>\context_system::instance()));
try {
$event->trigger();
$this->fail('Exception expected when $data contains objectid by objecttable not specified');
@@ -582,30 +595,30 @@ class core_event_testcase extends advanced_testcase {
public function test_problematic_events() {
global $CFG;
$event1 = \core_tests\event\problematic_event1::create();
$event1 = \core_tests\event\problematic_event1::create(array('context'=>\context_system::instance()));
$this->assertDebuggingNotCalled();
$this->assertNull($event1->xxx);
$this->assertDebuggingCalled();
$event2 = \core_tests\event\problematic_event1::create(array('xxx'=>0));
$event2 = \core_tests\event\problematic_event1::create(array('xxx'=>0, 'context'=>\context_system::instance()));
$this->assertDebuggingCalled();
$CFG->debug = 0;
$event3 = \core_tests\event\problematic_event1::create(array('xxx'=>0));
$event3 = \core_tests\event\problematic_event1::create(array('xxx'=>0, 'context'=>\context_system::instance()));
$this->assertDebuggingNotCalled();
$CFG->debug = E_ALL | E_STRICT;
$event4 = \core_tests\event\problematic_event1::create(array('other'=>array('a'=>1)));
$event4 = \core_tests\event\problematic_event1::create(array('context'=>\context_system::instance(), 'other'=>array('a'=>1)));
$event4->trigger();
$this->assertDebuggingNotCalled();
$event5 = \core_tests\event\problematic_event1::create(array('other'=>(object)array('a'=>1)));
$event5 = \core_tests\event\problematic_event1::create(array('context'=>\context_system::instance(), 'other'=>(object)array('a'=>1)));
$this->assertDebuggingNotCalled();
$event5->trigger();
$this->assertDebuggingCalled();
$url = new moodle_url('/admin/');
$event6 = \core_tests\event\problematic_event1::create(array('other'=>array('a'=>$url)));
$event6 = \core_tests\event\problematic_event1::create(array('context'=>\context_system::instance(), 'other'=>array('a'=>$url)));
$this->assertDebuggingNotCalled();
$event6->trigger();
$this->assertDebuggingCalled();