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 39 and 310]

   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   * Event tests.
  19   *
  20   * @package    core_competency
  21   * @copyright  2016 Serge Gauthier <serge.gauthier.2@umontreal.ca>
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  global $CFG;
  27  require_once($CFG->dirroot . '/comment/lib.php');
  28  
  29  use core_competency\api;
  30  use core_competency\url;
  31  
  32  /**
  33   * Event tests.
  34   *
  35   * @package    core_competency
  36   * @copyright  2016 Serge Gauthier <serge.gauthier.2@umontreal.ca>
  37   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  38   */
  39  class core_competency_event_testcase extends advanced_testcase {
  40  
  41      /**
  42       * Test the competency framework created event.
  43       *
  44       */
  45      public function test_competency_framework_created() {
  46          $this->resetAfterTest(true);
  47          $this->setAdminUser();
  48          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
  49  
  50          // Use DataGenerator to have a record framework with the right format.
  51          $record = $lpg->create_framework()->to_record();
  52          $record->id = 0;
  53          $record->shortname = "New shortname";
  54          $record->idnumber = "New idnumber";
  55  
  56          // Trigger and capture the event.
  57          $sink = $this->redirectEvents();
  58          $framework = api::create_framework((object) $record);
  59  
  60          // Get our event event.
  61          $events = $sink->get_events();
  62          $event = reset($events);
  63  
  64          // Check that the event data is valid.
  65          $this->assertInstanceOf('\core\event\competency_framework_created', $event);
  66          $this->assertEquals($framework->get('id'), $event->objectid);
  67          $this->assertEquals($framework->get('contextid'), $event->contextid);
  68          $this->assertEventContextNotUsed($event);
  69          $this->assertDebuggingNotCalled();
  70      }
  71  
  72      /**
  73       * Test the competency framework deleted event.
  74       *
  75       */
  76      public function test_competency_framework_deleted() {
  77          $this->resetAfterTest(true);
  78          $this->setAdminUser();
  79          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
  80  
  81          $framework = $lpg->create_framework();
  82  
  83          // Trigger and capture the event.
  84          $sink = $this->redirectEvents();
  85          api::delete_framework($framework->get('id'));
  86  
  87          // Get our event event.
  88          $events = $sink->get_events();
  89          $event = reset($events);
  90  
  91          // Check that the event data is valid.
  92          $this->assertInstanceOf('\core\event\competency_framework_deleted', $event);
  93          $this->assertEquals($framework->get('id'), $event->objectid);
  94          $this->assertEquals($framework->get('contextid'), $event->contextid);
  95          $this->assertEventContextNotUsed($event);
  96          $this->assertDebuggingNotCalled();
  97      }
  98  
  99      /**
 100       * Test the competency framework updated event.
 101       *
 102       */
 103      public function test_competency_framework_updated() {
 104          $this->resetAfterTest(true);
 105          $this->setAdminUser();
 106          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 107  
 108          $framework = $lpg->create_framework();
 109  
 110          // Trigger and capture the event.
 111          $sink = $this->redirectEvents();
 112          $framework->set('shortname', 'Shortname modified');
 113          api::update_framework($framework->to_record());
 114  
 115          // Get our event event.
 116          $events = $sink->get_events();
 117          $event = reset($events);
 118  
 119          // Check that the event data is valid.
 120          $this->assertInstanceOf('\core\event\competency_framework_updated', $event);
 121          $this->assertEquals($framework->get('id'), $event->objectid);
 122          $this->assertEquals($framework->get('contextid'), $event->contextid);
 123          $this->assertEventContextNotUsed($event);
 124          $this->assertDebuggingNotCalled();
 125      }
 126  
 127      /**
 128       * Test the competency framework viewed event.
 129       *
 130       */
 131      public function test_competency_framework_viewed() {
 132          $this->resetAfterTest(true);
 133          $this->setAdminUser();
 134          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 135  
 136          $framework = $lpg->create_framework();
 137  
 138          // Trigger and capture the event.
 139          $sink = $this->redirectEvents();
 140          api::competency_framework_viewed($framework);
 141  
 142          // Get our event event.
 143          $events = $sink->get_events();
 144          $event = reset($events);
 145  
 146          // Check that the event data is valid.
 147          $this->assertInstanceOf('\core\event\competency_framework_viewed', $event);
 148          $this->assertEquals($framework->get('id'), $event->objectid);
 149          $this->assertEquals($framework->get('contextid'), $event->contextid);
 150          $this->assertEventContextNotUsed($event);
 151          $this->assertDebuggingNotCalled();
 152      }
 153  
 154      /**
 155       * Test the competency viewed event.
 156       *
 157       */
 158      public function test_competency_viewed() {
 159          $this->resetAfterTest(true);
 160          $this->setAdminUser();
 161          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 162          $framework = $lpg->create_framework();
 163          $competency = $lpg->create_competency(array('competencyframeworkid' => $framework->get('id')));
 164  
 165          // Trigger and capture the event.
 166          $sink = $this->redirectEvents();
 167          api::competency_viewed($competency);
 168          // Get our event event.
 169          $events = $sink->get_events();
 170          $event = reset($events);
 171          // Check that the event data is valid.
 172          $this->assertInstanceOf('\core\event\competency_viewed', $event);
 173          $this->assertEquals($competency->get('id'), $event->objectid);
 174          $this->assertEquals($competency->get_context()->id, $event->contextid);
 175          $this->assertEventContextNotUsed($event);
 176          $this->assertDebuggingNotCalled();
 177      }
 178  
 179      /**
 180       * Test the template viewed event.
 181       *
 182       */
 183      public function test_template_viewed() {
 184          $this->resetAfterTest(true);
 185          $this->setAdminUser();
 186          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 187          $template = $lpg->create_template();
 188          // Trigger and capture the event.
 189          $sink = $this->redirectEvents();
 190          api::template_viewed($template);
 191          // Get our event event.
 192          $events = $sink->get_events();
 193          $event = reset($events);
 194          // Check that the event data is valid.
 195          $this->assertInstanceOf('\core\event\competency_template_viewed', $event);
 196          $this->assertEquals($template->get('id'), $event->objectid);
 197          $this->assertEquals($template->get('contextid'), $event->contextid);
 198          $this->assertEventContextNotUsed($event);
 199          $this->assertDebuggingNotCalled();
 200      }
 201  
 202      /**
 203       * Test the template created event.
 204       *
 205       */
 206      public function test_template_created() {
 207          $this->resetAfterTest(true);
 208          $this->setAdminUser();
 209          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 210  
 211          // Use DataGenerator to have a template record with the right format.
 212          $record = $lpg->create_template()->to_record();
 213          $record->id = 0;
 214          $record->shortname = "New shortname";
 215  
 216          // Trigger and capture the event.
 217          $sink = $this->redirectEvents();
 218          $template = api::create_template((object) $record);
 219  
 220          // Get our event event.
 221          $events = $sink->get_events();
 222          $event = reset($events);
 223  
 224          $this->assertInstanceOf('\core\event\competency_template_created', $event);
 225          $this->assertEquals($template->get('id'), $event->objectid);
 226          $this->assertEquals($template->get('contextid'), $event->contextid);
 227          $this->assertEventContextNotUsed($event);
 228          $this->assertDebuggingNotCalled();
 229      }
 230  
 231      /**
 232       * Test the template deleted event.
 233       *
 234       */
 235      public function test_template_deleted() {
 236          $this->resetAfterTest(true);
 237          $this->setAdminUser();
 238          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 239  
 240          $template = $lpg->create_template();
 241  
 242          // Trigger and capture the event.
 243          $sink = $this->redirectEvents();
 244          api::delete_template($template->get('id'));
 245  
 246          // Get our event event.
 247          $events = $sink->get_events();
 248          $event = reset($events);
 249  
 250          // Check that the event data is valid.
 251          $this->assertInstanceOf('\core\event\competency_template_deleted', $event);
 252          $this->assertEquals($template->get('id'), $event->objectid);
 253          $this->assertEquals($template->get('contextid'), $event->contextid);
 254          $this->assertEventContextNotUsed($event);
 255          $this->assertDebuggingNotCalled();
 256      }
 257  
 258      /**
 259       * Test the template updated event.
 260       *
 261       */
 262      public function test_template_updated() {
 263          $this->resetAfterTest(true);
 264          $this->setAdminUser();
 265          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 266  
 267          $template = $lpg->create_template();
 268  
 269          // Trigger and capture the event.
 270          $sink = $this->redirectEvents();
 271          $template->set('shortname', 'Shortname modified');
 272          api::update_template($template->to_record());
 273  
 274          // Get our event event.
 275          $events = $sink->get_events();
 276          $event = reset($events);
 277  
 278          // Check that the event data is valid.
 279          $this->assertInstanceOf('\core\event\competency_template_updated', $event);
 280          $this->assertEquals($template->get('id'), $event->objectid);
 281          $this->assertEquals($template->get('contextid'), $event->contextid);
 282          $this->assertEventContextNotUsed($event);
 283          $this->assertDebuggingNotCalled();
 284      }
 285  
 286      /**
 287       * Test the competency updated event.
 288       *
 289       */
 290      public function test_competency_updated() {
 291          $this->resetAfterTest(true);
 292          $this->setAdminUser();
 293          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 294  
 295          $f1 = $lpg->create_framework();
 296          $competency = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 297          $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 298          $c2 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 299          $c12 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'), 'parentid' => $c1->get('id')));
 300          $c13 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'), 'parentid' => $c1->get('id')));
 301  
 302          // Trigger and capture the event.
 303          $sink = $this->redirectEvents();
 304          $competency->set('shortname', 'Shortname modified');
 305          api::update_competency($competency->to_record());
 306  
 307          // Get our event event.
 308          $events = $sink->get_events();
 309          $event = reset($events);
 310  
 311          // Check that the event data is valid.
 312          $this->assertInstanceOf('\core\event\competency_updated', $event);
 313          $this->assertEquals($competency->get('id'), $event->objectid);
 314          $this->assertEquals($competency->get_context()->id, $event->contextid);
 315          $this->assertEventContextNotUsed($event);
 316          $this->assertDebuggingNotCalled();
 317      }
 318  
 319      /**
 320       * Test the competency created event.
 321       *
 322       */
 323      public function test_competency_created() {
 324          $this->resetAfterTest(true);
 325          $this->setAdminUser();
 326          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 327  
 328          $f1 = $lpg->create_framework();
 329          $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 330          $record = $c1->to_record();
 331          $record->id = 0;
 332          $record->idnumber = 'comp idnumber';
 333  
 334          // Trigger and capture the event.
 335          $sink = $this->redirectEvents();
 336          // Create competency should trigger a created event.
 337          $competency = api::create_competency($record);
 338  
 339          // Get our event event.
 340          $events = $sink->get_events();
 341          $event = reset($events);
 342  
 343          $this->assertInstanceOf('\core\event\competency_created', $event);
 344          $this->assertEquals($competency->get('id'), $event->objectid);
 345          $this->assertEquals($competency->get_context()->id, $event->contextid);
 346          $this->assertEventContextNotUsed($event);
 347          $this->assertDebuggingNotCalled();
 348      }
 349  
 350      /**
 351       * Test the competency created event by duplicate framework.
 352       *
 353       */
 354      public function test_competency_created_by_duplicateframework() {
 355          $this->resetAfterTest(true);
 356          $this->setAdminUser();
 357          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 358  
 359          $f1 = $lpg->create_framework();
 360          $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 361          $c2 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 362          $c12 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'), 'parentid' => $c1->get('id')));
 363  
 364          // Trigger and capture the event.
 365          $sink = $this->redirectEvents();
 366          // Create framework should trigger a created event for competencies.
 367          api::duplicate_framework($f1->get('id'));
 368  
 369          // Get our event event.
 370          $events = $sink->get_events();
 371          $this->assertEquals(4, count($events));
 372  
 373          $event = array_shift($events);
 374          $this->assertInstanceOf('\core\event\competency_created', $event);
 375  
 376          $event = array_shift($events);
 377          $this->assertInstanceOf('\core\event\competency_created', $event);
 378  
 379          $event = array_shift($events);
 380          $this->assertInstanceOf('\core\event\competency_created', $event);
 381  
 382          $event = array_shift($events);
 383          $this->assertInstanceOf('\core\event\competency_framework_created', $event);
 384      }
 385  
 386      /**
 387       * Test the competency deleted event.
 388       *
 389       */
 390      public function test_competency_deleted() {
 391          $this->resetAfterTest(true);
 392          $this->setAdminUser();
 393          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 394  
 395          $f1 = $lpg->create_framework();
 396          $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 397          $c1id = $c1->get('id');
 398          $contextid = $c1->get_context()->id;
 399  
 400          // Trigger and capture the event.
 401          $sink = $this->redirectEvents();
 402          // Delete competency should trigger a deleted event.
 403          api::delete_competency($c1id);
 404  
 405          // Get our event event.
 406          $events = $sink->get_events();
 407          $event = reset($events);
 408  
 409          $this->assertInstanceOf('\core\event\competency_deleted', $event);
 410          $this->assertEquals($c1id, $event->objectid);
 411          $this->assertEquals($contextid, $event->contextid);
 412          $this->assertEventContextNotUsed($event);
 413          $this->assertDebuggingNotCalled();
 414      }
 415  
 416      /**
 417       * Test the competency deleted event by delete framework.
 418       *
 419       */
 420      public function test_competency_deleted_by_deleteframework() {
 421          $this->resetAfterTest(true);
 422          $this->setAdminUser();
 423          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 424  
 425          $f1 = $lpg->create_framework();
 426          $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 427          $c2 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id')));
 428          $c12 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'), 'parentid' => $c1->get('id')));
 429  
 430          // Trigger and capture the event.
 431          $sink = $this->redirectEvents();
 432          // Delete framework should trigger a deleted event for competencies.
 433          api::delete_framework($f1->get('id'));
 434  
 435          // Get our event event.
 436          $events = $sink->get_events();
 437          $this->assertEquals(4, count($events));
 438  
 439          $event = array_shift($events);
 440          $this->assertInstanceOf('\core\event\competency_framework_deleted', $event);
 441  
 442          $event = array_shift($events);
 443          $this->assertInstanceOf('\core\event\competency_deleted', $event);
 444  
 445          $event = array_shift($events);
 446          $this->assertInstanceOf('\core\event\competency_deleted', $event);
 447  
 448          $event = array_shift($events);
 449          $this->assertInstanceOf('\core\event\competency_deleted', $event);
 450      }
 451  
 452      /**
 453       * Test the plan created event.
 454       *
 455       */
 456      public function test_plan_created() {
 457          $this->resetAfterTest(true);
 458          $this->setAdminUser();
 459          $dg = $this->getDataGenerator();
 460          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 461          $user = $dg->create_user();
 462          $plan = array (
 463              'name' => 'plan',
 464              'userid' => $user->id
 465          );
 466          // Trigger and capture the event.
 467          $sink = $this->redirectEvents();
 468          $plan = api::create_plan((object)$plan);
 469          // Get our event event.
 470          $events = $sink->get_events();
 471          $event = reset($events);
 472          // Check that the event data is valid.
 473          $this->assertInstanceOf('\core\event\competency_plan_created', $event);
 474          $this->assertEquals($plan->get('id'), $event->objectid);
 475          $this->assertEquals($plan->get_context()->id, $event->contextid);
 476          $this->assertEventContextNotUsed($event);
 477          $this->assertDebuggingNotCalled();
 478      }
 479  
 480      /**
 481       * Test the plan created event using template_cohort.
 482       *
 483       */
 484      public function test_plan_created_using_templatecohort() {
 485          $this->resetAfterTest(true);
 486          $this->setAdminUser();
 487          $dg = $this->getDataGenerator();
 488          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 489          $user1 = $dg->create_user();
 490          $user2 = $dg->create_user();
 491          $c1 = $dg->create_cohort();
 492          // Add 2 users to the cohort.
 493          cohort_add_member($c1->id, $user1->id);
 494          cohort_add_member($c1->id, $user2->id);
 495          $t1 = $lpg->create_template();
 496          $tc = $lpg->create_template_cohort(array(
 497              'templateid' => $t1->get('id'),
 498              'cohortid' => $c1->id
 499          ));
 500          // Trigger and capture the event.
 501          $sink = $this->redirectEvents();
 502          api::create_plans_from_template_cohort($t1->get('id'), $c1->id);
 503          // Get our event event.
 504          $plans = core_competency\plan::get_records(array('templateid' => $t1->get('id')), 'id');
 505          $events = $sink->get_events();
 506          $this->assertCount(2, $events);
 507          $this->assertCount(2, $plans);
 508          $event = $events[0];
 509          $plan = $plans[0];
 510          // Check that the event data is valid.
 511          $this->assertInstanceOf('\core\event\competency_plan_created', $event);
 512          $this->assertEquals($plan->get('id'), $event->objectid);
 513          $this->assertEquals($plan->get_context()->id, $event->contextid);
 514          $event = $events[1];
 515          $plan = $plans[1];
 516          $this->assertInstanceOf('\core\event\competency_plan_created', $event);
 517          $this->assertEquals($plan->get('id'), $event->objectid);
 518          $this->assertEquals($plan->get_context()->id, $event->contextid);
 519          $this->assertEventContextNotUsed($event);
 520          $this->assertDebuggingNotCalled();
 521      }
 522  
 523      /**
 524       * Test the plan updated event.
 525       *
 526       */
 527      public function test_plan_updated() {
 528          $this->resetAfterTest(true);
 529          $this->setAdminUser();
 530          $dg = $this->getDataGenerator();
 531          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 532          $user1 = $dg->create_user();
 533          $plan = $lpg->create_plan(array('userid' => $user1->id));
 534          $record = $plan->to_record();
 535          $record->name = 'Plan updated';
 536          // Trigger and capture the event.
 537          $sink = $this->redirectEvents();
 538          $plan = api::update_plan($record);
 539          $this->assertEquals('Plan updated', $plan->get('name'));
 540  
 541          // Get our event event.
 542          $events = $sink->get_events();
 543          $event = reset($events);
 544          $this->assertInstanceOf('\core\event\competency_plan_updated', $event);
 545          $this->assertEquals($plan->get('id'), $event->objectid);
 546          $this->assertEquals($plan->get_context()->id, $event->contextid);
 547          $this->assertEventContextNotUsed($event);
 548          $this->assertDebuggingNotCalled();
 549      }
 550  
 551      /**
 552       * Test the plan deleted event.
 553       *
 554       */
 555      public function test_plan_deleted() {
 556          $this->resetAfterTest(true);
 557          $this->setAdminUser();
 558          $dg = $this->getDataGenerator();
 559          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 560          $user1 = $dg->create_user();
 561          $plan = $lpg->create_plan(array('userid' => $user1->id));
 562          $planid = $plan->get('id');
 563          $contextid = $plan->get_context()->id;
 564          // Trigger and capture the event.
 565          $sink = $this->redirectEvents();
 566          $result = api::delete_plan($plan->get('id'));
 567          $this->assertTrue($result);
 568          // Get our event event.
 569          $events = $sink->get_events();
 570          $event = reset($events);
 571          $this->assertInstanceOf('\core\event\competency_plan_deleted', $event);
 572          $this->assertEquals($planid, $event->objectid);
 573          $this->assertEquals($contextid, $event->contextid);
 574          $this->assertEventContextNotUsed($event);
 575          $this->assertDebuggingNotCalled();
 576      }
 577  
 578      /**
 579       * Test the plan viewed event.
 580       *
 581       */
 582      public function test_plan_viewed() {
 583          $this->resetAfterTest(true);
 584          $this->setAdminUser();
 585          $dg = $this->getDataGenerator();
 586          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 587          $user1 = $dg->create_user();
 588          $plan = $lpg->create_plan(array('userid' => $user1->id));
 589          // Trigger and capture the event.
 590          $sink = $this->redirectEvents();
 591          api::plan_viewed($plan);
 592          // Get our event event.
 593          $events = $sink->get_events();
 594          $event = reset($events);
 595          // Check that the event data is valid.
 596          $this->assertInstanceOf('\core\event\competency_plan_viewed', $event);
 597          $this->assertEquals($plan->get('id'), $event->objectid);
 598          $this->assertEquals($plan->get_context()->id, $event->contextid);
 599          $this->assertEventContextNotUsed($event);
 600          $this->assertDebuggingNotCalled();
 601      }
 602  
 603      /**
 604       * Test the evidence of prior learning created event.
 605       *
 606       */
 607      public function test_user_evidence_created() {
 608          $this->resetAfterTest(true);
 609          $this->setAdminUser();
 610          $dg = $this->getDataGenerator();
 611          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 612  
 613          $user = $dg->create_user();
 614          // Use DataGenerator to have a user_evidence record with the right format.
 615          $record = $userevidence = $lpg->create_user_evidence(array('userid' => $user->id))->to_record();
 616          $record->id = 0;
 617          $record->name = "New name";
 618  
 619          // Trigger and capture the event.
 620          $sink = $this->redirectEvents();
 621          $userevidence = api::create_user_evidence((object) $record);
 622  
 623           // Get our event event.
 624          $events = $sink->get_events();
 625          $event = reset($events);
 626  
 627          $this->assertInstanceOf('\core\event\competency_user_evidence_created', $event);
 628          $this->assertEquals($userevidence->get('id'), $event->objectid);
 629          $this->assertEquals($userevidence->get_context()->id, $event->contextid);
 630          $this->assertEventContextNotUsed($event);
 631          $this->assertDebuggingNotCalled();
 632      }
 633  
 634      /**
 635       * Test the evidence of prior learning  deleted event.
 636       *
 637       */
 638      public function test_user_evidence_deleted() {
 639          $this->resetAfterTest(true);
 640          $this->setAdminUser();
 641          $dg = $this->getDataGenerator();
 642          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 643  
 644          $user = $dg->create_user();
 645          $userevidence = $lpg->create_user_evidence(array('userid' => $user->id));
 646  
 647          // Trigger and capture the event.
 648          $sink = $this->redirectEvents();
 649          api::delete_user_evidence($userevidence->get('id'));
 650  
 651          // Get our event event.
 652          $events = $sink->get_events();
 653          $event = reset($events);
 654  
 655          // Check that the event data is valid.
 656          $this->assertInstanceOf('\core\event\competency_user_evidence_deleted', $event);
 657          $this->assertEquals($userevidence->get('id'), $event->objectid);
 658          $this->assertEquals($userevidence->get_context()->id, $event->contextid);
 659          $this->assertEventContextNotUsed($event);
 660          $this->assertDebuggingNotCalled();
 661      }
 662  
 663      /**
 664       * Test the evidence of prior learning  updated event.
 665       *
 666       */
 667      public function test_user_evidence_updated() {
 668          $this->resetAfterTest(true);
 669          $this->setAdminUser();
 670          $dg = $this->getDataGenerator();
 671          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 672  
 673          $user = $dg->create_user();
 674          $userevidence = $lpg->create_user_evidence(array('userid' => $user->id));
 675  
 676          // Trigger and capture the event.
 677          $sink = $this->redirectEvents();
 678          $userevidence->set('name', 'Name modified');
 679          api::update_user_evidence($userevidence->to_record());
 680  
 681           // Get our event event.
 682          $events = $sink->get_events();
 683          $event = reset($events);
 684  
 685          // Check that the event data is valid.
 686          $this->assertInstanceOf('\core\event\competency_user_evidence_updated', $event);
 687          $this->assertEquals($userevidence->get('id'), $event->objectid);
 688          $this->assertEquals($userevidence->get_context()->id, $event->contextid);
 689          $this->assertEventContextNotUsed($event);
 690          $this->assertDebuggingNotCalled();
 691      }
 692  
 693      /**
 694       * Test the user competency viewed event in plan.
 695       *
 696       */
 697      public function test_user_competency_viewed_in_plan() {
 698          $this->resetAfterTest(true);
 699          $this->setAdminUser();
 700          $dg = $this->getDataGenerator();
 701          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 702          $user = $dg->create_user();
 703          $plan = $lpg->create_plan(array('userid' => $user->id));
 704          $fr = $lpg->create_framework();
 705          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
 706          $pc = $lpg->create_plan_competency(array('planid' => $plan->get('id'), 'competencyid' => $c->get('id')));
 707          $uc = $lpg->create_user_competency(array('userid' => $user->id, 'competencyid' => $c->get('id')));
 708  
 709          // Can not log the event for user competency using completed plan.
 710          api::complete_plan($plan);
 711  
 712          try {
 713              api::user_competency_viewed_in_plan($uc, $plan->get('id'));
 714              $this->fail('To log the user competency in completed plan '
 715                      . 'use user_competency_plan_viewed method.');
 716          } catch (coding_exception $e) {
 717              $this->assertRegExp('/To log the user competency in completed plan '
 718                      . 'use user_competency_plan_viewed method./', $e->getMessage());
 719          }
 720  
 721          api::reopen_plan($plan);
 722          // Trigger and capture the event.
 723          $sink = $this->redirectEvents();
 724          api::user_competency_viewed_in_plan($uc, $plan->get('id'));
 725  
 726          // Get our event event.
 727          $events = $sink->get_events();
 728          $event = reset($events);
 729  
 730          // Check that the event data is valid.
 731          $this->assertInstanceOf('\core\event\competency_user_competency_viewed_in_plan', $event);
 732          $this->assertEquals($uc->get('id'), $event->objectid);
 733          $this->assertEquals($uc->get_context()->id, $event->contextid);
 734          $this->assertEquals($uc->get('userid'), $event->relateduserid);
 735          $this->assertEquals($plan->get('id'), $event->other['planid']);
 736          $this->assertEquals($c->get('id'), $event->other['competencyid']);
 737  
 738          $this->assertEventContextNotUsed($event);
 739          $this->assertDebuggingNotCalled();
 740  
 741          // Test validation.
 742          $params = array (
 743              'objectid' => $uc->get('id'),
 744              'contextid' => $uc->get_context()->id,
 745              'other' => null
 746          );
 747  
 748          // Other value null.
 749          try {
 750              \core\event\competency_user_competency_viewed_in_plan::create($params)->trigger();
 751              $this->fail('The \'competencyid\' and \'planid\' values must be set.');
 752          } catch (coding_exception $e) {
 753              $this->assertRegExp("/The 'competencyid' and 'planid' values must be set./", $e->getMessage());
 754          }
 755  
 756          $params['other']['anythingelse'] = '';
 757          // Missing competencyid.
 758          try {
 759              \core\event\competency_user_competency_viewed_in_plan::create($params)->trigger();
 760              $this->fail('The \'competencyid\' value must be set.');
 761          } catch (coding_exception $e) {
 762              $this->assertRegExp("/The 'competencyid' value must be set./", $e->getMessage());
 763          }
 764  
 765          $params['other']['competencyid'] = $c->get('id');
 766          // Missing planid.
 767          try {
 768              \core\event\competency_user_competency_viewed_in_plan::create($params)->trigger();
 769              $this->fail('The \'planid\' value must be set.');
 770          } catch (coding_exception $e) {
 771              $this->assertRegExp("/The 'planid' value must be set./", $e->getMessage());
 772          }
 773      }
 774  
 775      /**
 776       * Test the user competency viewed event in course.
 777       *
 778       */
 779      public function test_user_competency_viewed_in_course() {
 780          $this->resetAfterTest(true);
 781          $this->setAdminUser();
 782          $dg = $this->getDataGenerator();
 783          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 784          $user = $dg->create_user();
 785          $course = $dg->create_course();
 786          $fr = $lpg->create_framework();
 787          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
 788          $pc = $lpg->create_course_competency(array('courseid' => $course->id, 'competencyid' => $c->get('id')));
 789          $params = array('userid' => $user->id, 'competencyid' => $c->get('id'), 'courseid' => $course->id);
 790          $ucc = $lpg->create_user_competency_course($params);
 791  
 792          // Trigger and capture the event.
 793          $sink = $this->redirectEvents();
 794          api::user_competency_viewed_in_course($ucc);
 795  
 796          // Get our event event.
 797          $events = $sink->get_events();
 798          $event = reset($events);
 799  
 800          // Check that the event data is valid.
 801          $this->assertInstanceOf('\core\event\competency_user_competency_viewed_in_course', $event);
 802          $this->assertEquals($ucc->get('id'), $event->objectid);
 803          $this->assertEquals(context_course::instance($course->id)->id, $event->contextid);
 804          $this->assertEquals($ucc->get('userid'), $event->relateduserid);
 805          $this->assertEquals($course->id, $event->courseid);
 806          $this->assertEquals($c->get('id'), $event->other['competencyid']);
 807  
 808          $this->assertEventContextNotUsed($event);
 809          $this->assertDebuggingNotCalled();
 810  
 811          // Test validation.
 812          $params = array (
 813              'objectid' => $ucc->get('id'),
 814              'contextid' => $ucc->get_context()->id,
 815              'other' => null
 816          );
 817  
 818          // Missing courseid.
 819          try {
 820              \core\event\competency_user_competency_viewed_in_course::create($params)->trigger();
 821              $this->fail('The \'courseid\' value must be set.');
 822          } catch (coding_exception $e) {
 823              $this->assertRegExp("/The 'courseid' value must be set./", $e->getMessage());
 824          }
 825  
 826          $params['contextid'] = context_course::instance($course->id)->id;
 827          $params['courseid'] = $course->id;
 828          // Missing competencyid.
 829          try {
 830              \core\event\competency_user_competency_viewed_in_course::create($params)->trigger();
 831              $this->fail('The \'competencyid\' value must be set.');
 832          } catch (coding_exception $e) {
 833              $this->assertRegExp("/The 'competencyid' value must be set./", $e->getMessage());
 834          }
 835      }
 836  
 837      /**
 838       * Test the user competency plan viewed event.
 839       *
 840       */
 841      public function test_user_competency_plan_viewed() {
 842          $this->resetAfterTest(true);
 843          $this->setAdminUser();
 844          $dg = $this->getDataGenerator();
 845          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 846          $user = $dg->create_user();
 847          $plan = $lpg->create_plan(array('userid' => $user->id));
 848          $fr = $lpg->create_framework();
 849          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
 850          $ucp = $lpg->create_user_competency_plan(array(
 851              'userid' => $user->id,
 852              'competencyid' => $c->get('id'),
 853              'planid' => $plan->get('id')
 854          ));
 855  
 856          // Can not log the event for user competency using non completed plan.
 857          try {
 858              api::user_competency_plan_viewed($ucp);
 859              $this->fail('To log the user competency in non-completed plan '
 860                      . 'use user_competency_viewed_in_plan method.');
 861          } catch (coding_exception $e) {
 862              $this->assertRegExp('/To log the user competency in non-completed plan '
 863                      . 'use user_competency_viewed_in_plan method./', $e->getMessage());
 864          }
 865  
 866          // Complete the plan.
 867          api::complete_plan($plan);
 868  
 869          // Trigger and capture the event.
 870          $sink = $this->redirectEvents();
 871          api::user_competency_plan_viewed($ucp);
 872  
 873          // Get our event event.
 874          $events = $sink->get_events();
 875          $event = reset($events);
 876  
 877          // Check that the event data is valid.
 878          $this->assertInstanceOf('\core\event\competency_user_competency_plan_viewed', $event);
 879          $this->assertEquals($ucp->get('id'), $event->objectid);
 880          $this->assertEquals($ucp->get_context()->id, $event->contextid);
 881          $this->assertEquals($ucp->get('userid'), $event->relateduserid);
 882          $this->assertEquals($plan->get('id'), $event->other['planid']);
 883          $this->assertEquals($c->get('id'), $event->other['competencyid']);
 884  
 885          $this->assertEventContextNotUsed($event);
 886          $this->assertDebuggingNotCalled();
 887  
 888          // Test validation.
 889          $params = array (
 890              'objectid' => $ucp->get('id'),
 891              'contextid' => $ucp->get_context()->id,
 892              'other' => null
 893          );
 894  
 895          // Other value null.
 896          try {
 897              \core\event\competency_user_competency_plan_viewed::create($params)->trigger();
 898              $this->fail('The \'competencyid\' and \'planid\' values must be set.');
 899          } catch (coding_exception $e) {
 900              $this->assertRegExp("/The 'competencyid' and 'planid' values must be set./", $e->getMessage());
 901          }
 902  
 903          $params['other']['anythingelse'] = '';
 904          // Missing competencyid.
 905          try {
 906              \core\event\competency_user_competency_plan_viewed::create($params)->trigger();
 907              $this->fail('The \'competencyid\' value must be set.');
 908          } catch (coding_exception $e) {
 909              $this->assertRegExp("/The 'competencyid' value must be set./", $e->getMessage());
 910          }
 911  
 912          $params['other']['competencyid'] = $c->get('id');
 913          // Missing planid.
 914          try {
 915              \core\event\competency_user_competency_plan_viewed::create($params)->trigger();
 916              $this->fail('The \'planid\' value must be set.');
 917          } catch (coding_exception $e) {
 918              $this->assertRegExp("/The 'planid' value must be set./", $e->getMessage());
 919          }
 920      }
 921  
 922      /**
 923       * Test the user competency viewed event.
 924       *
 925       */
 926      public function test_user_competency_viewed() {
 927          $this->resetAfterTest(true);
 928          $this->setAdminUser();
 929          $dg = $this->getDataGenerator();
 930          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 931          $user = $dg->create_user();
 932          $fr = $lpg->create_framework();
 933          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
 934          $uc = $lpg->create_user_competency(array(
 935              'userid' => $user->id,
 936              'competencyid' => $c->get('id')
 937          ));
 938  
 939          // Trigger and capture the event.
 940          $sink = $this->redirectEvents();
 941          api::user_competency_viewed($uc);
 942  
 943          // Get our event event.
 944          $events = $sink->get_events();
 945          $event = reset($events);
 946  
 947          // Check that the event data is valid.
 948          $this->assertInstanceOf('\core\event\competency_user_competency_viewed', $event);
 949          $this->assertEquals($uc->get('id'), $event->objectid);
 950          $this->assertEquals($uc->get_context()->id, $event->contextid);
 951          $this->assertEquals($uc->get('userid'), $event->relateduserid);
 952          $this->assertEquals($c->get('id'), $event->other['competencyid']);
 953  
 954          $this->assertEventContextNotUsed($event);
 955          $this->assertDebuggingNotCalled();
 956  
 957          // Test validation.
 958          $params = array (
 959              'objectid' => $uc->get('id'),
 960              'contextid' => $uc->get_context()->id
 961          );
 962  
 963          // Missing competencyid.
 964          try {
 965              \core\event\competency_user_competency_viewed::create($params)->trigger();
 966              $this->fail('The \'competencyid\' value must be set.');
 967          } catch (coding_exception $e) {
 968              $this->assertRegExp("/The 'competencyid' value must be set./", $e->getMessage());
 969          }
 970      }
 971  
 972      /**
 973       * Test the plan approved event.
 974       *
 975       */
 976      public function test_plan_approved() {
 977          $this->resetAfterTest(true);
 978          $this->setAdminUser();
 979          $dg = $this->getDataGenerator();
 980          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
 981          $user1 = $dg->create_user();
 982          $plan = $lpg->create_plan(array('userid' => $user1->id));
 983          $planid = $plan->get('id');
 984          $contextid = $plan->get_context()->id;
 985          // Trigger and capture the event.
 986          $sink = $this->redirectEvents();
 987          $result = api::approve_plan($plan->get('id'));
 988          $this->assertTrue($result);
 989          // Get our event event.
 990          $events = $sink->get_events();
 991          $event = reset($events);
 992          $this->assertInstanceOf('\core\event\competency_plan_approved', $event);
 993          $this->assertEquals($planid, $event->objectid);
 994          $this->assertEquals($contextid, $event->contextid);
 995          $this->assertEquals($plan->get('userid'), $event->relateduserid);
 996          $this->assertEventContextNotUsed($event);
 997          $this->assertDebuggingNotCalled();
 998      }
 999  
1000      /**
1001       * Test the plan unapproved event.
1002       *
1003       */
1004      public function test_plan_unapproved() {
1005          $this->resetAfterTest(true);
1006          $this->setAdminUser();
1007          $dg = $this->getDataGenerator();
1008          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1009          $user1 = $dg->create_user();
1010          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_ACTIVE));
1011          $planid = $plan->get('id');
1012          $contextid = $plan->get_context()->id;
1013          // Trigger and capture the event.
1014          $sink = $this->redirectEvents();
1015          $result = api::unapprove_plan($plan->get('id'));
1016          $this->assertTrue($result);
1017          // Get our event event.
1018          $events = $sink->get_events();
1019          $event = reset($events);
1020          $this->assertInstanceOf('\core\event\competency_plan_unapproved', $event);
1021          $this->assertEquals($planid, $event->objectid);
1022          $this->assertEquals($contextid, $event->contextid);
1023          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1024          $this->assertEventContextNotUsed($event);
1025          $this->assertDebuggingNotCalled();
1026      }
1027  
1028      /**
1029       * Test the plan reopened event.
1030       *
1031       */
1032      public function test_plan_reopened() {
1033          $this->resetAfterTest(true);
1034          $this->setAdminUser();
1035          $dg = $this->getDataGenerator();
1036          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1037          $user1 = $dg->create_user();
1038          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_COMPLETE));
1039          $planid = $plan->get('id');
1040          $contextid = $plan->get_context()->id;
1041          // Trigger and capture the event.
1042          $sink = $this->redirectEvents();
1043          $result = api::reopen_plan($plan->get('id'));
1044          $this->assertTrue($result);
1045          // Get our event event.
1046          $events = $sink->get_events();
1047          $event = reset($events);
1048          $this->assertInstanceOf('\core\event\competency_plan_reopened', $event);
1049          $this->assertEquals($planid, $event->objectid);
1050          $this->assertEquals($contextid, $event->contextid);
1051          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1052          $this->assertEventContextNotUsed($event);
1053          $this->assertDebuggingNotCalled();
1054      }
1055  
1056      /**
1057       * Test the plan completed event.
1058       *
1059       */
1060      public function test_plan_completed() {
1061          $this->resetAfterTest(true);
1062          $this->setAdminUser();
1063          $dg = $this->getDataGenerator();
1064          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1065          $user1 = $dg->create_user();
1066          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_ACTIVE));
1067          $planid = $plan->get('id');
1068          $contextid = $plan->get_context()->id;
1069          // Trigger and capture the event.
1070          $sink = $this->redirectEvents();
1071          $result = api::complete_plan($plan->get('id'));
1072          $this->assertTrue($result);
1073          // Get our event event.
1074          $events = $sink->get_events();
1075          $event = reset($events);
1076          $this->assertInstanceOf('\core\event\competency_plan_completed', $event);
1077          $this->assertEquals($planid, $event->objectid);
1078          $this->assertEquals($contextid, $event->contextid);
1079          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1080          $this->assertEventContextNotUsed($event);
1081          $this->assertDebuggingNotCalled();
1082      }
1083  
1084      /**
1085       * Test the plan unlinked event.
1086       *
1087       */
1088      public function test_plan_unlinked() {
1089          $this->resetAfterTest(true);
1090          $this->setAdminUser();
1091          $dg = $this->getDataGenerator();
1092          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1093          $user1 = $dg->create_user();
1094          $template = $lpg->create_template();
1095          $plan = $lpg->create_plan(array(
1096              'userid' => $user1->id,
1097              'status' => \core_competency\plan::STATUS_ACTIVE,
1098              'templateid' => $template->get('id')
1099          ));
1100          $planid = $plan->get('id');
1101          $contextid = $plan->get_context()->id;
1102          // Trigger and capture the event.
1103          $sink = $this->redirectEvents();
1104          $result = api::unlink_plan_from_template($plan->get('id'));
1105          $this->assertTrue($result);
1106          // Get our event event.
1107          $events = $sink->get_events();
1108          $event = reset($events);
1109          $this->assertInstanceOf('\core\event\competency_plan_unlinked', $event);
1110          $this->assertEquals($planid, $event->objectid);
1111          $this->assertEquals($contextid, $event->contextid);
1112          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1113          $this->assertEventContextNotUsed($event);
1114          $this->assertDebuggingNotCalled();
1115      }
1116  
1117      /**
1118       * Test the plan review requested event.
1119       *
1120       */
1121      public function test_plan_review_requested() {
1122          $this->resetAfterTest(true);
1123          $this->setAdminUser();
1124          $dg = $this->getDataGenerator();
1125          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1126          $user1 = $dg->create_user();
1127          $plan = $lpg->create_plan(array('userid' => $user1->id));
1128          $planid = $plan->get('id');
1129          $contextid = $plan->get_context()->id;
1130          // Trigger and capture the event.
1131          $sink = $this->redirectEvents();
1132          $result = api::plan_request_review($plan->get('id'));
1133          $this->assertTrue($result);
1134          // Get our event event.
1135          $events = $sink->get_events();
1136          $event = reset($events);
1137          $this->assertInstanceOf('\core\event\competency_plan_review_requested', $event);
1138          $this->assertEquals($planid, $event->objectid);
1139          $this->assertEquals($contextid, $event->contextid);
1140          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1141          $this->assertEventContextNotUsed($event);
1142          $this->assertDebuggingNotCalled();
1143      }
1144  
1145      /**
1146       * Test the plan review request cancelled event.
1147       *
1148       */
1149      public function test_plan_review_request_cancelled() {
1150          $this->resetAfterTest(true);
1151          $this->setAdminUser();
1152          $dg = $this->getDataGenerator();
1153          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1154          $user1 = $dg->create_user();
1155          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_WAITING_FOR_REVIEW));
1156          $planid = $plan->get('id');
1157          $contextid = $plan->get_context()->id;
1158          // Trigger and capture the event.
1159          $sink = $this->redirectEvents();
1160          $result = api::plan_cancel_review_request($plan->get('id'));
1161          $this->assertTrue($result);
1162          // Get our event event.
1163          $events = $sink->get_events();
1164          $event = reset($events);
1165          $this->assertInstanceOf('\core\event\competency_plan_review_request_cancelled', $event);
1166          $this->assertEquals($planid, $event->objectid);
1167          $this->assertEquals($contextid, $event->contextid);
1168          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1169          $this->assertEventContextNotUsed($event);
1170          $this->assertDebuggingNotCalled();
1171      }
1172  
1173      /**
1174       * Test the plan review started event.
1175       *
1176       */
1177      public function test_plan_review_started() {
1178          $this->resetAfterTest(true);
1179          $this->setAdminUser();
1180          $dg = $this->getDataGenerator();
1181          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1182          $user1 = $dg->create_user();
1183          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_WAITING_FOR_REVIEW));
1184          $planid = $plan->get('id');
1185          $contextid = $plan->get_context()->id;
1186          // Trigger and capture the event.
1187          $sink = $this->redirectEvents();
1188          $result = api::plan_start_review($plan->get('id'));
1189          $this->assertTrue($result);
1190          // Get our event event.
1191          $events = $sink->get_events();
1192          $event = reset($events);
1193          $this->assertInstanceOf('\core\event\competency_plan_review_started', $event);
1194          $this->assertEquals($planid, $event->objectid);
1195          $this->assertEquals($contextid, $event->contextid);
1196          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1197          $this->assertEventContextNotUsed($event);
1198          $this->assertDebuggingNotCalled();
1199      }
1200  
1201      /**
1202       * Test the plan review stopped event.
1203       *
1204       */
1205      public function test_plan_review_stopped() {
1206          $this->resetAfterTest(true);
1207          $this->setAdminUser();
1208          $dg = $this->getDataGenerator();
1209          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1210          $user1 = $dg->create_user();
1211          $plan = $lpg->create_plan(array('userid' => $user1->id, 'status' => \core_competency\plan::STATUS_IN_REVIEW));
1212          $planid = $plan->get('id');
1213          $contextid = $plan->get_context()->id;
1214          // Trigger and capture the event.
1215          $sink = $this->redirectEvents();
1216          $result = api::plan_stop_review($plan->get('id'));
1217          $this->assertTrue($result);
1218          // Get our event event.
1219          $events = $sink->get_events();
1220          $event = reset($events);
1221          $this->assertInstanceOf('\core\event\competency_plan_review_stopped', $event);
1222          $this->assertEquals($planid, $event->objectid);
1223          $this->assertEquals($contextid, $event->contextid);
1224          $this->assertEquals($plan->get('userid'), $event->relateduserid);
1225          $this->assertEventContextNotUsed($event);
1226          $this->assertDebuggingNotCalled();
1227      }
1228  
1229      /**
1230       * Test plan comment created event.
1231       */
1232      public function test_plan_comment_created() {
1233          $this->resetAfterTest(true);
1234          $dg = $this->getDataGenerator();
1235          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1236          $user = $dg->create_user();
1237          $this->setUser($user);
1238          $plan = $lpg->create_plan(array('userid' => $user->id));
1239          $context = context_user::instance($user->id);
1240  
1241          $cmt = new stdClass();
1242          $cmt->context = $context;
1243          $cmt->area = 'plan';
1244          $cmt->itemid = $plan->get('id');
1245          $cmt->component = 'competency';
1246          $cmt->showcount = 1;
1247          $manager = new comment($cmt);
1248          $manager->set_post_permission(true);
1249  
1250          // Triggering and capturing the event.
1251          $sink = $this->redirectEvents();
1252          $manager->add("New comment for plan");
1253          $events = $sink->get_events();
1254          // Add comment will trigger 2 other events message_viewed and message_sent.
1255          $this->assertCount(1, $events);
1256          $event = array_pop($events);
1257  
1258          // Checking that the event contains the expected values.
1259          $this->assertInstanceOf('\core\event\competency_comment_created', $event);
1260          $this->assertEquals($context, $event->get_context());
1261          $this->assertEquals($plan->get('id'), $event->other['itemid']);
1262          $this->assertEventContextNotUsed($event);
1263          $this->assertDebuggingNotCalled();
1264      }
1265  
1266      /**
1267       * Test plan comment deleted event.
1268       */
1269      public function test_plan_comment_deleted() {
1270          $this->resetAfterTest(true);
1271          $this->setAdminUser();
1272          $dg = $this->getDataGenerator();
1273          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1274          $user1 = $dg->create_user();
1275          $plan = $lpg->create_plan(array('userid' => $user1->id));
1276  
1277          $context = context_user::instance($user1->id);
1278  
1279          $cmt = new stdClass();
1280          $cmt->context = $context;
1281          $cmt->area = 'plan';
1282          $cmt->itemid = $plan->get('id');
1283          $cmt->component = 'competency';
1284          $manager = new comment($cmt);
1285          $newcomment = $manager->add("Comment to be deleted");
1286  
1287          // Triggering and capturing the event.
1288          $sink = $this->redirectEvents();
1289          $manager->delete($newcomment->id);
1290          $events = $sink->get_events();
1291          $this->assertCount(1, $events);
1292          $event = reset($events);
1293  
1294          // Checking that the event contains the expected values.
1295          $this->assertInstanceOf('\core\event\competency_comment_deleted', $event);
1296          $this->assertEquals($context, $event->get_context());
1297          $this->assertEquals($plan->get('id'), $event->other['itemid']);
1298          $this->assertEventContextNotUsed($event);
1299          $this->assertDebuggingNotCalled();
1300      }
1301  
1302      /**
1303       * Test evidence_created event.
1304       */
1305      public function test_evidence_created() {
1306          global $USER;
1307  
1308          $this->resetAfterTest(true);
1309          $dg = $this->getDataGenerator();
1310          $syscontext = context_system::instance();
1311  
1312          // Create a student.
1313          $student = $dg->create_user();
1314  
1315          // Create a competency for the course.
1316          $lpg = $dg->get_plugin_generator('core_competency');
1317          $framework = $lpg->create_framework();
1318          $comp = $lpg->create_competency(['competencyframeworkid' => $framework->get('id')]);
1319  
1320          // Trigger and capture the event.
1321          $sink = $this->redirectEvents();
1322  
1323          // Add evidence.
1324          $recommend = false;
1325          $evidence = api::add_evidence($student->id, $comp, $syscontext, \core_competency\evidence::ACTION_OVERRIDE,
1326              'commentincontext', 'core', null, $recommend, null, 1);
1327  
1328          // Get event.
1329          $events = $sink->get_events();
1330          $event = reset($events);
1331  
1332          // Check that the event data is valid.
1333          $this->assertInstanceOf('\core\event\competency_evidence_created', $event);
1334          $this->assertEquals($evidence->get('contextid'), $event->contextid);
1335          $this->assertEquals($evidence->get('id'), $event->objectid);
1336          $this->assertEquals($evidence->get('actionuserid'), $event->userid);
1337          $this->assertEquals($student->id, $event->relateduserid);
1338          $this->assertEquals($evidence->get('usercompetencyid'), $event->other['usercompetencyid']);
1339          $this->assertEquals($comp->get('id'), $event->other['competencyid']);
1340          $this->assertEquals($evidence->get('action'), $event->other['action']);
1341          $this->assertEquals($recommend, $event->other['recommend']);
1342  
1343          // Test get_name().
1344          $this->assertEquals(get_string('eventevidencecreated', 'core_competency'), $event->get_name());
1345  
1346          // Test get_description().
1347          $description = "The user with id '$USER->id' created an evidence with id '{$evidence->get('id')}'.";
1348          $this->assertEquals($description, $event->get_description());
1349  
1350          // Test get_url().
1351          $url = url::user_competency($evidence->get('usercompetencyid'));
1352          $this->assertEquals($url, $event->get_url());
1353  
1354          // Test get_objectid_mapping().
1355          $this->assertEquals(\core\event\base::NOT_MAPPED, $event->get_objectid_mapping());
1356  
1357          $this->assertEventContextNotUsed($event);
1358          $this->assertDebuggingNotCalled();
1359      }
1360  
1361      /**
1362       * Test evidence_created event by linking an invalid user competency to an evidence.
1363       */
1364      public function test_evidence_created_with_invalid_user_competency() {
1365          $this->resetAfterTest(true);
1366          $dg = $this->getDataGenerator();
1367          $syscontext = context_system::instance();
1368  
1369          // Create students.
1370          $student = $dg->create_user();
1371          $student2 = $dg->create_user();
1372  
1373          // Create a competency for the course.
1374          $lpg = $dg->get_plugin_generator('core_competency');
1375          $framework = $lpg->create_framework();
1376          $comp = $lpg->create_competency(['competencyframeworkid' => $framework->get('id')]);
1377  
1378          // Create a different user competency.
1379          $otheruc = \core_competency\user_competency::create_relation($student2->id, $comp->get('id'));
1380          $otheruc->create();
1381  
1382          // Add evidence.
1383          $recommend = false;
1384          $evidence = api::add_evidence($student->id, $comp, $syscontext, \core_competency\evidence::ACTION_OVERRIDE,
1385              'commentincontext', 'core', null, $recommend, null, 1);
1386  
1387          // We expect this to fail and throw a coding exception.
1388          $this->expectException('coding_exception');
1389          $this->expectExceptionMessage('The user competency linked with this evidence is invalid.');
1390          \core\event\competency_evidence_created::create_from_evidence($evidence, $otheruc, $recommend)->trigger();
1391      }
1392  
1393      /**
1394       * Test creation of evidence_created event with missing data.
1395       *
1396       * These data are validated by \core_competency\evidence_created::validate_data().
1397       */
1398      public function test_evidence_created_with_missing_data() {
1399          $eventdata = [
1400              'contextid'  => 1,
1401              'objectid' => 1,
1402              'userid' => 1
1403          ];
1404  
1405          // No relateduserid.
1406          $errormsg = 'The \'relateduserid\' must be set.';
1407          try {
1408              \core\event\competency_evidence_created::create($eventdata)->trigger();
1409              $this->fail('Coding exception should have been thrown: ' . $errormsg);
1410          } catch (coding_exception $e) {
1411              $this->assertStringContainsString($errormsg, $e->getMessage());
1412          }
1413          $eventdata['relateduserid'] = 1;
1414  
1415          // No other['usercompetencyid'].
1416          $errormsg = 'The \'usercompetencyid\' data in \'other\' must be set.';
1417          try {
1418              \core\event\competency_evidence_created::create($eventdata)->trigger();
1419              $this->fail('Coding exception should have been thrown: ' . $errormsg);
1420          } catch (coding_exception $e) {
1421              $this->assertStringContainsString($errormsg, $e->getMessage());
1422          }
1423          $eventdata['other']['usercompetencyid'] = 1;
1424  
1425          // No other['competencyid'].
1426          $errormsg = 'The \'competencyid\' data in \'other\' must be set.';
1427          try {
1428              \core\event\competency_evidence_created::create($eventdata)->trigger();
1429              $this->fail('Coding exception should have been thrown: ' . $errormsg);
1430          } catch (coding_exception $e) {
1431              $this->assertStringContainsString($errormsg, $e->getMessage());
1432          }
1433          $eventdata['other']['competencyid'] = 1;
1434  
1435          // No other['action'].
1436          $errormsg = 'The \'action\' data in \'other\' must be set.';
1437          try {
1438              \core\event\competency_evidence_created::create($eventdata)->trigger();
1439              $this->fail('Coding exception should have been thrown: ' . $errormsg);
1440          } catch (coding_exception $e) {
1441              $this->assertStringContainsString($errormsg, $e->getMessage());
1442          }
1443          $eventdata['other']['action'] = 1;
1444  
1445          // No other['recommend'].
1446          $errormsg = 'The \'recommend\' data in \'other\' must be set.';
1447          try {
1448              \core\event\competency_evidence_created::create($eventdata)->trigger();
1449              $this->fail('Coding exception should have been thrown: ' . $errormsg);
1450          } catch (coding_exception $e) {
1451              $this->assertStringContainsString($errormsg, $e->getMessage());
1452          }
1453          $eventdata['other']['recommend'] = 1;
1454  
1455          // Event should be triggered without any problems.
1456          \core\event\competency_evidence_created::create($eventdata)->trigger();
1457      }
1458  
1459      /**
1460       * Test the user competency grade rated event.
1461       *
1462       */
1463      public function test_user_competency_rated() {
1464          $this->resetAfterTest(true);
1465          $this->setAdminUser();
1466          $dg = $this->getDataGenerator();
1467          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1468          $scale = $dg->create_scale(array('scale' => 'A,B,C,D'));
1469          $scaleconfig = array(array('scaleid' => $scale->id));
1470          $scaleconfig[] = array('name' => 'A', 'id' => 1, 'scaledefault' => 0, 'proficient' => 0);
1471          $scaleconfig[] = array('name' => 'B', 'id' => 2, 'scaledefault' => 1, 'proficient' => 0);
1472          $scaleconfig[] = array('name' => 'C', 'id' => 3, 'scaledefault' => 0, 'proficient' => 1);
1473          $scaleconfig[] = array('name' => 'D', 'id' => 4, 'scaledefault' => 0, 'proficient' => 1);
1474          $fr = $lpg->create_framework();
1475          $c = $lpg->create_competency(array(
1476              'competencyframeworkid' => $fr->get('id'),
1477              'scaleid' => $scale->id,
1478              'scaleconfiguration' => $scaleconfig
1479          ));
1480  
1481          $user = $dg->create_user();
1482          $uc = $lpg->create_user_competency(array(
1483              'userid' => $user->id,
1484              'competencyid' => $c->get('id')));
1485  
1486          // Trigger and capture the event.
1487          $sink = $this->redirectEvents();
1488          api::grade_competency($user->id, $c->get('id'), 2, true);
1489  
1490          // Get our event event.
1491          $events = $sink->get_events();
1492          // Evidence created.
1493          $this->assertCount(2, $events);
1494          $evidencecreatedevent = $events[0];
1495          $event = $events[1];
1496  
1497          // Check that the event data is valid.
1498          $this->assertInstanceOf('\core\event\competency_evidence_created', $evidencecreatedevent);
1499          $this->assertInstanceOf('\core\event\competency_user_competency_rated', $event);
1500          $this->assertEquals($uc->get('id'), $event->objectid);
1501          $this->assertEquals($uc->get_context()->id, $event->contextid);
1502          $this->assertEquals($uc->get('userid'), $event->relateduserid);
1503          $this->assertEquals(2, $event->other['grade']);
1504          $this->assertEventContextNotUsed($event);
1505          $this->assertDebuggingNotCalled();
1506      }
1507  
1508      /**
1509       * Test the user competency grade rated in course event.
1510       *
1511       */
1512      public function test_user_competency_rated_in_course() {
1513          $this->resetAfterTest(true);
1514          $this->setAdminUser();
1515          $dg = $this->getDataGenerator();
1516          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1517          $scale = $dg->create_scale(array('scale' => 'A,B,C,D'));
1518          $course = $dg->create_course();
1519          $user = $dg->create_user();
1520          $studentarch = get_archetype_roles('student');
1521          $studentrole = array_shift($studentarch);
1522          $scaleconfig = array(array('scaleid' => $scale->id));
1523          $scaleconfig[] = array('name' => 'A', 'id' => 1, 'scaledefault' => 0, 'proficient' => 0);
1524          $scaleconfig[] = array('name' => 'B', 'id' => 2, 'scaledefault' => 1, 'proficient' => 0);
1525          $scaleconfig[] = array('name' => 'C', 'id' => 3, 'scaledefault' => 0, 'proficient' => 1);
1526          $scaleconfig[] = array('name' => 'D', 'id' => 4, 'scaledefault' => 0, 'proficient' => 1);
1527          $fr = $lpg->create_framework();
1528          $c = $lpg->create_competency(array(
1529              'competencyframeworkid' => $fr->get('id'),
1530              'scaleid' => $scale->id,
1531              'scaleconfiguration' => $scaleconfig
1532          ));
1533          // Enrol the user as students in course.
1534          $dg->enrol_user($user->id, $course->id, $studentrole->id);
1535          $lpg->create_course_competency(array(
1536              'courseid' => $course->id,
1537              'competencyid' => $c->get('id')));
1538          $uc = $lpg->create_user_competency(array(
1539              'userid' => $user->id,
1540              'competencyid' => $c->get('id')));
1541  
1542          // Trigger and capture the event.
1543          $sink = $this->redirectEvents();
1544          api::grade_competency_in_course($course->id, $user->id, $c->get('id'), 2, true);
1545  
1546          // Get our event event.
1547          $events = $sink->get_events();
1548          // Evidence created.
1549          $this->assertCount(2, $events);
1550          $evidencecreatedevent = $events[0];
1551          $event = $events[1];
1552  
1553          // Check that the event data is valid.
1554          $this->assertInstanceOf('\core\event\competency_evidence_created', $evidencecreatedevent);
1555          $this->assertInstanceOf('\core\event\competency_user_competency_rated_in_course', $event);
1556          $this->assertEquals(context_course::instance($course->id)->id, $event->contextid);
1557          $this->assertEquals($course->id, $event->courseid);
1558          $this->assertEquals($uc->get('userid'), $event->relateduserid);
1559          $this->assertEquals($uc->get('competencyid'), $event->other['competencyid']);
1560          $this->assertEquals(2, $event->other['grade']);
1561          $this->assertEventContextNotUsed($event);
1562          $this->assertDebuggingNotCalled();
1563      }
1564  
1565      /**
1566       * Test the user competency grade rated in plan event.
1567       *
1568       */
1569      public function test_user_competency_rated_in_plan() {
1570           $this->resetAfterTest(true);
1571          $this->setAdminUser();
1572          $dg = $this->getDataGenerator();
1573          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1574          $scale = $dg->create_scale(array('scale' => 'A,B,C,D'));
1575          $user = $dg->create_user();
1576          $scaleconfig = array(array('scaleid' => $scale->id));
1577          $scaleconfig[] = array('name' => 'A', 'id' => 1, 'scaledefault' => 0, 'proficient' => 0);
1578          $scaleconfig[] = array('name' => 'B', 'id' => 2, 'scaledefault' => 1, 'proficient' => 0);
1579          $scaleconfig[] = array('name' => 'C', 'id' => 3, 'scaledefault' => 0, 'proficient' => 1);
1580          $scaleconfig[] = array('name' => 'D', 'id' => 4, 'scaledefault' => 0, 'proficient' => 1);
1581          $plan = $lpg->create_plan(array('userid' => $user->id));
1582          $fr = $lpg->create_framework();
1583          $c = $lpg->create_competency(array(
1584              'competencyframeworkid' => $fr->get('id'),
1585              'scaleid' => $scale->id,
1586              'scaleconfiguration' => $scaleconfig
1587          ));
1588          $pc = $lpg->create_plan_competency(array('planid' => $plan->get('id'), 'competencyid' => $c->get('id')));
1589          $uc = $lpg->create_user_competency(array(
1590              'userid' => $user->id,
1591              'competencyid' => $c->get('id')));
1592  
1593          // Trigger and capture the event.
1594          $sink = $this->redirectEvents();
1595          api::grade_competency_in_plan($plan->get('id'), $c->get('id'), 3, true);
1596  
1597          // Get our event event.
1598          $events = $sink->get_events();
1599          // Evidence created.
1600          $this->assertCount(2, $events);
1601          $evidencecreatedevent = $events[0];
1602          $event = $events[1];
1603  
1604          // Check that the event data is valid.
1605          $this->assertInstanceOf('\core\event\competency_evidence_created', $evidencecreatedevent);
1606          $this->assertInstanceOf('\core\event\competency_user_competency_rated_in_plan', $event);
1607          $this->assertEquals($uc->get('id'), $event->objectid);
1608          $this->assertEquals($uc->get_context()->id, $event->contextid);
1609          $this->assertEquals($uc->get('userid'), $event->relateduserid);
1610          $this->assertEquals($uc->get('competencyid'), $event->other['competencyid']);
1611          $this->assertEquals(3, $event->other['grade']);
1612          $this->assertEventContextNotUsed($event);
1613          $this->assertDebuggingNotCalled();
1614      }
1615  
1616      /**
1617       * Test user competency comment created event.
1618       */
1619      public function test_user_competency_comment_created() {
1620          $this->resetAfterTest(true);
1621  
1622          $dg = $this->getDataGenerator();
1623          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1624          $user = $dg->create_user();
1625          $this->setUser($user);
1626          $fr = $lpg->create_framework();
1627          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
1628          $uc = $lpg->create_user_competency(array(
1629              'userid' => $user->id,
1630              'competencyid' => $c->get('id')
1631          ));
1632  
1633          $context = context_user::instance($user->id);
1634          $cmt = new stdClass();
1635          $cmt->context = $context;
1636          $cmt->area = 'user_competency';
1637          $cmt->itemid = $uc->get('id');
1638          $cmt->component = 'competency';
1639          $cmt->showcount = 1;
1640          $manager = new comment($cmt);
1641  
1642          // Triggering and capturing the event.
1643          $sink = $this->redirectEvents();
1644          $manager->add("New comment for user competency");
1645          $events = $sink->get_events();
1646          // Add comment will trigger 2 other events message_viewed and message_sent.
1647          $this->assertCount(1, $events);
1648          $event = reset($events);
1649  
1650          // Checking that the event contains the expected values.
1651          $this->assertInstanceOf('\core\event\competency_comment_created', $event);
1652          $this->assertEquals($context, $event->get_context());
1653          $this->assertEquals($uc->get('id'), $event->other['itemid']);
1654          $this->assertEventContextNotUsed($event);
1655          $this->assertDebuggingNotCalled();
1656      }
1657  
1658      /**
1659       * Test plan comment deleted event.
1660       */
1661      public function test_user_competency_comment_deleted() {
1662          $this->resetAfterTest(true);
1663          $this->setAdminUser();
1664          $dg = $this->getDataGenerator();
1665          $lpg = $this->getDataGenerator()->get_plugin_generator('core_competency');
1666          $user = $dg->create_user();
1667          $fr = $lpg->create_framework();
1668          $c = $lpg->create_competency(array('competencyframeworkid' => $fr->get('id')));
1669          $uc = $lpg->create_user_competency(array(
1670              'userid' => $user->id,
1671              'competencyid' => $c->get('id')
1672          ));
1673          $context = context_user::instance($user->id);
1674  
1675          $cmt = new stdClass();
1676          $cmt->context = $context;
1677          $cmt->area = 'user_competency';
1678          $cmt->itemid = $uc->get('id');
1679          $cmt->component = 'competency';
1680          $manager = new comment($cmt);
1681          $newcomment = $manager->add("Comment to be deleted");
1682  
1683          // Triggering and capturing the event.
1684          $sink = $this->redirectEvents();
1685          $manager->delete($newcomment->id);
1686          $events = $sink->get_events();
1687          $this->assertCount(1, $events);
1688          $event = reset($events);
1689  
1690          // Checking that the event contains the expected values.
1691          $this->assertInstanceOf('\core\event\competency_comment_deleted', $event);
1692          $this->assertEquals($context, $event->get_context());
1693          $this->assertEquals($uc->get('id'), $event->other['itemid']);
1694          $this->assertEventContextNotUsed($event);
1695          $this->assertDebuggingNotCalled();
1696      }
1697  }