. /** * IMS Enterprise enrolment tests. * * @package enrol_imsenterprise * @category test * @copyright 2012 David MonllaĆ³ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->dirroot . '/enrol/imsenterprise/locallib.php'); require_once($CFG->dirroot . '/enrol/imsenterprise/lib.php'); /** * IMS Enterprise test case * * @package enrol_imsenterprise * @category test * @copyright 2012 David MonllaĆ³ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class enrol_imsenterprise_testcase extends advanced_testcase { /** * @var $imsplugin enrol_imsenterprise_plugin IMS plugin instance. */ public $imsplugin; /** * Setup required for all tests. */ protected function setUp() { $this->resetAfterTest(true); $this->imsplugin = enrol_get_plugin('imsenterprise'); $this->set_test_config(); } /** * With an empty IMS enterprise file */ public function test_emptyfile() { global $DB; $prevncourses = $DB->count_records('course'); $prevnusers = $DB->count_records('user'); $this->set_xml_file(false, false); $this->imsplugin->cron(); $this->assertEquals($prevncourses, $DB->count_records('course')); $this->assertEquals($prevnusers, $DB->count_records('user')); } /** * Existing users are not created again */ public function test_users_existing() { global $DB; $user1 = $this->getDataGenerator()->create_user(); $user2 = $this->getDataGenerator()->create_user(); $prevnusers = $DB->count_records('user'); $users = array($user1, $user2); $this->set_xml_file($users); $this->imsplugin->cron(); $this->assertEquals($prevnusers, $DB->count_records('user')); } /** * Add new users */ public function test_users_add() { global $DB; $prevnusers = $DB->count_records('user'); $user1 = new StdClass(); $user1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $user1->username = 'u1'; $user1->email = 'u1@example.com'; $user1->firstname = 'U'; $user1->lastname = '1'; $users = array($user1); $this->set_xml_file($users); $this->imsplugin->cron(); $this->assertEquals(($prevnusers + 1), $DB->count_records('user')); } /** * Add new users and set an auth type */ public function test_users_add_with_auth() { global $DB; $prevnusers = $DB->count_records('user'); $user2 = new StdClass(); $user2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $user2->username = 'u2'; $user2->auth = 'cas'; $user2->email = 'u2@u2.org'; $user2->firstname = 'U'; $user2->lastname = '2'; $users = array($user2); $this->set_xml_file($users); $this->imsplugin->cron(); $dbuser = $DB->get_record('user', array('username' => $user2->username)); // TODO: MDL-15863 this needs more work due to multiauth changes, use first auth for now. $dbauth = explode(',', $dbuser->auth); $dbauth = reset($dbauth); $this->assertEquals(($prevnusers + 1), $DB->count_records('user')); $this->assertEquals($dbauth, $user2->auth); } /** * Update user */ public function test_user_update() { global $DB; $user = $this->getDataGenerator()->create_user(array('idnumber' => 'test-update-user')); $imsuser = new stdClass(); $imsuser->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_UPDATE; // THIS SHOULD WORK, surely?: $imsuser->username = $user->username; // But this is required... $imsuser->username = $user->idnumber; $imsuser->email = 'u3@u3.org'; $imsuser->firstname = 'U'; $imsuser->lastname = '3'; $this->set_xml_file(array($imsuser)); $this->imsplugin->cron(); $dbuser = $DB->get_record('user', array('id' => $user->id), '*', MUST_EXIST); $this->assertEquals($imsuser->email, $dbuser->email); $this->assertEquals($imsuser->firstname, $dbuser->firstname); $this->assertEquals($imsuser->lastname, $dbuser->lastname); } public function test_user_update_disabled() { global $DB; $this->imsplugin->set_config('imsupdateusers', false); $user = $this->getDataGenerator()->create_user(array('idnumber' => 'test-update-user')); $imsuser = new stdClass(); $imsuser->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_UPDATE; // THIS SHOULD WORK, surely?: $imsuser->username = $user->username; // But this is required... $imsuser->username = $user->idnumber; $imsuser->email = 'u3@u3.org'; $imsuser->firstname = 'U'; $imsuser->lastname = '3'; $this->set_xml_file(array($imsuser)); $this->imsplugin->cron(); // Verify no changes have been made. $dbuser = $DB->get_record('user', array('id' => $user->id), '*', MUST_EXIST); $this->assertEquals($user->email, $dbuser->email); $this->assertEquals($user->firstname, $dbuser->firstname); $this->assertEquals($user->lastname, $dbuser->lastname); } /** * Delete user */ public function test_user_delete() { global $DB; $this->imsplugin->set_config('imsdeleteusers', true); $user = $this->getDataGenerator()->create_user(array('idnumber' => 'test-update-user')); $imsuser = new stdClass(); $imsuser->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_DELETE; $imsuser->username = $user->username; $imsuser->firstname = $user->firstname; $imsuser->lastname = $user->lastname; $imsuser->email = $user->email; $this->set_xml_file(array($imsuser)); $this->imsplugin->cron(); $this->assertEquals(1, $DB->get_field('user', 'deleted', array('id' => $user->id), MUST_EXIST)); } /** * Delete user disabled */ public function test_user_delete_disabled() { global $DB; $this->imsplugin->set_config('imsdeleteusers', false); $user = $this->getDataGenerator()->create_user(array('idnumber' => 'test-update-user')); $imsuser = new stdClass(); $imsuser->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_DELETE; $imsuser->username = $user->username; $imsuser->firstname = $user->firstname; $imsuser->lastname = $user->lastname; $imsuser->email = $user->email; $this->set_xml_file(array($imsuser)); $this->imsplugin->cron(); $this->assertEquals(0, $DB->get_field('user', 'deleted', array('id' => $user->id), MUST_EXIST)); } /** * Existing courses are not created again */ public function test_courses_existing() { global $DB; $course1 = $this->getDataGenerator()->create_course(array('idnumber' => 'id1')); $course2 = $this->getDataGenerator()->create_course(array('idnumber' => 'id2')); // Default mapping according to default course attributes - IMS description tags mapping. $course1->imsshort = $course1->fullname; $course2->imsshort = $course2->fullname; unset($course1->category); unset($course2->category); $prevncourses = $DB->count_records('course'); $courses = array($course1, $course2); $this->set_xml_file(false, $courses); $this->imsplugin->cron(); $this->assertEquals($prevncourses, $DB->count_records('course')); } /** * Add new courses */ public function test_courses_add() { global $DB; $prevncourses = $DB->count_records('course'); $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id1'; $course1->imsshort = 'id1'; $course1->category[] = 'DEFAULT CATNAME'; $course2 = new StdClass(); $course2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course2->idnumber = 'id2'; $course2->imsshort = 'id2'; $course2->category[] = 'DEFAULT CATNAME'; $courses = array($course1, $course2); $this->set_xml_file(false, $courses); $this->imsplugin->cron(); $this->assertEquals(($prevncourses + 2), $DB->count_records('course')); $this->assertTrue($DB->record_exists('course', array('idnumber' => $course1->idnumber))); $this->assertTrue($DB->record_exists('course', array('idnumber' => $course2->idnumber))); } /** * Verify that courses are not created when createnewcourses * option is diabled. */ public function test_courses_add_createnewcourses_disabled() { global $DB; $this->imsplugin->set_config('createnewcourses', false); $prevncourses = $DB->count_records('course'); $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id1'; $course1->imsshort = 'id1'; $course1->category[] = 'DEFAULT CATNAME'; $course2 = new StdClass(); $course2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course2->idnumber = 'id2'; $course2->imsshort = 'id2'; $course2->category[] = 'DEFAULT CATNAME'; $courses = array($course1, $course2); $this->set_xml_file(false, $courses); $this->imsplugin->cron(); $courses = array($course1, $course2); $this->set_xml_file(false, $courses); $this->imsplugin->cron(); // Verify the courses have not ben creased. $this->assertEquals($prevncourses , $DB->count_records('course')); $this->assertFalse($DB->record_exists('course', array('idnumber' => $course1->idnumber))); $this->assertFalse($DB->record_exists('course', array('idnumber' => $course2->idnumber))); } /** * Test adding a course with no idnumber. */ public function test_courses_no_idnumber() { global $DB; $prevncourses = $DB->count_records('course'); $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = ''; $course1->imsshort = 'id1'; $course1->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); // Verify no action. $this->assertEquals($prevncourses, $DB->count_records('course')); } /** * Add new course with the truncateidnumber setting. */ public function test_courses_add_truncate_idnumber() { global $DB; $truncatelength = 4; $this->imsplugin->set_config('truncatecoursecodes', $truncatelength); $prevncourses = $DB->count_records('course'); $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = '123456789'; $course1->imsshort = 'id1'; $course1->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); // Verify the new course has been added. $this->assertEquals(($prevncourses + 1), $DB->count_records('course')); $truncatedidnumber = substr($course1->idnumber, 0, $truncatelength); $this->assertTrue($DB->record_exists('course', array('idnumber' => $truncatedidnumber))); } /** * Add new course without a category. */ public function test_course_add_default_category() { global $DB; $this->imsplugin->set_config('createnewcategories', false); // Delete the default category, to ensure the plugin handles this gracefully. $defaultcat = core_course_category::get_default(); $defaultcat->delete_full(false); // Create an course with the IMS plugin without a category. $course1 = new stdClass(); $course1->idnumber = 'id1'; $course1->imsshort = 'id1'; $course1->category[] = ''; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); // Check the course has been created. $dbcourse = $DB->get_record('course', array('idnumber' => $course1->idnumber), '*', MUST_EXIST); // Check that it belongs to a category which exists. $this->assertTrue($DB->record_exists('course_categories', array('id' => $dbcourse->category))); } /** * Course attributes mapping to IMS enterprise group description tags */ public function test_courses_attrmapping() { global $DB; // Setting a all = coursecode (idnumber) mapping. $this->imsplugin->set_config('imscoursemapshortname', 'coursecode'); $this->imsplugin->set_config('imscoursemapfullname', 'coursecode'); $this->imsplugin->set_config('imscoursemapsummary', 'coursecode'); $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id1'; $course1->imsshort = 'description_short1'; $course1->imslong = 'description_long'; $course1->imsfull = 'description_full'; $course1->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); $dbcourse = $DB->get_record('course', array('idnumber' => $course1->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->shortname, $course1->idnumber); $this->assertEquals($dbcourse->fullname, $course1->idnumber); $this->assertEquals($dbcourse->summary, $course1->idnumber); // Setting a mapping using all the description tags. $this->imsplugin->set_config('imscoursemapshortname', 'short'); $this->imsplugin->set_config('imscoursemapfullname', 'long'); $this->imsplugin->set_config('imscoursemapsummary', 'full'); $course2 = new StdClass(); $course2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course2->idnumber = 'id2'; $course2->imsshort = 'description_short2'; $course2->imslong = 'description_long'; $course2->imsfull = 'description_full'; $course2->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course2)); $this->imsplugin->cron(); $dbcourse = $DB->get_record('course', array('idnumber' => $course2->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->shortname, $course2->imsshort); $this->assertEquals($dbcourse->fullname, $course2->imslong); $this->assertEquals($dbcourse->summary, $course2->imsfull); // Setting a mapping where the specified description tags doesn't exist in the XML file (must delegate into idnumber). $this->imsplugin->set_config('imscoursemapshortname', 'short'); $this->imsplugin->set_config('imscoursemapfullname', 'long'); $this->imsplugin->set_config('imscoursemapsummary', 'full'); $course3 = new StdClass(); $course3->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course3->idnumber = 'id3'; $course3->imsshort = 'description_short3'; $course3->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course3)); $this->imsplugin->cron(); $dbcourse = $DB->get_record('course', array('idnumber' => $course3->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->shortname, $course3->imsshort); $this->assertEquals($dbcourse->fullname, $course3->idnumber); $this->assertEquals($dbcourse->summary, $course3->idnumber); } /** * Course updates */ public function test_course_update() { global $DB; $course4 = new StdClass(); $course4->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course4->idnumber = 'id4'; $course4->imsshort = 'id4'; $course4->imsfull = 'id4'; $course4->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course4)); $this->imsplugin->cron(); $course4u = $DB->get_record('course', array('idnumber' => $course4->idnumber)); $course4u->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_UPDATE; $course4u->imsshort = 'description_short_updated'; $course4u->imsfull = 'description_full_updated'; unset($course4u->category); $this->set_xml_file(false, array($course4u)); $this->imsplugin->cron(); $dbcourse = $DB->get_record('course', array('idnumber' => $course4->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->shortname, $course4u->imsshort); $this->assertEquals($dbcourse->fullname, $course4u->imsfull); } /** * Course delete. Make it hidden. */ public function test_course_delete() { global $DB; $course8 = new StdClass(); $course8->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course8->idnumber = 'id8'; $course8->imsshort = 'id8'; $course8->imsfull = 'id8'; $course8->category[] = 'DEFAULT CATNAME'; $this->set_xml_file(false, array($course8)); $this->imsplugin->cron(); $course8d = $DB->get_record('course', array('idnumber' => $course8->idnumber)); $this->assertEquals($course8d->visible, 1); $course8d->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_DELETE; unset($course8d->category); $this->set_xml_file(false, array($course8d)); $this->imsplugin->cron(); $dbcourse = $DB->get_record('course', array('idnumber' => $course8d->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->visible, 0); } /** * Nested categories with name during course creation */ public function test_nested_categories() { global $DB; $this->imsplugin->set_config('nestedcategories', true); $topcat = 'DEFAULT CATNAME'; $subcat = 'DEFAULT SUB CATNAME'; $course5 = new StdClass(); $course5->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course5->idnumber = 'id5'; $course5->imsshort = 'description_short'; $course5->imslong = 'description_long'; $course5->imsfull = 'description_full'; $course5->category = array(); $course5->category[] = $topcat; $course5->category[] = $subcat; $this->set_xml_file(false, array($course5)); $this->imsplugin->cron(); $parentcatid = $DB->get_field('course_categories', 'id', array('name' => $topcat)); $subcatid = $DB->get_field('course_categories', 'id', array('name' => $subcat, 'parent' => $parentcatid)); $this->assertTrue(isset($subcatid)); $this->assertTrue($subcatid > 0); $topcat = 'DEFAULT CATNAME'; $subcat = 'DEFAULT SUB CATNAME TEST2'; $course6 = new StdClass(); $course6->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course6->idnumber = 'id6'; $course6->imsshort = 'description_short'; $course6->imslong = 'description_long'; $course6->imsfull = 'description_full'; $course6->category = array(); $course6->category[] = $topcat; $course6->category[] = $subcat; $this->set_xml_file(false, array($course6)); $this->imsplugin->cron(); $parentcatid = $DB->get_field('course_categories', 'id', array('name' => $topcat)); $subcatid = $DB->get_field('course_categories', 'id', array('name' => $subcat, 'parent' => $parentcatid)); $this->assertTrue(isset($subcatid)); $this->assertTrue($subcatid > 0); } /** * Test that duplicate nested categories with name are not created */ public function test_nested_categories_for_dups() { global $DB; $this->imsplugin->set_config('nestedcategories', true); $topcat = 'DEFAULT CATNAME'; $subcat = 'DEFAULT SUB CATNAME DUPTEST'; $course7 = new StdClass(); $course7->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course7->idnumber = 'id7'; $course7->imsshort = 'description_short'; $course7->imslong = 'description_long'; $course7->imsfull = 'description_full'; $course7->category[] = $topcat; $course7->category[] = $subcat; $this->set_xml_file(false, array($course7)); $this->imsplugin->cron(); $prevncategories = $DB->count_records('course_categories'); $course8 = new StdClass(); $course8->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course8->idnumber = 'id8'; $course8->imsshort = 'description_short'; $course8->imslong = 'description_long'; $course8->imsfull = 'description_full'; $course8->category[] = $topcat; $course8->category[] = $subcat; $this->set_xml_file(false, array($course8)); $this->imsplugin->cron(); $this->assertEquals($prevncategories, $DB->count_records('course_categories')); } /** * Nested categories with idnumber during course creation */ public function test_nested_categories_idnumber() { global $DB; $this->imsplugin->set_config('nestedcategories', true); $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $topcatname = 'DEFAULT CATNAME'; $subcatname = 'DEFAULT SUB CATNAME'; $topcatidnumber = '01'; $subcatidnumber = '0101'; $topcat = $topcatname.$catsep.$topcatidnumber; $subcat = $subcatname.$catsep.$subcatidnumber; $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id5'; $course1->imsshort = 'description_short'; $course1->imslong = 'description_long'; $course1->imsfull = 'description_full'; $course1->category[] = $topcat; $course1->category[] = $subcat; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); $parentcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $topcatidnumber)); $subcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $subcatidnumber, 'parent' => $parentcatid)); $this->assertTrue(isset($subcatid)); $this->assertTrue($subcatid > 0); // Change the category separator character. $this->imsplugin->set_config('categoryseparator', ':'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $topcatname = 'DEFAULT CATNAME'; $subcatname = 'DEFAULT SUB CATNAME TEST2'; $topcatidnumber = '01'; $subcatidnumber = '0102'; $topcat = $topcatname.$catsep.$topcatidnumber; $subcat = $subcatname.$catsep.$subcatidnumber; $course2 = new StdClass(); $course2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course2->idnumber = 'id6'; $course2->imsshort = 'description_short'; $course2->imslong = 'description_long'; $course2->imsfull = 'description_full'; $course2->category[] = $topcat; $course2->category[] = $subcat; $this->set_xml_file(false, array($course2)); $this->imsplugin->cron(); $parentcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $topcatidnumber)); $subcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $subcatidnumber, 'parent' => $parentcatid)); $this->assertTrue(isset($subcatid)); $this->assertTrue($subcatid > 0); } /** * Test that duplicate nested categories with idnumber are not created */ public function test_nested_categories_idnumber_for_dups() { global $DB; $this->imsplugin->set_config('nestedcategories', true); $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $topcatname = 'DEFAULT CATNAME'; $subcatname = 'DEFAULT SUB CATNAME'; $topcatidnumber = '01'; $subcatidnumber = '0101'; $topcat = $topcatname.$catsep.$topcatidnumber; $subcat = $subcatname.$catsep.$subcatidnumber; $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id1'; $course1->imsshort = 'description_short'; $course1->imslong = 'description_long'; $course1->imsfull = 'description_full'; $course1->category[] = $topcat; $course1->category[] = $subcat; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); $prevncategories = $DB->count_records('course_categories'); $course2 = new StdClass(); $course2->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course2->idnumber = 'id2'; $course2->imsshort = 'description_short'; $course2->imslong = 'description_long'; $course2->imsfull = 'description_full'; $course2->category[] = $topcat; $course2->category[] = $subcat; $this->set_xml_file(false, array($course2)); $this->imsplugin->cron(); $this->assertEquals($prevncategories, $DB->count_records('course_categories')); } /** * Test that nested categories with idnumber is not created if name is missing */ public function test_categories_idnumber_missing_name() { global $DB, $CFG; $this->imsplugin->set_config('nestedcategories', true); $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $topcatname = 'DEFAULT CATNAME'; $subcatname = ''; $topcatidnumber = '01'; $subcatidnumber = '0101'; $topcat = $topcatname.$catsep.$topcatidnumber; $subcat = $subcatname.$catsep.$subcatidnumber; $course1 = new StdClass(); $course1->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course1->idnumber = 'id1'; $course1->imsshort = 'description_short'; $course1->imslong = 'description_long'; $course1->imsfull = 'description_full'; $course1->category[] = $topcat; $course1->category[] = $subcat; $this->set_xml_file(false, array($course1)); $this->imsplugin->cron(); // Check all categories except the last subcategory was created. $parentcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $topcatidnumber)); $this->assertTrue((boolean)$parentcatid); $subcatid = $DB->get_field('course_categories', 'id', array('idnumber' => $subcatidnumber, 'parent' => $parentcatid)); $this->assertFalse((boolean)$subcatid); // Check course was put in default category. $defaultcat = core_course_category::get_default(); $dbcourse = $DB->get_record('course', array('idnumber' => $course1->idnumber), '*', MUST_EXIST); $this->assertEquals($dbcourse->category, $defaultcat->id); } /** * Create category with name (nested categories not activated). */ public function test_create_category_name_no_nested() { global $DB; $course = new StdClass(); $course->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course->idnumber = 'id'; $course->imsshort = 'description_short'; $course->imslong = 'description_long'; $course->imsfull = 'description_full'; $course->category[] = 'CATNAME'; $this->set_xml_file(false, array($course)); $this->imsplugin->cron(); $dbcat = $DB->get_record('course_categories', array('name' => $course->category[0])); $this->assertFalse(!$dbcat); $this->assertEquals($dbcat->parent, 0); $dbcourse = $DB->get_record('course', array('idnumber' => $course->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->category, $dbcat->id); } /** * Find a category with name (nested categories not activated). */ public function test_find_category_name_no_nested() { global $DB; $cattop = $this->getDataGenerator()->create_category(array('name' => 'CAT-TOP')); $catsub = $this->getDataGenerator()->create_category(array('name' => 'CAT-SUB', 'parent' => $cattop->id)); $prevcats = $DB->count_records('course_categories'); $course = new StdClass(); $course->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course->idnumber = 'id'; $course->imsshort = 'description_short'; $course->imslong = 'description_long'; $course->imsfull = 'description_full'; $course->category[] = 'CAT-SUB'; $this->set_xml_file(false, array($course)); $this->imsplugin->cron(); $newcats = $DB->count_records('course_categories'); // Check that no new category was not created. $this->assertEquals($prevcats, $newcats); // Check course is associated to CAT-SUB. $dbcourse = $DB->get_record('course', array('idnumber' => $course->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->category, $catsub->id); } /** * Create category with idnumber (nested categories not activated). */ public function test_create_category_idnumber_no_nested() { global $DB; $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $course = new StdClass(); $course->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course->idnumber = 'id'; $course->imsshort = 'description_short'; $course->imslong = 'description_long'; $course->imsfull = 'description_full'; $course->category[] = 'CATNAME'. $catsep . 'CATIDNUMBER'; $this->set_xml_file(false, array($course)); $this->imsplugin->cron(); $dbcat = $DB->get_record('course_categories', array('idnumber' => 'CATIDNUMBER')); $this->assertFalse(!$dbcat); $this->assertEquals($dbcat->parent, 0); $this->assertEquals($dbcat->name, 'CATNAME'); $dbcourse = $DB->get_record('course', array('idnumber' => $course->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->category, $dbcat->id); } /** * Find a category with idnumber (nested categories not activated). */ public function test_find_category_idnumber_no_nested() { global $DB; $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $topcatname = 'CAT-TOP'; $subcatname = 'CAT-SUB'; $topcatidnumber = 'ID-TOP'; $subcatidnumber = 'ID-SUB'; $cattop = $this->getDataGenerator()->create_category(array('name' => $topcatname, 'idnumber' => $topcatidnumber)); $catsub = $this->getDataGenerator()->create_category(array('name' => $subcatname, 'idnumber' => $subcatidnumber, 'parent' => $cattop->id)); $prevcats = $DB->count_records('course_categories'); $course = new StdClass(); $course->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course->idnumber = 'id'; $course->imsshort = 'description_short'; $course->imslong = 'description_long'; $course->imsfull = 'description_full'; $course->category[] = $subcatname . $catsep . $subcatidnumber; $this->set_xml_file(false, array($course)); $this->imsplugin->cron(); $newcats = $DB->count_records('course_categories'); // Check that no new category was not created. $this->assertEquals($prevcats, $newcats); $dbcourse = $DB->get_record('course', array('idnumber' => $course->idnumber)); $this->assertFalse(!$dbcourse); $this->assertEquals($dbcourse->category, $catsub->id); } /** * Test that category with idnumber is not created if name is missing (nested categories not activated). */ public function test_category_idnumber_missing_name_no_nested() { global $DB; $this->imsplugin->set_config('categoryidnumber', true); $this->imsplugin->set_config('categoryseparator', '|'); $catsep = trim($this->imsplugin->get_config('categoryseparator')); $catidnumber = '01'; $course = new StdClass(); $course->recstatus = enrol_imsenterprise_plugin::IMSENTERPRISE_ADD; $course->idnumber = 'id1'; $course->imsshort = 'description_short'; $course->imslong = 'description_long'; $course->imsfull = 'description_full'; $course->category[] = '' . $catsep . $catidnumber; $this->set_xml_file(false, array($course)); $this->imsplugin->cron(); // Check category was not created. $catid = $DB->get_record('course_categories', array('idnumber' => $catidnumber)); $this->assertFalse($catid); // Check course was put in default category. $defaultcat = core_course_category::get_default(); $dbcourse = $DB->get_record('course', array('idnumber' => $course->idnumber), '*', MUST_EXIST); $this->assertEquals($dbcourse->category, $defaultcat->id); } /** * Sets the plugin configuration for testing */ public function set_test_config() { $this->imsplugin->set_config('mailadmins', false); $this->imsplugin->set_config('prev_path', ''); $this->imsplugin->set_config('createnewusers', true); $this->imsplugin->set_config('imsupdateusers', true); $this->imsplugin->set_config('createnewcourses', true); $this->imsplugin->set_config('updatecourses', true); $this->imsplugin->set_config('createnewcategories', true); $this->imsplugin->set_config('categoryseparator', ''); $this->imsplugin->set_config('categoryidnumber', false); $this->imsplugin->set_config('nestedcategories', false); } /** * Creates an IMS enterprise XML file and adds it's path to config settings. * * @param bool|array $users false or array of users StdClass * @param bool|array $courses false or of courses StdClass */ public function set_xml_file($users = false, $courses = false) { $xmlcontent = ''; // Users. if (!empty($users)) { foreach ($users as $user) { $xmlcontent .= ' recstatus)) { $xmlcontent .= ' recstatus="'.$user->recstatus.'"'; } $xmlcontent .= '> TestSource '.$user->username.' auth)) { $xmlcontent .= ' authenticationtype="'.$user->auth.'"'; } $xmlcontent .= '>'.$user->username.' '.$user->firstname.' '.$user->lastname.' '.$user->lastname.' '.$user->firstname.' '.$user->email.' '; } } // Courses. // Mapping based on default course attributes - IMS group tags mapping. if (!empty($courses)) { foreach ($courses as $course) { $xmlcontent .= ' recstatus)) { $xmlcontent .= ' recstatus="'.$course->recstatus.'"'; } $xmlcontent .= '> TestSource '.$course->idnumber.' '; // Optional to test course attributes mappings. if (!empty($course->imsshort)) { $xmlcontent .= ' '.$course->imsshort.''; } // Optional to test course attributes mappings. if (!empty($course->imslong)) { $xmlcontent .= ' '.$course->imslong.''; } // Optional to test course attributes mappings. if (!empty($course->imsfull)) { $xmlcontent .= ' '.$course->imsfull.''; } // The orgunit tag value is used by moodle as category name. $xmlcontent .= ' '; // Optional category name. if (isset($course->category) && !empty($course->category)) { foreach ($course->category as $category) { $xmlcontent .= ' '.$category.''; } } $xmlcontent .= ' '; } } $xmlcontent .= ' '; // Creating the XML file. $filename = 'ims_' . rand(1000, 9999) . '.xml'; $tmpdir = make_temp_directory('enrol_imsenterprise'); $xmlfilepath = $tmpdir . '/' . $filename; file_put_contents($xmlfilepath, $xmlcontent); // Setting the file path in CFG. $this->imsplugin->set_config('imsfilelocation', $xmlfilepath); } /** * IMS Enterprise enrolment task test. */ public function test_imsenterprise_cron_task() { global $DB; $prevnusers = $DB->count_records('user'); $user1 = new StdClass(); $user1->username = 'u1'; $user1->email = 'u1@example.com'; $user1->firstname = 'U'; $user1->lastname = '1'; $users = array($user1); $this->set_xml_file($users); $task = new enrol_imsenterprise\task\cron_task(); $task->execute(); $this->assertEquals(($prevnusers + 1), $DB->count_records('user')); } }