PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/enrol/lti/tests/lib_test.php

https://bitbucket.org/moodle/moodle
PHP | 219 lines | 120 code | 35 blank | 64 comment | 1 complexity | 2beed66bf15e8afa2ff8d8b3f1e835c4 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.1, BSD-3-Clause, MIT, GPL-3.0
  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. * Tests for the enrol_lti_plugin class.
  18. *
  19. * @package enrol_lti
  20. * @copyright 2016 Jun Pataleta <jun@moodle.com>
  21. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22. */
  23. namespace enrol_lti;
  24. use course_enrolment_manager;
  25. use enrol_lti_plugin;
  26. use IMSGlobal\LTI\ToolProvider\ResourceLink;
  27. use IMSGlobal\LTI\ToolProvider\ToolConsumer;
  28. use IMSGlobal\LTI\ToolProvider\ToolProvider;
  29. use IMSGlobal\LTI\ToolProvider\User;
  30. defined('MOODLE_INTERNAL') || die();
  31. require_once(__DIR__ . '/local/ltiadvantage/lti_advantage_testcase.php');
  32. /**
  33. * Tests for the enrol_lti_plugin class.
  34. *
  35. * @package enrol_lti
  36. * @copyright 2016 Jun Pataleta <jun@moodle.com>
  37. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  38. */
  39. class lib_test extends \lti_advantage_testcase {
  40. /**
  41. * Test set up.
  42. *
  43. * This is executed before running any tests in this file.
  44. */
  45. public function setUp(): void {
  46. $this->resetAfterTest();
  47. $this->setAdminUser();
  48. }
  49. /**
  50. * Test for enrol_lti_plugin::delete_instance().
  51. */
  52. public function test_delete_instance() {
  53. global $DB;
  54. // Create tool enrolment instance.
  55. $data = new \stdClass();
  56. $data->enrolstartdate = time();
  57. $data->secret = 'secret';
  58. $tool = $this->getDataGenerator()->create_lti_tool($data);
  59. // Create consumer and related data.
  60. $dataconnector = new data_connector();
  61. $consumer = new ToolConsumer('testkey', $dataconnector);
  62. $consumer->secret = $tool->secret;
  63. $consumer->ltiVersion = ToolProvider::LTI_VERSION1;
  64. $consumer->name = 'TEST CONSUMER NAME';
  65. $consumer->consumerName = 'TEST CONSUMER INSTANCE NAME';
  66. $consumer->consumerGuid = 'TEST CONSUMER INSTANCE GUID';
  67. $consumer->consumerVersion = 'TEST CONSUMER INFO VERSION';
  68. $consumer->enabled = true;
  69. $consumer->protected = true;
  70. $consumer->save();
  71. $resourcelink = ResourceLink::fromConsumer($consumer, 'testresourcelinkid');
  72. $resourcelink->save();
  73. $ltiuser = User::fromResourceLink($resourcelink, '');
  74. $ltiuser->ltiResultSourcedId = 'testLtiResultSourcedId';
  75. $ltiuser->ltiUserId = 'testuserid';
  76. $ltiuser->email = 'user1@example.com';
  77. $ltiuser->save();
  78. $tp = new tool_provider($tool->id);
  79. $tp->user = $ltiuser;
  80. $tp->resourceLink = $resourcelink;
  81. $tp->consumer = $consumer;
  82. $tp->map_tool_to_consumer();
  83. $mappingparams = [
  84. 'toolid' => $tool->id,
  85. 'consumerid' => $tp->consumer->getRecordId()
  86. ];
  87. // Check first that the related records exist.
  88. $this->assertTrue($DB->record_exists('enrol_lti_tool_consumer_map', $mappingparams));
  89. $this->assertTrue($DB->record_exists('enrol_lti_lti2_consumer', [ 'id' => $consumer->getRecordId() ]));
  90. $this->assertTrue($DB->record_exists('enrol_lti_lti2_resource_link', [ 'id' => $resourcelink->getRecordId() ]));
  91. $this->assertTrue($DB->record_exists('enrol_lti_lti2_user_result', [ 'id' => $ltiuser->getRecordId() ]));
  92. // Perform deletion.
  93. $enrollti = new enrol_lti_plugin();
  94. $instance = $DB->get_record('enrol', ['id' => $tool->enrolid]);
  95. $enrollti->delete_instance($instance);
  96. // Check that the related records have been deleted.
  97. $this->assertFalse($DB->record_exists('enrol_lti_tool_consumer_map', $mappingparams));
  98. $this->assertFalse($DB->record_exists('enrol_lti_lti2_consumer', [ 'id' => $consumer->getRecordId() ]));
  99. $this->assertFalse($DB->record_exists('enrol_lti_lti2_resource_link', [ 'id' => $resourcelink->getRecordId() ]));
  100. $this->assertFalse($DB->record_exists('enrol_lti_lti2_user_result', [ 'id' => $ltiuser->getRecordId() ]));
  101. // Check that the enrolled users and the tool instance has been deleted.
  102. $this->assertFalse($DB->record_exists('enrol_lti_users', [ 'toolid' => $tool->id ]));
  103. $this->assertFalse($DB->record_exists('enrol_lti_tools', [ 'id' => $tool->id ]));
  104. $this->assertFalse($DB->record_exists('enrol', [ 'id' => $instance->id ]));
  105. }
  106. /**
  107. * Test confirming that relevant data is removed after enrol instance removal.
  108. *
  109. * @covers \enrol_lti_plugin::delete_instance
  110. */
  111. public function test_delete_instance_lti_advantage() {
  112. global $DB;
  113. // Setup.
  114. [
  115. $course,
  116. $modresource,
  117. $modresource2,
  118. $courseresource,
  119. $registration,
  120. $deployment
  121. ] = $this->create_test_environment();
  122. // Launch the tool.
  123. $mockuser = $this->get_mock_launch_users_with_ids(['1p3_1'])[0];
  124. $mocklaunch = $this->get_mock_launch($modresource, $mockuser);
  125. $instructoruser = $this->getDataGenerator()->create_user();
  126. $launchservice = $this->get_tool_launch_service();
  127. $launchservice->user_launches_tool($instructoruser, $mocklaunch);
  128. // Verify data exists.
  129. $this->assertEquals(1, $DB->count_records('enrol_lti_user_resource_link'));
  130. $this->assertEquals(1, $DB->count_records('enrol_lti_resource_link'));
  131. $this->assertEquals(1, $DB->count_records('enrol_lti_app_registration'));
  132. $this->assertEquals(1, $DB->count_records('enrol_lti_deployment'));
  133. $this->assertEquals(1, $DB->count_records('enrol_lti_context'));
  134. $this->assertEquals(1, $DB->count_records('enrol_lti_users'));
  135. // Now delete the enrol instance.
  136. $enrollti = new enrol_lti_plugin();
  137. $instance = $DB->get_record('enrol', ['id' => $modresource->enrolid]);
  138. $enrollti->delete_instance($instance);
  139. $this->assertEquals(0, $DB->count_records('enrol_lti_user_resource_link'));
  140. $this->assertEquals(0, $DB->count_records('enrol_lti_resource_link'));
  141. $this->assertEquals(0, $DB->count_records('enrol_lti_users'));
  142. // App registration, Deployment and Context tables are not affected by instance removal.
  143. $this->assertEquals(1, $DB->count_records('enrol_lti_app_registration'));
  144. $this->assertEquals(1, $DB->count_records('enrol_lti_deployment'));
  145. $this->assertEquals(1, $DB->count_records('enrol_lti_context'));
  146. }
  147. /**
  148. * Test for getting user enrolment actions.
  149. */
  150. public function test_get_user_enrolment_actions() {
  151. global $CFG, $DB, $PAGE;
  152. $this->resetAfterTest();
  153. // Set page URL to prevent debugging messages.
  154. $PAGE->set_url('/enrol/editinstance.php');
  155. $pluginname = 'lti';
  156. // Only enable the lti enrol plugin.
  157. $CFG->enrol_plugins_enabled = $pluginname;
  158. $generator = $this->getDataGenerator();
  159. // Get the enrol plugin.
  160. $plugin = enrol_get_plugin($pluginname);
  161. // Create a course.
  162. $course = $generator->create_course();
  163. $context = \context_course::instance($course->id);
  164. $teacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher'], MUST_EXIST);
  165. $studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student'], MUST_EXIST);
  166. // Enable this enrol plugin for the course.
  167. $fields = ['contextid' => $context->id, 'roleinstructor' => $teacherroleid, 'rolelearner' => $studentroleid];
  168. $plugin->add_instance($course, $fields);
  169. // Create a student.
  170. $student = $generator->create_user();
  171. // Enrol the student to the course.
  172. $generator->enrol_user($student->id, $course->id, 'student', $pluginname);
  173. // Teachers don't have enrol/lti:unenrol capability by default. Login as admin for simplicity.
  174. $this->setAdminUser();
  175. require_once($CFG->dirroot . '/enrol/locallib.php');
  176. $manager = new course_enrolment_manager($PAGE, $course);
  177. $userenrolments = $manager->get_user_enrolments($student->id);
  178. $this->assertCount(1, $userenrolments);
  179. $ue = reset($userenrolments);
  180. $actions = $plugin->get_user_enrolment_actions($manager, $ue);
  181. // LTI enrolment has 1 enrol actions for active users -- unenrol.
  182. $this->assertCount(1, $actions);
  183. }
  184. }