Merge branch 'MDL-32570-master' of git://github.com/danpoltawski/moodle
[moodle.git] / enrol / imsenterprise / tests / imsenterprise_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * IMS Enterprise enrolment tests.
19  *
20  * @package    enrol_imsenterprise
21  * @category   phpunit
22  * @copyright  2012 David MonllaĆ³
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 global $CFG;
29 require_once($CFG->dirroot . '/enrol/imsenterprise/locallib.php');
30 require_once($CFG->dirroot . '/enrol/imsenterprise/lib.php');
32 /**
33  * IMS Enterprise test case
34  *
35  * @package    enrol_imsenterprise
36  * @category   phpunit
37  * @copyright  2012 David MonllaĆ³
38  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class enrol_imsenterprise_testcase extends advanced_testcase {
42     protected $imsplugin;
44     protected function setUp() {
45         $this->resetAfterTest(true);
46         $this->imsplugin = enrol_get_plugin('imsenterprise');
47         $this->set_test_config();
48     }
50     /**
51      * With an empty IMS enterprise file
52      */
53     public function test_emptyfile() {
54         global $DB;
56         $prevncourses = $DB->count_records('course');
57         $prevnusers = $DB->count_records('user');
59         $this->set_xml_file(false, false);
60         $this->imsplugin->cron();
62         $this->assertEquals($prevncourses, $DB->count_records('course'));
63         $this->assertEquals($prevnusers, $DB->count_records('user'));
64     }
67     /**
68      * Existing users are not created again
69      */
70     public function test_users_existing() {
71         global $DB;
73         $user1 = $this->getDataGenerator()->create_user();
74         $user2 = $this->getDataGenerator()->create_user();
76         $prevnusers = $DB->count_records('user');
78         $users = array($user1, $user2);
79         $this->set_xml_file($users);
80         $this->imsplugin->cron();
82         $this->assertEquals($prevnusers, $DB->count_records('user'));
83     }
86     /**
87      * Add new users
88      */
89     public function test_users_add() {
90         global $DB;
92         $prevnusers = $DB->count_records('user');
94         $user1 = new StdClass();
95         $user1->username = 'u1';
96         $user1->email = 'u1@u1.org';
97         $user1->firstname = 'U';
98         $user1->lastname = '1';
100         $users = array($user1);
101         $this->set_xml_file($users);
102         $this->imsplugin->cron();
104         $this->assertEquals(($prevnusers + 1), $DB->count_records('user'));
105     }
108     /**
109      * Existing courses are not created again
110      */
111     public function test_courses_existing() {
112         global $DB;
114         $course1 = $this->getDataGenerator()->create_course(array('idnumber' => 'id1'));
115         $course2 = $this->getDataGenerator()->create_course(array('idnumber' => 'id2'));
117         // Default mapping according to default course attributes - IMS description tags mapping.
118         $course1->imsshort = $course1->fullname;
119         $course2->imsshort = $course2->fullname;
121         $prevncourses = $DB->count_records('course');
123         $courses = array($course1, $course2);
124         $this->set_xml_file(false, $courses);
125         $this->imsplugin->cron();
127         $this->assertEquals($prevncourses, $DB->count_records('course'));
128     }
131     /**
132      * Add new courses
133      */
134     public function test_courses_add() {
135         global $DB;
137         $prevncourses = $DB->count_records('course');
139         $course1 = new StdClass();
140         $course1->idnumber = 'id1';
141         $course1->imsshort = 'id1';
142         $course1->category = 'DEFAULT CATNAME';
144         $course2 = new StdClass();
145         $course2->idnumber = 'id2';
146         $course2->imsshort = 'id2';
147         $course2->category = 'DEFAULT CATNAME';
149         $courses = array($course1, $course2);
150         $this->set_xml_file(false, $courses);
151         $this->imsplugin->cron();
153         $this->assertEquals(($prevncourses + 2), $DB->count_records('course'));
154     }
156     /**
157      * Add new course without a category.
158      */
159     public function test_course_add_default_category() {
160         global $DB, $CFG;
161         require_once($CFG->libdir.'/coursecatlib.php');
163         $this->imsplugin->set_config('createnewcategories', false);
165         // Delete the default category, to ensure the plugin handles this gracefully.
166         $defaultcat = coursecat::get_default();
167         $defaultcat->delete_full(false);
169         // Create an course with the IMS plugin without a category.
170         $course1 = new stdClass();
171         $course1->idnumber = 'id1';
172         $course1->imsshort = 'id1';
173         $course1->category = '';
174         $this->set_xml_file(false, array($course1));
175         $this->imsplugin->cron();
177         // Check the course has been created.
178         $dbcourse = $DB->get_record('course', array('idnumber' => $course1->idnumber), '*', MUST_EXIST);
179         // Check that it belongs to a category which exists.
180         $this->assertTrue($DB->record_exists('course_categories', array('id' => $dbcourse->category)));
181     }
183     /**
184      * Course attributes mapping to IMS enterprise group description tags
185      */
186     public function test_courses_attrmapping() {
187         global $DB;
189         // Setting a all = coursecode (idnumber) mapping.
190         $this->imsplugin->set_config('imscoursemapshortname', 'coursecode');
191         $this->imsplugin->set_config('imscoursemapfullname', 'coursecode');
192         $this->imsplugin->set_config('imscoursemapsummary', 'coursecode');
194         $course1 = new StdClass();
195         $course1->idnumber = 'id1';
196         $course1->imsshort = 'description_short1';
197         $course1->imslong = 'description_long';
198         $course1->imsfull = 'description_full';
199         $course1->category = 'DEFAULT CATNAME';
201         $this->set_xml_file(false, array($course1));
202         $this->imsplugin->cron();
204         $dbcourse = $DB->get_record('course', array('idnumber' => $course1->idnumber));
205         $this->assertFalse(!$dbcourse);
206         $this->assertEquals($dbcourse->shortname, $course1->idnumber);
207         $this->assertEquals($dbcourse->fullname, $course1->idnumber);
208         $this->assertEquals($dbcourse->summary, $course1->idnumber);
211         // Setting a mapping using all the description tags.
212         $this->imsplugin->set_config('imscoursemapshortname', 'short');
213         $this->imsplugin->set_config('imscoursemapfullname', 'long');
214         $this->imsplugin->set_config('imscoursemapsummary', 'full');
216         $course2 = new StdClass();
217         $course2->idnumber = 'id2';
218         $course2->imsshort = 'description_short2';
219         $course2->imslong = 'description_long';
220         $course2->imsfull = 'description_full';
221         $course2->category = 'DEFAULT CATNAME';
223         $this->set_xml_file(false, array($course2));
224         $this->imsplugin->cron();
226         $dbcourse = $DB->get_record('course', array('idnumber' => $course2->idnumber));
227         $this->assertFalse(!$dbcourse);
228         $this->assertEquals($dbcourse->shortname, $course2->imsshort);
229         $this->assertEquals($dbcourse->fullname, $course2->imslong);
230         $this->assertEquals($dbcourse->summary, $course2->imsfull);
233         // Setting a mapping where the specified description tags doesn't exist in the XML file (must delegate into idnumber).
234         $this->imsplugin->set_config('imscoursemapshortname', 'short');
235         $this->imsplugin->set_config('imscoursemapfullname', 'long');
236         $this->imsplugin->set_config('imscoursemapsummary', 'full');
238         $course3 = new StdClass();
239         $course3->idnumber = 'id3';
240         $course3->imsshort = 'description_short3';
241         $course3->category = 'DEFAULT CATNAME';
243         $this->set_xml_file(false, array($course3));
244         $this->imsplugin->cron();
246         $dbcourse = $DB->get_record('course', array('idnumber' => $course3->idnumber));
247         $this->assertFalse(!$dbcourse);
248         $this->assertEquals($dbcourse->shortname, $course3->imsshort);
249         $this->assertEquals($dbcourse->fullname, $course3->idnumber);
250         $this->assertEquals($dbcourse->summary, $course3->idnumber);
252     }
255     /**
256      * Sets the plugin configuration for testing
257      */
258     protected function set_test_config() {
259         $this->imsplugin->set_config('mailadmins', false);
260         $this->imsplugin->set_config('prev_path', '');
261         $this->imsplugin->set_config('createnewusers', true);
262         $this->imsplugin->set_config('createnewcourses', true);
263         $this->imsplugin->set_config('createnewcategories', true);
264     }
267     /**
268      * Creates an IMS enterprise XML file and adds it's path to config settings
269      *
270      * @param array Array of users StdClass
271      * @param array Array of courses StdClass
272      */
273     protected function set_xml_file($users = false, $courses = false) {
274         global $DB;
276         $xmlcontent = '<enterprise>';
278         // Users.
279         if (!empty($users)) {
280             foreach ($users as $user) {
281                 $xmlcontent .= '
282   <person>
283     <sourcedid>
284       <source>TestSource</source>
285       <id>'.$user->username.'</id>
286     </sourcedid>
287     <userid>'.$user->username.'</userid>
288     <name>
289       <fn>'.$user->firstname.' '.$user->lastname.'</fn>
290       <n>
291         <family>'.$user->lastname.'</family>
292         <given>'.$user->firstname.'</given>
293       </n>
294     </name>
295     <email>'.$user->email.'</email>
296   </person>';
297             }
298         }
300         // Courses.
301         // Mapping based on default course attributes - IMS group tags mapping.
302         if (!empty($courses)) {
303             foreach ($courses as $course) {
305                 $xmlcontent .= '
306   <group>
307     <sourcedid>
308       <source>TestSource</source>
309       <id>'.$course->idnumber.'</id>
310     </sourcedid>
311     <description>';
313                 // Optional to test course attributes mappings.
314                 if (!empty($course->imsshort)) {
315                     $xmlcontent .= '
316       <short>'.$course->imsshort.'</short>';
317                 }
319                 // Optional to test course attributes mappings.
320                 if (!empty($course->imslong)) {
321                     $xmlcontent .= '
322       <long>'.$course->imslong.'</long>';
323                 }
325                 // Optional to test course attributes mappings.
326                 if (!empty($course->imsfull)) {
327                     $xmlcontent .= '
328       <full>'.$course->imsfull.'</full>';
329                 }
331                 // orgunit tag value is used by moodle as category name.
332                 $xmlcontent .= '
333     </description>
334     <org>
335       <orgunit>'.$course->category.'</orgunit>
336     </org>
337   </group>';
338             }
339         }
341         $xmlcontent .= '
342 </enterprise>';
344         // Creating the XML file.
345         $filename = 'ims_' . rand(1000, 9999) . '.xml';
346         $tmpdir = make_temp_directory('enrol_imsenterprise');
347         $xmlfilepath = $tmpdir . '/' . $filename;
348         file_put_contents($xmlfilepath, $xmlcontent);
350         // Setting the file path in CFG.
351         $this->imsplugin->set_config('imsfilelocation', $xmlfilepath);
352     }