MDL-53700 competency: Migrating data generator to core
[moodle.git] / admin / tool / lp / tests / competency_rule_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  * Competency rule tests.
19  *
20  * @package    tool_lp
21  * @copyright  2015 Frédéric Massart - FMCorz.net
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 global $CFG;
28 require_once($CFG->dirroot . '/webservice/tests/helpers.php');
30 use core_competency\user_competency;
31 use core_competency\competency;
32 use core_competency\competency_rule_all;
33 use core_competency\competency_rule_points;
35 /**
36  * Competency rule testcase.
37  *
38  * @package    tool_lp
39  * @copyright  2015 Frédéric Massart - FMCorz.net
40  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
41  */
42 class tool_lp_competency_rule_testcase extends externallib_advanced_testcase {
44     public function test_rule_all_matching() {
45         $this->resetAfterTest(true);
47         $this->setAdminUser();
48         $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
49         $u1 = $this->getDataGenerator()->create_user();
51         // Set up the framework and competencies.
52         $framework = $lpg->create_framework();
53         $c1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(),
54             'ruletype' => 'core_competency\competency_rule_all'));
55         $c11 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id(),
56             'ruletype' => 'core_competency\competency_rule_all'));
57         $c111 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c11->get_id(),
58             'ruletype' => 'core_competency\competency_rule_all'));
59         $c112 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c11->get_id(),
60             'ruletype' => 'core_competency\competency_rule_all'));
61         $c12 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id(),
62             'ruletype' => 'core_competency\competency_rule_all'));
63         $c13 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id(),
64             'ruletype' => 'core_competency\competency_rule_all'));
65         $c131 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c13->get_id(),
66             'ruletype' => 'core_competency\competency_rule_all'));
68         // Create some user competency records.
69         $uc1 = $lpg->create_user_competency(array('competencyid' => $c1->get_id(), 'userid' => $u1->id));
70         $uc11 = $lpg->create_user_competency(array('competencyid' => $c11->get_id(), 'userid' => $u1->id,
71             'grade' => 1, 'proficiency' => 1));
72         $uc111 = $lpg->create_user_competency(array('competencyid' => $c111->get_id(), 'userid' => $u1->id,
73             'grade' => 1, 'proficiency' => 1));
74         $uc112 = $lpg->create_user_competency(array('competencyid' => $c112->get_id(), 'userid' => $u1->id,
75             'grade' => 1, 'proficiency' => 1));
76         $uc12 = $lpg->create_user_competency(array('competencyid' => $c12->get_id(), 'userid' => $u1->id));
77         $uc13 = new user_competency(0, (object) array('userid' => $u1->id, 'competencyid' => $c13->get_id()));
79         // Not all children are met.
80         $cr = new competency_rule_all($c1);
81         $this->assertFalse($cr->matches($uc1));
83         // All children are met.
84         $cr = new competency_rule_all($c11);
85         $this->assertTrue($cr->matches($uc11));
87         // The competency doesn't have any children.
88         $cr = new competency_rule_all($c12);
89         $this->assertFalse($cr->matches($uc12));
91         // The competency doesn't have saved user competency records.
92         $cr = new competency_rule_all($c13);
93         $this->assertFalse($cr->matches($uc13));
94     }
96     public function test_rule_points_validation() {
97         $this->resetAfterTest(true);
98         $this->setAdminUser();
100         $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
101         $framework = $lpg->create_framework();
102         $framework2 = $lpg->create_framework();
103         $c1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
104         $c2 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
105         $c3 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
106         $c4 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
107         $cx = $lpg->create_competency(array('competencyframeworkid' => $framework2->get_id()));
109         $c1->set_ruletype('core_competency\competency_rule_points');
110         $rule = new competency_rule_points($c1);
112         // Invalid config.
113         $config = json_encode(array());
114         $this->assertFalse($rule->validate_config($config));
116         // Missing required points.
117         $config = json_encode(array(
118             'base' => array(),
119             'competencies' => array(
120                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
121                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
122             )
123         ));
124         $this->assertFalse($rule->validate_config($config));
126         // Invalid required points.
127         $config = json_encode(array(
128             'base' => array('points' => 'abc'),
129             'competencies' => array(
130                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
131                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
132             )
133         ));
134         $this->assertFalse($rule->validate_config($config));
136         // Less than 1 required points.
137         $config = json_encode(array(
138             'base' => array('points' => 0),
139             'competencies' => array(
140                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
141                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
142             )
143         ));
144         $this->assertFalse($rule->validate_config($config));
146         // Not enough required points.
147         $config = json_encode(array(
148             'base' => array('points' => 3),
149             'competencies' => array(
150                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
151                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
152             )
153         ));
154         $this->assertFalse($rule->validate_config($config));
156         // Duplicate competency.
157         $config = json_encode(array(
158             'base' => array('points' => 1),
159             'competencies' => array(
160                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
161                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
162             )
163         ));
164         $this->assertFalse($rule->validate_config($config));
166         // Competency includes itself.
167         $config = json_encode(array(
168             'base' => array('points' => 1),
169             'competencies' => array(
170                 array('id' => $c1->get_id(), 'points' => 1, 'required' => 0),
171                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
172             )
173         ));
174         $this->assertFalse($rule->validate_config($config));
176         // Cannot use negative points.
177         $config = json_encode(array(
178             'base' => array('points' => 1),
179             'competencies' => array(
180                 array('id' => $c2->get_id(), 'points' => -1, 'required' => 0),
181                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
182             )
183         ));
184         $this->assertFalse($rule->validate_config($config));
186         // Not competencies set.
187         $config = json_encode(array(
188             'base' => array('points' => 1),
189             'competencies' => array(
190             )
191         ));
192         $this->assertFalse($rule->validate_config($config));
194         // There is a competency that is not a child.
195         $config = json_encode(array(
196             'base' => array('points' => 1),
197             'competencies' => array(
198                 array('id' => $c1->get_id(), 'points' => 1, 'required' => 0),
199                 array('id' => $c2->get_id(), 'points' => 1, 'required' => 0),
200                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
201             )
202         ));
203         $this->assertFalse($rule->validate_config($config));
205         // There is a competency from another framework in there.
206         $config = json_encode(array(
207             'base' => array('points' => 1),
208             'competencies' => array(
209                 array('id' => $cx->get_id(), 'points' => 1, 'required' => 0),
210                 array('id' => $c3->get_id(), 'points' => 1, 'required' => 0),
211             )
212         ));
213         $this->assertFalse($rule->validate_config($config));
215         // A normal config.
216         $config = json_encode(array(
217             'base' => array('points' => 4),
218             'competencies' => array(
219                 array('id' => $c2->get_id(), 'points' => 3, 'required' => 0),
220                 array('id' => $c3->get_id(), 'points' => 2, 'required' => 1),
221             )
222         ));
223         $this->assertTrue($rule->validate_config($config));
224     }
226     public function test_rule_points_matching() {
227         $this->resetAfterTest(true);
229         $this->setAdminUser();
230         $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
231         $u1 = $this->getDataGenerator()->create_user();
233         // Set up the framework and competencies.
234         $framework = $lpg->create_framework();
235         $c1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
236         $c1->set_ruletype('core_competency\competency_rule_points');
237         $comprule = new competency_rule_points($c1);
238         $c11 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
239         $c12 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
240         $c13 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
241         $c14 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id(), 'parentid' => $c1->get_id()));
243         // Create some user competency records.
244         $uc1 = $lpg->create_user_competency(array('competencyid' => $c1->get_id(), 'userid' => $u1->id));
245         $uc11 = $lpg->create_user_competency(array('competencyid' => $c11->get_id(), 'userid' => $u1->id,
246             'grade' => 1, 'proficiency' => 1));
247         $uc12 = $lpg->create_user_competency(array('competencyid' => $c12->get_id(), 'userid' => $u1->id,
248             'grade' => 1, 'proficiency' => 1));
249         $uc13 = $lpg->create_user_competency(array('competencyid' => $c13->get_id(), 'userid' => $u1->id));
251         // Enough points.
252         $rule = array(
253             'base' => array('points' => 8),
254             'competencies' => array(
255                 array(
256                     'id' => $c11->get_id(),
257                     'points' => 4,
258                     'required' => 0
259                 ),
260                 array(
261                     'id' => $c12->get_id(),
262                     'points' => 4,
263                     'required' => 0
264                 ),
265             )
266         );
267         $c1->set_ruleconfig(json_encode($rule));
268         $c1->update();
269         $this->assertTrue($comprule->matches($uc1));
271         // Not enough points.
272         $rule = array(
273             'base' => array('points' => 8),
274             'competencies' => array(
275                 array(
276                     'id' => $c11->get_id(),
277                     'points' => 4,
278                     'required' => 0
279                 ),
280                 array(
281                     'id' => $c13->get_id(),
282                     'points' => 4,
283                     'required' => 0
284                 ),
285             )
286         );
287         $c1->set_ruleconfig(json_encode($rule));
288         $c1->update();
289         $this->assertFalse($comprule->matches($uc1));
291         // One required that is not met but points were OK.
292         $rule = array(
293             'base' => array('points' => 8),
294             'competencies' => array(
295                 array(
296                     'id' => $c11->get_id(),
297                     'points' => 4,
298                     'required' => 0
299                 ),
300                 array(
301                     'id' => $c12->get_id(),
302                     'points' => 4,
303                     'required' => 0
304                 ),
305                 array(
306                     'id' => $c13->get_id(),
307                     'points' => 4,
308                     'required' => 1
309                 ),
310             )
311         );
312         $c1->set_ruleconfig(json_encode($rule));
313         $c1->update();
314         $this->assertFalse($comprule->matches($uc1));
316         // One required, one not, should match.
317         $rule = array(
318             'base' => array('points' => 8),
319             'competencies' => array(
320                 array(
321                     'id' => $c11->get_id(),
322                     'points' => 4,
323                     'required' => 0
324                 ),
325                 array(
326                     'id' => $c12->get_id(),
327                     'points' => 4,
328                     'required' => 1
329                 ),
330             )
331         );
332         $c1->set_ruleconfig(json_encode($rule));
333         $c1->update();
334         $this->assertTrue($comprule->matches($uc1));
336         // All required and should match.
337         $rule = array(
338             'base' => array('points' => 8),
339             'competencies' => array(
340                 array(
341                     'id' => $c11->get_id(),
342                     'points' => 4,
343                     'required' => 1
344                 ),
345                 array(
346                     'id' => $c12->get_id(),
347                     'points' => 4,
348                     'required' => 1
349                 ),
350             )
351         );
352         $c1->set_ruleconfig(json_encode($rule));
353         $c1->update();
354         $this->assertTrue($comprule->matches($uc1));
356         // All required, but one doesn't have a user record.
357         $rule = array(
358             'base' => array('points' => 4),
359             'competencies' => array(
360                 array(
361                     'id' => $c12->get_id(),
362                     'points' => 4,
363                     'required' => 1
364                 ),
365                 array(
366                     'id' => $c14->get_id(),
367                     'points' => 4,
368                     'required' => 1
369                 ),
370             )
371         );
372         $c1->set_ruleconfig(json_encode($rule));
373         $c1->update();
374         $this->assertFalse($comprule->matches($uc1));
375     }