From 7bdbb4dc2d0c9dd27131d099278cd142f0b08d52 Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Mon, 30 Jun 2014 12:08:45 +0800 Subject: [PATCH] MDL-45758 tool_monitor: Rule manager class and data generators This issue introduces rule manager class, data generators and unit tests associated with them. Original issue - MDL-45918 --- admin/tool/monitor/classes/rule_manager.php | 134 +++++++++++++ admin/tool/monitor/tests/generator/lib.php | 188 ++++++++++++++++++ admin/tool/monitor/tests/generator_test.php | 135 +++++++++++++ .../tool/monitor/tests/rule_manager_test.php | 134 +++++++++++++ 4 files changed, 591 insertions(+) create mode 100644 admin/tool/monitor/classes/rule_manager.php create mode 100644 admin/tool/monitor/tests/generator/lib.php create mode 100644 admin/tool/monitor/tests/generator_test.php create mode 100644 admin/tool/monitor/tests/rule_manager_test.php diff --git a/admin/tool/monitor/classes/rule_manager.php b/admin/tool/monitor/classes/rule_manager.php new file mode 100644 index 00000000000..71386238a6a --- /dev/null +++ b/admin/tool/monitor/classes/rule_manager.php @@ -0,0 +1,134 @@ +. + +/** + * Rule manager class. + * + * @package tool_monitor + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace tool_monitor; + +defined('MOODLE_INTERNAL') || die(); + +class rule_manager { + + /** + * Create a new rule. + * + * @param \stdClass $ruledata data to insert as new rule entry. + * @return \tool_monitor\rule object with rule id. + */ + public static function add_rule($ruledata) { + global $DB, $USER; + $now = time(); + $rule = new \stdClass(); + $rule->userid = empty($ruledata->userid) ? $USER->id : $ruledata->userid; + $rule->courseid = $ruledata->courseid; + $rule->name = $ruledata->name; + $rule->plugin = $ruledata->plugin; + $rule->eventname = $ruledata->eventname; + $rule->description = $ruledata->description; + $rule->frequency = (int)$ruledata->frequency; + $rule->message_template = $ruledata->message_template; + $rule->timewindow = $now; + $rule->timecreated = $now; + $rule->timemodified = $now; + $ruleid = $DB->insert_record('tool_monitor_rules', $rule, true); + + return new rule($ruleid); + } + + /** + * Delete a rule and subscriptions by rule id. + * + * @param int $ruleid id of rule to be deleted. + * @return bool + */ + public static function delete_rule($ruleid) { + global $DB; + + subscription_manager::remove_all_subscriptions_for_rule($ruleid); + return $DB->delete_records('tool_monitor_rules', array('id' => $ruleid)); + } + + /** + * Get a rule object by id. + * + * @param \stdClass|int $ruleorid A rule object from database or rule id. + * @return \tool_monitor\rule object with rule id. + */ + public static function get_rule($ruleorid) { + global $DB; + if (!is_object($ruleorid)) { + $rule = $DB->get_record('tool_monitor_rules', array('id' => $ruleorid), '*', MUST_EXIST); + } else { + $rule = $ruleorid; + } + + return new rule($rule); + } + + /** + * Update rule data. + * + * @throws coding_exception if $record->ruleid is invalid. + * @param object $params rule data to be updated. + * @return bool + */ + public static function update_rule($params) { + global $DB; + if (!self::get_rule($params->id)) { + throw new coding_exception('Invalid rule ID.'); + } + $params->timemodified = time(); + return $DB->update_record('tool_monitor_rules', $params, false); + } + + /** + * Get rules by course id. + * + * @param int $courseid course id of the rule. + * @return array rule data. + */ + public static function get_rules_by_courseid($courseid) { + global $DB; + return $DB->get_records('tool_monitor_rules', array('courseid' => $courseid)); + } + + /** + * Get rules by plugin name. + * + * @param string $plugin plugin name of the rule. + * @return array rule data. + */ + public static function get_rules_by_plugin($plugin) { + global $DB; + return $DB->get_records('tool_monitor_rules', array('plugin' => $plugin)); + } + + /** + * Get rules by event name. + * + * @param string $eventname event name of the rule. + * @return array rule data. + */ + public static function get_rules_by_event($eventname) { + global $DB; + return $DB->get_records('tool_monitor_rules', array('eventname' => $eventname)); + } +} \ No newline at end of file diff --git a/admin/tool/monitor/tests/generator/lib.php b/admin/tool/monitor/tests/generator/lib.php new file mode 100644 index 00000000000..174d6938505 --- /dev/null +++ b/admin/tool/monitor/tests/generator/lib.php @@ -0,0 +1,188 @@ +. + +/** + * Event monitor data generator + * + * @package tool_monitor + * @category test + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Event monitor data generator class + * + * @since Moodle 2.8 + * @package tool_monitor + * @category test + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class tool_monitor_generator extends testing_module_generator { + + /** + * @var int keep track of how many rules have been created. + */ + protected $rulecount; + + /** + * Function to generate rule data. + * + * @param \stdClass|array $record data to insert as rule entry. + * @return \tool_monitor\rule object. + */ + public function create_rule($record = null) { + global $USER; + + $this->rulecount++; + $i = $this->rulecount; + $now = time(); + $record = (object)(array)$record; + + if (!isset($record->userid)) { + $record->userid = $USER->id; + } + if (!isset($record->courseid)) { + $record->courseid = 0; + } + if (!isset($record->name)) { + $record->name = 'Test rule ' . $i; + } + if (!isset($record->description)) { + $record->description = 'Rule description ' . $i; + } + if (!isset($record->frequency)) { + $record->frequency = 5; + } + if (!isset($record->minutes)) { + $record->minutes = 5; + } + if (!isset($record->message_template)) { + $record->message_template = 'Rule message template ' . $i; + } + if (!isset($record->timewindow)) { + $record->timewindow = $record->minutes * 60; + } + if (!isset($record->timecreated)) { + $record->timecreated = $now; + } + if (!isset($record->timemodified)) { + $record->timemodified = $now; + } + if (!isset($record->plugin)) { + $record->plugin = 'core'; + } + if (!isset($record->eventname)) { + $record->eventname = '\core\event\blog_entry_created'; + } + + return \tool_monitor\rule_manager::add_rule($record); + } + + /** + * Function to generate subscription data. + * + * @throws coding_exception if $record->ruleid or $record->userid not present. + * @param \stdClass|array $record data to insert as subscription entry. + * @return int subscription ID. + */ + public function create_subscription($record = null) { + + if (!isset($record->timecreated)) { + $record->timecreated = time(); + } + if (!isset($record->courseid)) { + $record->courseid = 0; + } + if (!isset($record->ruleid)) { + throw new coding_exception('$record->ruleid must be present in tool_monitor_generator::create_subscription()'); + } + if (!isset($record->cmid)) { + $record->cmid = 0; + } + if (!isset($record->userid)) { + throw new coding_exception('$record->userid must be present in tool_monitor_generator::create_subscription()'); + } + + return \tool_monitor\subscription_manager::create_subscription($record->ruleid, $record->courseid, + $record->cmid, $record->userid); + } + + /** + * Function to generate event entries. + * + * @param \stdClass|array $record data to insert as event entry. + * @return \stdClass $record object with event id. + */ + public function create_event_entries($record = null) { + global $DB, $CFG; + + $record = (object)(array)$record; + $context = \context_system::instance(); + + if (!isset($record->eventname)) { + $record->eventname = '\core\event\user_loggedin'; + } + if (!isset($record->contextid)) { + $record->contextid = $context->id; + } + if (!isset($record->contextlevel)) { + $record->contextlevel = $context->contextlevel; + } + if (!isset($record->contextinstanceid)) { + $record->contextinstanceid = $context->instanceid; + } + if (!isset($record->link)) { + $record->link = $CFG->wwwroot . '/user/profile.php'; + } + if (!isset($record->courseid)) { + $record->courseid = 0; + } + if (!isset($record->timecreated)) { + $record->timecreated = time(); + } + $record->id = $DB->insert_record('tool_monitor_events', $record, true); + + return $record; + } + + /** + * Function to generate history data. + * + * @throws coding_exception if $record->sid or $record->userid not present. + * @param \stdClass $record data to insert as history entry. + * @return \stdClass $record object with history id. + */ + public function create_history($record = null) { + global $DB; + + if (!isset($record->sid)) { + throw new coding_exception('subscription ID must be present in tool_monitor_generator::create_history() $record'); + } + if (!isset($record->userid)) { + throw new coding_exception('user ID must be present in tool_monitor_generator::create_history() $record'); + } + if (!isset($record->timesent)) { + $record->timesent = time(); + } + $record->id = $DB->insert_record('tool_monitor_history', $record, true); + + return $record; + } +} diff --git a/admin/tool/monitor/tests/generator_test.php b/admin/tool/monitor/tests/generator_test.php new file mode 100644 index 00000000000..18ebb9a018d --- /dev/null +++ b/admin/tool/monitor/tests/generator_test.php @@ -0,0 +1,135 @@ +. + +/** + * PHPUnit data generator tests. + * + * @package tool_monitor + * @category phpunit + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + + +/** + * PHPUnit data generator test case. + * + * @since Moodle 2.8 + * @package tool_monitor + * @category phpunit + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class tool_monitor_generator_testcase extends advanced_testcase { + + /** + * Test create_rule data generator. + */ + public function test_create_rule() { + $this->setAdminUser(); + $this->resetAfterTest(true); + $course = $this->getDataGenerator()->create_course(); + $user = $this->getDataGenerator()->create_user(); + + $rulegenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + + $record = new stdClass(); + $record->courseid = $course->id; + $record->userid = $user->id; + + $rule = $rulegenerator->create_rule($record); + $this->assertInstanceOf('tool_monitor\rule', $rule); + $this->assertEquals($rule->userid, $record->userid); + $this->assertEquals($rule->courseid, $record->courseid); + } + + /** + * Test create_subscription data generator. + */ + public function test_create_subscription() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + + $record = new stdClass(); + $record->courseid = $course->id; + $record->userid = $user->id; + $record->ruleid = $rule->id; + + $sid = $monitorgenerator->create_subscription($record); + $subscription = \tool_monitor\subscription_manager::get_subscription($sid); + $this->assertEquals($record->courseid, $subscription->courseid); + $this->assertEquals($record->ruleid, $subscription->ruleid); + $this->assertEquals($record->userid, $subscription->userid); + $this->assertEquals(0, $subscription->cmid); + } + + /** + * Test create_event data generator. + */ + public function test_create_event_entries() { + $this->setAdminUser(); + $this->resetAfterTest(true); + $record = new \stdClass(); + $context = \context_system::instance(); + + // Default data generator values. + $record->eventname = '\core\event\user_loggedin'; + $record->contextid = $context->id; + $record->contextlevel = $context->contextlevel; + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + + // First create and assertdata using default values. + $eventdata = $monitorgenerator->create_event_entries(); + $this->assertEquals($record->eventname, $eventdata->eventname); + $this->assertEquals($record->contextid, $eventdata->contextid); + $this->assertEquals($record->contextlevel, $eventdata->contextlevel); + } + + /** + * Test create_history data generator. + */ + public function test_create_history() { + $this->setAdminUser(); + $this->resetAfterTest(true); + $user = $this->getDataGenerator()->create_user(); + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + + $record = new \stdClass(); + $record->userid = $user->id; + $record->ruleid = $rule->id; + $sid = $monitorgenerator->create_subscription($record); + \tool_monitor\subscription_manager::get_subscription($sid); + $record->sid = $sid; + $historydata = $monitorgenerator->create_history($record); + $this->assertEquals($record->userid, $historydata->userid); + $this->assertEquals($record->sid, $historydata->sid); + + // Test using default values. + $record->userid = 1; + $record->sid = 1; + $historydata = $monitorgenerator->create_history($record); + $this->assertEquals(1, $historydata->userid); + $this->assertEquals(1, $historydata->sid); + } +} \ No newline at end of file diff --git a/admin/tool/monitor/tests/rule_manager_test.php b/admin/tool/monitor/tests/rule_manager_test.php new file mode 100644 index 00000000000..b75d17e916b --- /dev/null +++ b/admin/tool/monitor/tests/rule_manager_test.php @@ -0,0 +1,134 @@ +. + +/** + * Unit tests for rule manager api. + * + * @package tool_monitor + * @category phpunit + * @copyright 2014 onwards Simey Lameze + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +class rule_manager_testcase extends advanced_testcase { + + /** + * Test add_rule method. + */ + public function test_add_rule() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $user = $this->getDataGenerator()->create_user(); + $course = $this->getDataGenerator()->create_course(); + $now = time(); + + $rule = new \stdClass(); + $rule->userid = $user->id; + $rule->courseid = $course->id; + $rule->name = 'test rule 1'; + $rule->plugin = 'core'; + $rule->eventname = '\core\event\course_updated'; + $rule->description = 'test description 1'; + $rule->frequency = 15; + $rule->message_template = 'test template message'; + $rule->timewindow = null; + $rule->timecreated = $now; + $rule->timemodified = $now; + + $ruledata = \tool_monitor\rule_manager::add_rule($rule); + + $this->assertEquals($rule->eventname, $ruledata->eventname); + $this->assertEquals($rule->userid, $ruledata->userid); + $this->assertEquals($rule->courseid, $ruledata->courseid); + + } + + /** + * Test get_rule method. + */ + public function test_get_rule() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + $rules1 = \tool_monitor\rule_manager::get_rule($rule->id); + $this->assertInstanceOf('tool_monitor\rule', $rules1); + } + + /** + * Test update_rule method. + */ + public function test_update_rule() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + + $ruledata = new stdClass; + $ruledata->id = $rule->id; + $ruledata->frequency = 25; + + \tool_monitor\rule_manager::update_rule($ruledata); + $this->assertNotEquals($ruledata->frequency, $rule->frequency); + + } + + /** + * Test get_rules_by_courseid method. + */ + public function test_get_rules_by_courseid() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + $ruledata = \tool_monitor\rule_manager::get_rules_by_courseid($rule->courseid); + $this->assertEquals($rule->courseid, 0); + } + + /** + * Test get_rules_by_plugin method. + */ + public function test_get_rules_by_plugin() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + $rules1 = \tool_monitor\rule_manager::get_rules_by_plugin($rule->plugin); + $this->assertEquals(1, count($rules1)); + } + + /** + * Test get_rules_by_event method. + */ + public function test_get_rules_by_event() { + $this->setAdminUser(); + $this->resetAfterTest(true); + + $monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor'); + $rule = $monitorgenerator->create_rule(); + $rules1 = \tool_monitor\rule_manager::get_rules_by_event($rule->eventname); + $this->assertEquals(1, count($rules1)); + } +} \ No newline at end of file