MDL-28705 enrol_imsenterprise Unit tests for users and courses creation
[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     }
157     /**
158      * Sets the plugin configuration for testing
159      */
160     protected function set_test_config() {
161         $this->imsplugin->set_config('mailadmins', false);
162         $this->imsplugin->set_config('prev_path', '');
163         $this->imsplugin->set_config('createnewusers', true);
164         $this->imsplugin->set_config('createnewcourses', true);
165         $this->imsplugin->set_config('createnewcategories', true);
166     }
169     /**
170      * Creates an IMS enterprise XML file and adds it's path to config settings
171      *
172      * @param array Array of users StdClass
173      * @param array Array of courses StdClass
174      */
175     protected function set_xml_file($users = false, $courses = false) {
176         global $DB;
178         $xmlcontent = '<enterprise>';
180         // Users.
181         if (!empty($users)) {
182             foreach ($users as $user) {
183                 $xmlcontent .= '
184   <person>
185     <sourcedid>
186       <source>TestSource</source>
187       <id>'.$user->username.'</id>
188     </sourcedid>
189     <userid>'.$user->username.'</userid>
190     <name>
191       <fn>'.$user->firstname.' '.$user->lastname.'</fn>
192       <n>
193         <family>'.$user->lastname.'</family>
194         <given>'.$user->firstname.'</given>
195       </n>
196     </name>
197     <email>'.$user->email.'</email>
198   </person>';
199             }
200         }
202         // Courses.
203         // Mapping based on default course attributes - IMS group tags mapping.
204         if (!empty($courses)) {
205             foreach ($courses as $course) {
207                 // orgunit tag value is used by moodle as category name.
208                 // If the category does not exists the id is used as name.
209                 if ($categoryname = $DB->get_field('course_categories', 'name', array('id' => $course->category))) {
210                     $categoryname = $course->category;
211                 }
213                 $xmlcontent .= '
214   <group>
215     <sourcedid>
216       <source>TestSource</source>
217       <id>'.$course->idnumber.'</id>
218     </sourcedid>
219     <description>';
221                 // Optional to test course attributes mappings.
222                 if (!empty($course->imsshort)) {
223                     $xmlcontent .= '
224       <short>'.$course->imsshort.'</short>';
225                 }
227                 // Optional to test course attributes mappings.
228                 if (!empty($course->imslong)) {
229                     $xmlcontent .= '
230       <long>'.$course->imslong.'</long>';
231                 }
233                 // Optional to test course attributes mappings.
234                 if (!empty($course->imsfull)) {
235                     $xmlcontent .= '
236       <full>'.$course->imsfull.'</full>';
237                 }
239                 $xmlcontent .= '
240     </description>
241     <org>
242       <orgunit>'.$categoryname.'</orgunit>
243     </org>
244   </group>';
245             }
246         }
248         $xmlcontent .= '
249 </enterprise>';
251         // Creating the XML file.
252         $filename = 'ims_' . rand(1000, 9999) . '.xml';
253         $tmpdir = make_temp_directory('enrol_imsenterprise');
254         $xmlfilepath = $tmpdir . '/' . $filename;
255         file_put_contents($xmlfilepath, $xmlcontent);
257         // Setting the file path in CFG.
258         $this->imsplugin->set_config('imsfilelocation', $xmlfilepath);
259     }