Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 310 and 311] [Versions 310 and 400] [Versions 310 and 401] [Versions 310 and 402] [Versions 310 and 403]

   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/>.
  16  
  17  /**
  18   * Competency rule tests.
  19   *
  20   * @package    core_competency
  21   * @copyright  2015 Frédéric Massart - FMCorz.net
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  global $CFG;
  28  require_once($CFG->dirroot . '/webservice/tests/helpers.php');
  29  
  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;
  34  
  35  /**
  36   * Competency rule testcase.
  37   *
  38   * @package    core_competency
  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 core_competency_competency_rule_testcase extends externallib_advanced_testcase {
  43  
  44      public function test_rule_all_matching() {
  45          $this->resetAfterTest(true);
  46  
  47          $this->setAdminUser();
  48          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
  49          $u1 = $this->getDataGenerator()->create_user();
  50  
  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'));
  67  
  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')));
  78  
  79          // Not all children are met.
  80          $cr = new competency_rule_all($c1);
  81          $this->assertFalse($cr->matches($uc1));
  82  
  83          // All children are met.
  84          $cr = new competency_rule_all($c11);
  85          $this->assertTrue($cr->matches($uc11));
  86  
  87          // The competency doesn't have any children.
  88          $cr = new competency_rule_all($c12);
  89          $this->assertFalse($cr->matches($uc12));
  90  
  91          // The competency doesn't have saved user competency records.
  92          $cr = new competency_rule_all($c13);
  93          $this->assertFalse($cr->matches($uc13));
  94      }
  95  
  96      public function test_rule_points_validation() {
  97          $this->resetAfterTest(true);
  98          $this->setAdminUser();
  99  
 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')));
 108  
 109          $c1->set('ruletype', 'core_competency\competency_rule_points');
 110          $rule = new competency_rule_points($c1);
 111  
 112          // Invalid config.
 113          $config = json_encode(array());
 114          $this->assertFalse($rule->validate_config($config));
 115  
 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));
 125  
 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));
 135  
 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));
 145  
 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));
 155  
 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));
 165  
 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));
 175  
 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));
 185  
 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));
 193  
 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));
 204  
 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));
 214  
 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      }
 225  
 226      public function test_rule_points_matching() {
 227          $this->resetAfterTest(true);
 228  
 229          $this->setAdminUser();
 230          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 231          $u1 = $this->getDataGenerator()->create_user();
 232  
 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')));
 242  
 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));
 250  
 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));
 270  
 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));
 290  
 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));
 315  
 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));
 335  
 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));
 355  
 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      }
 376  
 377  }