Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   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   * Base class for unit tests for core_cohort.
  19   *
  20   * @package    core_cohort
  21   * @category   test
  22   * @copyright  2018 Sara Arjona <sara@moodle.com>
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  namespace core_cohort\privacy;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  use core_cohort\privacy\provider;
  30  use core_privacy\local\request\approved_contextlist;
  31  use core_privacy\local\request\writer;
  32  use core_privacy\tests\provider_testcase;
  33  use core_privacy\local\request\approved_userlist;
  34  
  35  /**
  36   * Unit tests for cohort\classes\privacy\provider.php
  37   *
  38   * @copyright  2018 Sara Arjona <sara@moodle.com>
  39   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  40   */
  41  class provider_test extends provider_testcase {
  42  
  43      /**
  44       * Basic setup for these tests.
  45       */
  46      public function setUp(): void {
  47          $this->resetAfterTest(true);
  48      }
  49  
  50      /**
  51       * Test getting the context for the user ID related to this plugin.
  52       */
  53      public function test_get_contexts_for_userid() {
  54          // Create system cohort and category cohort.
  55          $coursecategory = $this->getDataGenerator()->create_category();
  56          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
  57          $systemctx = \context_system::instance();
  58          $categorycohort = $this->getDataGenerator()->create_cohort([
  59                  'contextid' => $coursecategoryctx->id,
  60                  'name' => 'Category cohort 1',
  61              ]);
  62          $systemcohort = $this->getDataGenerator()->create_cohort([
  63                  'contextid' => $systemctx->id,
  64                  'name' => 'System cohort 1'
  65              ]);
  66  
  67          // Create user and add to the system and category cohorts.
  68          $user = $this->getDataGenerator()->create_user();
  69          cohort_add_member($categorycohort->id, $user->id);
  70          cohort_add_member($systemcohort->id, $user->id);
  71  
  72          // User is member of 2 cohorts.
  73          $contextlist = provider::get_contexts_for_userid($user->id);
  74          $this->assertCount(2, (array) $contextlist->get_contextids());
  75          $this->assertContainsEquals($coursecategoryctx->id, $contextlist->get_contextids());
  76          $this->assertContainsEquals($systemctx->id, $contextlist->get_contextids());
  77      }
  78  
  79      /**
  80       * Test that data is exported correctly for this plugin.
  81       */
  82      public function test_export_user_data() {
  83          // Create system cohort and category cohort.
  84          $coursecategory = $this->getDataGenerator()->create_category();
  85          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
  86          $systemctx = \context_system::instance();
  87          $categorycohort = $this->getDataGenerator()->create_cohort([
  88                  'contextid' => $coursecategoryctx->id,
  89                  'name' => 'Category cohort 1',
  90              ]);
  91          $systemcohort1 = $this->getDataGenerator()->create_cohort([
  92                  'contextid' => $systemctx->id,
  93                  'name' => 'System cohort 1'
  94              ]);
  95          $systemcohort2 = $this->getDataGenerator()->create_cohort([
  96                  'contextid' => $systemctx->id,
  97                  'name' => 'System cohort 2'
  98              ]);
  99  
 100          // Create user and add to the system and category cohorts.
 101          $user = $this->getDataGenerator()->create_user();
 102          cohort_add_member($categorycohort->id, $user->id);
 103          cohort_add_member($systemcohort1->id, $user->id);
 104          cohort_add_member($systemcohort2->id, $user->id);
 105  
 106          // Validate system cohort exported data.
 107          $writer = writer::with_context($systemctx);
 108          $this->assertFalse($writer->has_any_data());
 109          $this->export_context_data_for_user($user->id, $systemctx, 'core_cohort');
 110          $data = $writer->get_related_data([], 'cohort');
 111          $this->assertCount(2, $data);
 112  
 113          // Validate category cohort exported data.
 114          $writer = writer::with_context($coursecategoryctx);
 115          $this->assertFalse($writer->has_any_data());
 116          $this->export_context_data_for_user($user->id, $coursecategoryctx, 'core_cohort');
 117          $data = $writer->get_related_data([], 'cohort');
 118          $this->assertCount(1, $data);
 119          $this->assertEquals($categorycohort->name, reset($data)->name);
 120      }
 121  
 122      /**
 123       * Test for provider::delete_data_for_all_users_in_context().
 124       */
 125      public function test_delete_data_for_all_users_in_context() {
 126          global $DB;
 127  
 128          // Create system cohort and category cohort.
 129          $coursecategory = $this->getDataGenerator()->create_category();
 130          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
 131          $systemctx = \context_system::instance();
 132          $categorycohort = $this->getDataGenerator()->create_cohort([
 133                  'contextid' => $coursecategoryctx->id,
 134                  'name' => 'Category cohort 1',
 135                  'idnumber' => '',
 136                  'description' => ''
 137              ]);
 138          $systemcohort = $this->getDataGenerator()->create_cohort([
 139                  'contextid' => $systemctx->id,
 140                  'name' => 'System cohort 1'
 141              ]);
 142  
 143          // Create user and add to the system and category cohorts.
 144          $user = $this->getDataGenerator()->create_user();
 145          cohort_add_member($categorycohort->id, $user->id);
 146          cohort_add_member($systemcohort->id, $user->id);
 147  
 148          // Before deletion, we should have 2 entries in the cohort_members table.
 149          $count = $DB->count_records('cohort_members');
 150          $this->assertEquals(2, $count);
 151  
 152          // Delete data based on system context.
 153          provider::delete_data_for_all_users_in_context($systemctx);
 154  
 155          // After deletion, the cohort_members entries should have been deleted.
 156          $count = $DB->count_records('cohort_members');
 157          $this->assertEquals(1, $count);
 158  
 159          // Delete data based on category context.
 160          provider::delete_data_for_all_users_in_context($coursecategoryctx);
 161  
 162          // After deletion, the cohort_members entries should have been deleted.
 163          $count = $DB->count_records('cohort_members');
 164          $this->assertEquals(0, $count);
 165      }
 166  
 167      /**
 168       * Test for provider::delete_data_for_user().
 169       */
 170      public function test_delete_data_for_user() {
 171          global $DB;
 172  
 173          // Create system cohort and category cohort.
 174          $coursecategory = $this->getDataGenerator()->create_category();
 175          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
 176          $systemctx = \context_system::instance();
 177          $categorycohort = $this->getDataGenerator()->create_cohort([
 178                  'contextid' => $coursecategoryctx->id,
 179                  'name' => 'Category cohort 1',
 180                  'idnumber' => '',
 181                  'description' => ''
 182              ]);
 183          $systemcohort = $this->getDataGenerator()->create_cohort([
 184                  'contextid' => $systemctx->id,
 185                  'name' => 'System cohort 1'
 186              ]);
 187  
 188          // Create user and add to the system and category cohorts.
 189          $user1 = $this->getDataGenerator()->create_user();
 190          cohort_add_member($categorycohort->id, $user1->id);
 191          cohort_add_member($systemcohort->id, $user1->id);
 192  
 193          // Create another user and add to the system and category cohorts.
 194          $user2 = $this->getDataGenerator()->create_user();
 195          cohort_add_member($categorycohort->id, $user2->id);
 196          cohort_add_member($systemcohort->id, $user2->id);
 197  
 198          // Create another user and add to the system cohort.
 199          $user3 = $this->getDataGenerator()->create_user();
 200          cohort_add_member($systemcohort->id, $user3->id);
 201  
 202          // Before deletion, we should have 5 entries in the cohort_members table.
 203          $count = $DB->count_records('cohort_members');
 204          $this->assertEquals(5, $count);
 205  
 206          $contextlist = provider::get_contexts_for_userid($user1->id);
 207          $contexts = [];
 208          $contexts[] = \context_user::instance($user1->id)->id;
 209          $contexts = array_merge($contexts, $contextlist->get_contextids());
 210          $approvedcontextlist = new approved_contextlist($user1, 'cohort', $contexts);
 211          provider::delete_data_for_user($approvedcontextlist);
 212  
 213          // After deletion, the cohort_members entries for the first student should have been deleted.
 214          $count = $DB->count_records('cohort_members', ['userid' => $user1->id]);
 215          $this->assertEquals(0, $count);
 216          $count = $DB->count_records('cohort_members');
 217          $this->assertEquals(3, $count);
 218  
 219          // Confirm that the cohorts hasn't been removed.
 220          $cohortscount = $DB->get_records('cohort');
 221          $this->assertCount(2, (array) $cohortscount);
 222      }
 223  
 224      /**
 225       * Test that only users within a course context are fetched.
 226       */
 227      public function test_get_users_in_context() {
 228          $component = 'core_cohort';
 229  
 230          // Create system cohort and category cohort.
 231          $coursecategory = $this->getDataGenerator()->create_category();
 232          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
 233          $systemctx = \context_system::instance();
 234          $categorycohort = $this->getDataGenerator()->create_cohort([
 235              'contextid' => $coursecategoryctx->id,
 236              'name' => 'Category cohort 1',
 237          ]);
 238          // Create user.
 239          $user = $this->getDataGenerator()->create_user();
 240          $userctx = \context_user::instance($user->id);
 241  
 242          $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
 243          provider::get_users_in_context($userlist1);
 244          $this->assertCount(0, $userlist1);
 245  
 246          $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
 247          provider::get_users_in_context($userlist2);
 248          $this->assertCount(0, $userlist2);
 249  
 250          $systemcohort = $this->getDataGenerator()->create_cohort([
 251              'contextid' => $systemctx->id,
 252              'name' => 'System cohort 1'
 253          ]);
 254          // Create user and add to the system and category cohorts.
 255          cohort_add_member($categorycohort->id, $user->id);
 256          cohort_add_member($systemcohort->id, $user->id);
 257  
 258          // The list of users within the coursecat context should contain user.
 259          $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
 260          provider::get_users_in_context($userlist1);
 261          $this->assertCount(1, $userlist1);
 262          $expected = [$user->id];
 263          $actual = $userlist1->get_userids();
 264          $this->assertEquals($expected, $actual);
 265  
 266          // The list of users within the system context should contain user.
 267          $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
 268          provider::get_users_in_context($userlist2);
 269          $this->assertCount(1, $userlist2);
 270          $expected = [$user->id];
 271          $actual = $userlist2->get_userids();
 272          $this->assertEquals($expected, $actual);
 273  
 274          // The list of users within the user context should be empty.
 275          $userlist3 = new \core_privacy\local\request\userlist($userctx, $component);
 276          provider::get_users_in_context($userlist3);
 277          $this->assertCount(0, $userlist3);
 278      }
 279  
 280      /**
 281       * Test that data for users in approved userlist is deleted.
 282       */
 283      public function test_delete_data_for_users() {
 284          $component = 'core_cohort';
 285  
 286          // Create system cohort and category cohort.
 287          $coursecategory = $this->getDataGenerator()->create_category();
 288          $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
 289          $systemctx = \context_system::instance();
 290          $categorycohort = $this->getDataGenerator()->create_cohort([
 291              'contextid' => $coursecategoryctx->id,
 292              'name' => 'Category cohort 1',
 293          ]);
 294          // Create user1.
 295          $user1 = $this->getDataGenerator()->create_user();
 296          $userctx1 = \context_user::instance($user1->id);
 297          // Create user2.
 298          $user2 = $this->getDataGenerator()->create_user();
 299  
 300          $systemcohort = $this->getDataGenerator()->create_cohort([
 301              'contextid' => $systemctx->id,
 302              'name' => 'System cohort 1'
 303          ]);
 304          // Create user and add to the system and category cohorts.
 305          cohort_add_member($categorycohort->id, $user1->id);
 306          cohort_add_member($systemcohort->id, $user1->id);
 307          cohort_add_member($categorycohort->id, $user2->id);
 308  
 309          $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
 310          provider::get_users_in_context($userlist1);
 311          $this->assertCount(2, $userlist1);
 312  
 313          $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
 314          provider::get_users_in_context($userlist2);
 315          $this->assertCount(1, $userlist2);
 316  
 317          // Convert $userlist1 into an approved_contextlist.
 318          $approvedlist1 = new approved_userlist($coursecategoryctx, $component, $userlist1->get_userids());
 319          // Delete using delete_data_for_user.
 320          provider::delete_data_for_users($approvedlist1);
 321  
 322          // Re-fetch users in coursecategoryctx.
 323          $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
 324          provider::get_users_in_context($userlist1);
 325          // The user data in coursecategoryctx should be deleted.
 326          $this->assertCount(0, $userlist1);
 327          // Re-fetch users in coursecategoryctx.
 328          $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
 329          provider::get_users_in_context($userlist2);
 330          // The user data in coursecontext2 should be still present.
 331          $this->assertCount(1, $userlist2);
 332  
 333          // Convert $userlist2 into an approved_contextlist in the user context.
 334          $approvedlist3 = new approved_userlist($userctx1, $component, $userlist2->get_userids());
 335          // Delete using delete_data_for_user.
 336          provider::delete_data_for_users($approvedlist3);
 337          // Re-fetch users in coursecontext1.
 338          $userlist3 = new \core_privacy\local\request\userlist($systemctx, $component);
 339          provider::get_users_in_context($userlist3);
 340          // The user data in systemcontext should not be deleted.
 341          $this->assertCount(1, $userlist3);
 342      }
 343  }