From 2b8f692f71fd864306fa0794fcdcf5aca5ce0321 Mon Sep 17 00:00:00 2001 From: David Monllao Date: Fri, 5 Oct 2012 11:42:17 +0800 Subject: [PATCH] MDL-28705 enrol_imsenterprise Unit tests for users and courses creation --- enrol/imsenterprise/lib.php | 5 +- .../tests/imsenterprise_test.php | 260 ++++++++++++++++++ 2 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 enrol/imsenterprise/tests/imsenterprise_test.php diff --git a/enrol/imsenterprise/lib.php b/enrol/imsenterprise/lib.php index 8cfa607baf5..5a2070efaff 100644 --- a/enrol/imsenterprise/lib.php +++ b/enrol/imsenterprise/lib.php @@ -759,7 +759,10 @@ function process_properties_tag($tagcontents){ * @param string $string Text to write (newline will be added automatically) */ function log_line($string){ - mtrace($string); + + if (!PHPUNIT_TEST) { + mtrace($string); + } if($this->logfp) { fwrite($this->logfp, $string . "\n"); } diff --git a/enrol/imsenterprise/tests/imsenterprise_test.php b/enrol/imsenterprise/tests/imsenterprise_test.php new file mode 100644 index 00000000000..358d3fdd2ca --- /dev/null +++ b/enrol/imsenterprise/tests/imsenterprise_test.php @@ -0,0 +1,260 @@ +. + +/** + * IMS Enterprise enrolment tests. + * + * @package enrol_imsenterprise + * @category phpunit + * @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 phpunit + * @copyright 2012 David Monllaó + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class enrol_imsenterprise_testcase extends advanced_testcase { + + protected $imsplugin; + + 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->username = 'u1'; + $user1->email = 'u1@u1.org'; + $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')); + } + + + /** + * 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; + + $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->idnumber = 'id1'; + $course1->imsshort = 'id1'; + $course1->category = 'DEFAULT CATNAME'; + + $course2 = new StdClass(); + $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')); + } + + + /** + * Sets the plugin configuration for testing + */ + protected 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('createnewcourses', true); + $this->imsplugin->set_config('createnewcategories', true); + } + + + /** + * Creates an IMS enterprise XML file and adds it's path to config settings + * + * @param array Array of users StdClass + * @param array Array of courses StdClass + */ + protected function set_xml_file($users = false, $courses = false) { + global $DB; + + $xmlcontent = ''; + + // Users. + if (!empty($users)) { + foreach ($users as $user) { + $xmlcontent .= ' + + + TestSource + '.$user->username.' + + '.$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) { + + // orgunit tag value is used by moodle as category name. + // If the category does not exists the id is used as name. + if ($categoryname = $DB->get_field('course_categories', 'name', array('id' => $course->category))) { + $categoryname = $course->category; + } + + $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.''; + } + + $xmlcontent .= ' + + + '.$categoryname.' + + '; + } + } + + $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); + } +} -- 2.43.0