diff --git a/mod/scorm/tests/event_test.php b/mod/scorm/tests/event_test.php new file mode 100644 index 00000000000..2211d4f6de2 --- /dev/null +++ b/mod/scorm/tests/event_test.php @@ -0,0 +1,386 @@ +. + +/** + * This file contains tests for scorm events. + * + * @package mod_scorm + * @copyright 2013 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +global $CFG; +require_once($CFG->dirroot . '/mod/scorm/locallib.php'); +require_once($CFG->dirroot . '/mod/scorm/lib.php'); + +/** + * Test class for various events related to Scorm. + * + * @package mod_scorm + * @copyright 2013 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_scorm_event_testcase extends advanced_testcase { + + /** @var stdClass store course object */ + protected $eventcourse; + + /** @var stdClass store user object */ + protected $eventuser; + + /** @var stdClass store scorm object */ + protected $eventscorm; + + /** @var stdClass store course module object */ + protected $eventcm; + + protected function setUp() { + $this->setAdminUser(); + $this->eventcourse = $this->getDataGenerator()->create_course(); + $this->eventuser = $this->getDataGenerator()->create_user(); + $record = new stdClass(); + $record->course = $this->eventcourse->id; + $this->eventscorm = $this->getDataGenerator()->create_module('scorm', $record); + $this->eventcm = get_coursemodule_from_instance('scorm', $this->eventscorm->id); + } + + /** Tests for attempt deleted event */ + public function test_attempt_deleted_event() { + + global $USER; + + $this->resetAfterTest(); + scorm_insert_track(2, $this->eventscorm->id, 1, 4, 'cmi.core.score.raw', 10); + $sink = $this->redirectEvents(); + scorm_delete_attempt(2, $this->eventscorm, 4); + $events = $sink->get_events(); + $sink->close(); + $event = reset($events); + + // Verify data. + $this->assertCount(1, $events); + $this->assertInstanceOf('\mod_scorm\event\attempt_deleted', $event); + $this->assertEquals($USER->id, $event->userid); + $this->assertEquals(context_module::instance($this->eventscorm->id), $event->get_context()); + $this->assertEquals(4, $event->other['attemptid']); + $this->assertEquals(2, $event->relateduserid); + $expected = array($this->eventcourse->id, 'scorm', 'delete attempts', 'report.php?id=' . $this->eventcm->id, + 4, $this->eventscorm->id); + $this->assertEventLegacyLogData($expected, $events[0]); + + // Test event validations. + $this->setExpectedException('coding_exception'); + \mod_scorm\event\attempt_deleted::create(array( + 'contextid' => 5, + 'relateduserid' => 2 + )); + $this->fail('event \\mod_scorm\\event\\attempt_deleted is not validating events properly'); + } + + /** + * Tests for course module viewed event. + * + * There is no api involved so the best we can do is test legacy data by triggering event manually. + */ + public function test_course_module_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\course_module_viewed::create(array( + 'objectid' => $this->eventscorm->id, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'pre-view', 'view.php?id=' . $this->eventcm->id, + $this->eventscorm->id, $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + } + + /** + * Tests for instance list viewed event. + * + * There is no api involved so the best we can do is test legacy data by triggering event manually. + */ + public function test_course_module_instance_list_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\course_module_instance_list_viewed::create(array( + 'context' => context_course::instance($this->eventcourse->id), + 'courseid' => $this->eventcourse->id + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'view all', 'index.php?id=' . $this->eventcourse->id, ''); + $this->assertEventLegacyLogData($expected, $event); + } + + /** + * Tests for interactions viewed. + * + * There is no api involved so the best we can do is test legacy data by triggering event manually and test validations. + */ + public function test_interactions_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\interactions_viewed::create(array( + 'relateduserid' => 5, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2, 'instanceid' => $this->eventscorm->id) + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'userreportinteractions', 'report/userreportinteractions.php?id=' . + $this->eventcm->id . '&user=5&attempt=' . 2, $this->eventscorm->id, $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + } + + /** + * Tests for interactions viewed validations. + */ + public function test_interactions_viewed_event_validations() { + $this->resetAfterTest(); + try { + \mod_scorm\event\interactions_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\interactions_viewed to be triggered without + other['instanceid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + try { + \mod_scorm\event\interactions_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('instanceid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\interactions_viewed to be triggered without + other['attemptid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + } + + /** Tests for report viewed. + * + * There is no api involved so the best we can do is test legacy data and validations by triggering event manually. + */ + public function test_report_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\report_viewed::create(array( + 'objectid' => $this->eventscorm->id, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('mode' => 'basic') + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'report', 'report.php?id=' . $this->eventcm->id . '&mode=basic', + $this->eventscorm->id, $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + + // Test validations. + $this->setExpectedException('coding_exception'); + \mod_scorm\event\report_viewed::create(array( + 'objectid' => $this->eventscorm->id, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id + )); + $this->fail('Event \\mod_scorm\\event\\report_viewed is not validating "mode" properly'); + } + + /** Tests for sco launched event. + * + * There is no api involved so the best we can do is test legacy data and validations by triggering event manually. + */ + public function test_sco_launched_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\sco_launched::create(array( + 'objectid' => 2, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('loadedcontent' => 'url_to_content_that_was_laoded.php') + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'launch', 'view.php?id=' . $this->eventcm->id, + 'url_to_content_that_was_laoded.php', $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + + // Test validations. + $this->setExpectedException('coding_exception'); + \mod_scorm\event\sco_launched::create(array( + 'objectid' => $this->eventscorm->id, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + )); + $this->fail('Event \\mod_scorm\\event\\sco_launched is not validating "loadedcontent" properly'); + } + + /** + * Tests for tracks viewed event. + * + * There is no api involved so the best we can do is test validations by triggering event manually. + */ + public function test_tracks_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\tracks_viewed::create(array( + 'relateduserid' => 5, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2, 'instanceid' => $this->eventscorm->id, 'scoid' => 3) + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'userreporttracks', 'report/userreporttracks.php?id=' . + $this->eventcm->id . '&user=5&attempt=' . 2 . '&scoid=3', $this->eventscorm->id, $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + } + + /** + * Tests for tracks viewed event validations. + */ + public function test_tracks_viewed_event_validations() { + $this->resetAfterTest(); + try { + \mod_scorm\event\tracks_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2, 'scoid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\tracks_viewed to be triggered without + other['instanceid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + try { + \mod_scorm\event\tracks_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('instanceid' => 2, 'scoid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\tracks_viewed to be triggered without + other['attemptid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + + try { + \mod_scorm\event\tracks_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2, 'instanceid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\tracks_viewed to be triggered without + other['scoid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + } + + /** + * Tests for userreport viewed event. + * + * There is no api involved so the best we can do is test validations and legacy log by triggering event manually. + */ + public function test_user_report_viewed_event() { + $this->resetAfterTest(); + $event = \mod_scorm\event\user_report_viewed::create(array( + 'relateduserid' => 5, + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2, 'instanceid' => $this->eventscorm->id) + )); + + // Trigger and capture the event. + $sink = $this->redirectEvents(); + $event->trigger(); + $events = $sink->get_events(); + $event = reset($events); + + // Check that the legacy log data is valid. + $expected = array($this->eventcourse->id, 'scorm', 'userreport', 'report/userreport.php?id=' . + $this->eventcm->id . '&user=5&attempt=' . 2, $this->eventscorm->id, $this->eventcm->id); + $this->assertEventLegacyLogData($expected, $event); + } + + /** + * Tests for userreport viewed event validations. + */ + public function test_user_report_viewed_event_validations() { + $this->resetAfterTest(); + try { + \mod_scorm\event\user_report_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('attemptid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\user_report_viewed to be triggered without + other['instanceid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + try { + \mod_scorm\event\user_report_viewed::create(array( + 'context' => context_module::instance($this->eventcm->id), + 'courseid' => $this->eventcourse->id, + 'other' => array('instanceid' => 2) + )); + $this->fail("Event validation should not allow \\mod_scorm\\event\\user_report_viewed to be triggered without + other['attemptid']"); + } catch (Exception $e) { + $this->assertInstanceOf('coding_exception', $e); + } + } +} +