From 3c50224079d07efc04d20423a8d9cc0029e0049b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20S=CC=8Ckoda?= Date: Wed, 15 Aug 2012 11:43:27 +0200 Subject: [PATCH] MDL-34864 add enrol_category unit tests for sync --- enrol/category/tests/sync_test.php | 365 +++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 enrol/category/tests/sync_test.php diff --git a/enrol/category/tests/sync_test.php b/enrol/category/tests/sync_test.php new file mode 100644 index 00000000000..36497647ce3 --- /dev/null +++ b/enrol/category/tests/sync_test.php @@ -0,0 +1,365 @@ +. + +/** + * Category enrolment sync functional test. + * + * @package enrol_category + * @category phpunit + * @copyright 2012 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot.'/enrol/category/locallib.php'); + +class enrol_category_testcase extends advanced_testcase { + + protected function enable_plugin() { + $enabled = enrol_get_plugins(true); + $enabled['category'] = true; + $enabled = array_keys($enabled); + set_config('enrol_plugins_enabled', implode(',', $enabled)); + } + + protected function disable_plugin() { + $enabled = enrol_get_plugins(true); + unset($enabled['category']); + $enabled = array_keys($enabled); + set_config('enrol_plugins_enabled', implode(',', $enabled)); + } + + protected function enable_role_sync($roleid) { + global $DB; + + $syscontext = context_system::instance(); + + if ($rc = $DB->record_exists('role_capabilities', array('capability'=>'enrol/category:synchronised', 'roleid'=>$roleid, 'contextid'=>$syscontext->id))) { + if ($rc->permission != CAP_ALLOW) { + $rc->permission = CAP_ALLOW; + $DB->update_record('role_capabilities', $rc); + } + } else { + $rc = new stdClass(); + $rc->capability = 'enrol/category:synchronised'; + $rc->roleid = $roleid; + $rc->contextid = $syscontext->id; + $rc->permission = CAP_ALLOW; + $rc->timemodified = time(); + $rc->modifierid = 0; + $DB->insert_record('role_capabilities', $rc); + } + } + + protected function disable_role_sync($roleid) { + global $DB; + + $syscontext = context_system::instance(); + + $DB->delete_records('role_capabilities', array('capability'=>'enrol/category:synchronised', 'roleid'=>$roleid, 'contextid'=>$syscontext->id)); + } + + /** + * Test utility methods used in syn test, fail here means something + * in core accesslib was changed, but it is possible that only this test + * is affected, nto the plugin itself... + */ + public function test_utils() { + global $DB; + + $this->resetAfterTest(); + + $syscontext = context_system::instance(); + + $this->assertFalse(enrol_is_enabled('category')); + $this->enable_plugin(); + $this->assertTrue(enrol_is_enabled('category')); + + $roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext); + $this->assertEmpty($roles); + + $studentrole = $DB->get_record('role', array('shortname'=>'student')); + $this->assertNotEmpty($studentrole); + + $this->enable_role_sync($studentrole->id); + $roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext); + $this->assertEquals(1, count($roles)); + $this->assertEquals($studentrole, reset($roles)); + + $this->disable_role_sync($studentrole->id); + $roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext); + $this->assertEmpty($roles); + } + + public function test_handler_sync() { + global $DB; + + $this->resetAfterTest(); + + // Setup a few courses and categories. + + $studentrole = $DB->get_record('role', array('shortname'=>'student')); + $this->assertNotEmpty($studentrole); + $teacherrole = $DB->get_record('role', array('shortname'=>'teacher')); + $this->assertNotEmpty($teacherrole); + $managerrole = $DB->get_record('role', array('shortname'=>'manager')); + $this->assertNotEmpty($managerrole); + + $cat1 = $this->getDataGenerator()->create_category(); + $cat2 = $this->getDataGenerator()->create_category(); + $cat3 = $this->getDataGenerator()->create_category(array('parent'=>$cat2->id)); + + $course1 = $this->getDataGenerator()->create_course(array('category'=>$cat1->id)); + $course2 = $this->getDataGenerator()->create_course(array('category'=>$cat2->id)); + $course3 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + $course4 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + + $user1 = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $user3 = $this->getDataGenerator()->create_user(); + $user4 = $this->getDataGenerator()->create_user(); + + $this->enable_role_sync($studentrole->id); + $this->enable_role_sync($teacherrole->id); + $this->enable_plugin(); + + $this->assertEquals(0, $DB->count_records('role_assignments', array())); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + + // Test assign event. + + role_assign($managerrole->id, $user1->id, context_coursecat::instance($cat1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course2->id)); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + + role_assign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)); + $this->assertTrue(is_enrolled(context_course::instance($course2->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course3->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course4->id), $user1->id)); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + role_assign($managerrole->id, $user2->id, context_coursecat::instance($cat3->id)); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + role_assign($teacherrole->id, $user4->id, context_coursecat::instance($cat1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user4->id)); + $this->assertEquals(4, $DB->count_records('user_enrolments', array())); + + // Test role unassigned event. + + role_unassign($teacherrole->id, $user4->id, context_coursecat::instance($cat1->id)->id); + $this->assertFalse(is_enrolled(context_course::instance($course1->id), $user4->id)); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + // Make sure handlers are disabled when plugin disabled. + + $this->disable_plugin(); + role_unassign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)->id); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + role_assign($studentrole->id, $user3->id, context_coursecat::instance($cat1->id)); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + } + + public function test_sync_course() { + global $DB; + + $this->resetAfterTest(); + + // Setup a few courses and categories. + + $studentrole = $DB->get_record('role', array('shortname'=>'student')); + $this->assertNotEmpty($studentrole); + $teacherrole = $DB->get_record('role', array('shortname'=>'teacher')); + $this->assertNotEmpty($teacherrole); + $managerrole = $DB->get_record('role', array('shortname'=>'manager')); + $this->assertNotEmpty($managerrole); + + $cat1 = $this->getDataGenerator()->create_category(); + $cat2 = $this->getDataGenerator()->create_category(); + $cat3 = $this->getDataGenerator()->create_category(array('parent'=>$cat2->id)); + + $course1 = $this->getDataGenerator()->create_course(array('category'=>$cat1->id)); + $course2 = $this->getDataGenerator()->create_course(array('category'=>$cat2->id)); + $course3 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + $course4 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + + $user1 = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $user3 = $this->getDataGenerator()->create_user(); + $user4 = $this->getDataGenerator()->create_user(); + + $this->enable_role_sync($studentrole->id); + $this->enable_role_sync($teacherrole->id); + $this->enable_plugin(); + + $this->assertEquals(0, $DB->count_records('role_assignments', array())); + role_assign($managerrole->id, $user1->id, context_coursecat::instance($cat1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course2->id)); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + + + $this->disable_plugin(); // Stops the event handlers. + role_assign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + $this->enable_plugin(); + enrol_category_sync_course($course2); + $this->assertTrue(is_enrolled(context_course::instance($course2->id), $user1->id)); + $this->assertFalse(is_enrolled(context_course::instance($course3->id), $user1->id)); + $this->assertFalse(is_enrolled(context_course::instance($course4->id), $user1->id)); + $this->assertEquals(1, $DB->count_records('user_enrolments', array())); + + enrol_category_sync_course($course2); + enrol_category_sync_course($course3); + enrol_category_sync_course($course4); + $this->assertFalse(is_enrolled(context_course::instance($course1->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course2->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course3->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course4->id), $user1->id)); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + + $this->disable_plugin(); // Stops the event handlers. + role_assign($studentrole->id, $user2->id, context_coursecat::instance($cat1->id)); + role_assign($teacherrole->id, $user4->id, context_coursecat::instance($cat1->id)); + role_unassign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)->id); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + $this->enable_plugin(); + enrol_category_sync_course($course2); + $this->assertFalse(is_enrolled(context_course::instance($course2->id), $user1->id)); + $this->assertFalse(is_enrolled(context_course::instance($course2->id), $user2->id)); + $this->assertFalse(is_enrolled(context_course::instance($course2->id), $user4->id)); + enrol_category_sync_course($course1); + enrol_category_sync_course($course3); + enrol_category_sync_course($course4); + $this->assertEquals(2, $DB->count_records('user_enrolments', array())); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user2->id)); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user4->id)); + + $this->disable_role_sync($studentrole->id); + enrol_category_sync_course($course1); + enrol_category_sync_course($course2); + enrol_category_sync_course($course3); + enrol_category_sync_course($course4); + $this->assertEquals(1, $DB->count_records('user_enrolments', array())); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user4->id)); + + $this->assertEquals(1, $DB->count_records('enrol', array('enrol'=>'category'))); + $this->disable_role_sync($teacherrole->id); + enrol_category_sync_course($course1); + enrol_category_sync_course($course2); + enrol_category_sync_course($course3); + enrol_category_sync_course($course4); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + $this->assertEquals(0, $DB->count_records('enrol', array('enrol'=>'category'))); + } + + public function test_sync_full() { + global $DB; + + $this->resetAfterTest(); + + // Setup a few courses and categories. + + $studentrole = $DB->get_record('role', array('shortname'=>'student')); + $this->assertNotEmpty($studentrole); + $teacherrole = $DB->get_record('role', array('shortname'=>'teacher')); + $this->assertNotEmpty($teacherrole); + $managerrole = $DB->get_record('role', array('shortname'=>'manager')); + $this->assertNotEmpty($managerrole); + + $cat1 = $this->getDataGenerator()->create_category(); + $cat2 = $this->getDataGenerator()->create_category(); + $cat3 = $this->getDataGenerator()->create_category(array('parent'=>$cat2->id)); + + $course1 = $this->getDataGenerator()->create_course(array('category'=>$cat1->id)); + $course2 = $this->getDataGenerator()->create_course(array('category'=>$cat2->id)); + $course3 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + $course4 = $this->getDataGenerator()->create_course(array('category'=>$cat3->id)); + + $user1 = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $user3 = $this->getDataGenerator()->create_user(); + $user4 = $this->getDataGenerator()->create_user(); + + $this->enable_role_sync($studentrole->id); + $this->enable_role_sync($teacherrole->id); + $this->enable_plugin(); + + $this->assertEquals(0, $DB->count_records('role_assignments', array())); + role_assign($managerrole->id, $user1->id, context_coursecat::instance($cat1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course1->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course2->id)); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + + $result = enrol_category_sync_full(); + $this->assertSame(0, $result); + + $this->disable_plugin(); + role_assign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)); + $this->enable_plugin(); + $result = enrol_category_sync_full(); + $this->assertSame(0, $result); + $this->assertEquals(3, $DB->count_records('user_enrolments', array())); + $this->assertTrue(is_enrolled(context_course::instance($course2->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course3->id), $user1->id)); + $this->assertTrue(is_enrolled(context_course::instance($course4->id), $user1->id)); + + $this->disable_plugin(); + role_unassign($studentrole->id, $user1->id, context_coursecat::instance($cat2->id)->id); + role_assign($studentrole->id, $user2->id, context_coursecat::instance($cat1->id)); + role_assign($teacherrole->id, $user4->id, context_coursecat::instance($cat1->id)); + role_assign($teacherrole->id, $user3->id, context_coursecat::instance($cat2->id)); + role_assign($managerrole->id, $user3->id, context_course::instance($course3->id)); + $this->enable_plugin(); + $result = enrol_category_sync_full(); + $this->assertSame(0, $result); + $this->assertEquals(5, $DB->count_records('user_enrolments', array())); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user2->id)); + $this->assertTrue(is_enrolled(context_course::instance($course1->id), $user4->id)); + $this->assertTrue(is_enrolled(context_course::instance($course2->id), $user3->id)); + $this->assertTrue(is_enrolled(context_course::instance($course3->id), $user3->id)); + $this->assertTrue(is_enrolled(context_course::instance($course4->id), $user3->id)); + + // Cleanup everything. + + $this->assertNotEmpty($DB->count_records('role_assignments', array())); + $this->assertNotEmpty($DB->count_records('user_enrolments', array())); + + $this->disable_plugin(); + role_unassign_all(array('roleid'=>$studentrole->id)); + role_unassign_all(array('roleid'=>$managerrole->id)); + role_unassign_all(array('roleid'=>$teacherrole->id)); + + $result = enrol_category_sync_full(); + $this->assertSame(2, $result); + $this->assertEquals(0, $DB->count_records('role_assignments', array())); + $this->assertNotEmpty($DB->count_records('user_enrolments', array())); + $this->disable_role_sync($studentrole->id); + $this->disable_role_sync($teacherrole->id); + + $this->enable_plugin(); + $result = enrol_category_sync_full(); + $this->assertSame(0, $result); + $this->assertEquals(0, $DB->count_records('role_assignments', array())); + $this->assertEquals(0, $DB->count_records('user_enrolments', array())); + $this->assertEquals(0, $DB->count_records('enrol', array('enrol'=>'category'))); + } +} -- 2.43.0