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 declare(strict_types=1); 18 19 namespace core_reportbuilder\privacy; 20 21 use context_system; 22 use core_privacy\local\metadata\collection; 23 use core_privacy\local\metadata\types\database_table; 24 use core_privacy\local\metadata\types\user_preference; 25 use core_privacy\local\request\userlist; 26 use core_privacy\local\request\writer; 27 use core_privacy\tests\provider_testcase; 28 use core_reportbuilder_generator; 29 use core_reportbuilder\manager; 30 use core_reportbuilder\local\helpers\user_filter_manager; 31 use core_reportbuilder\local\models\audience; 32 use core_reportbuilder\local\models\column; 33 use core_reportbuilder\local\models\filter; 34 use core_reportbuilder\local\models\report; 35 use core_reportbuilder\local\models\schedule; 36 use core_user\reportbuilder\datasource\users; 37 38 /** 39 * Unit tests for privacy provider 40 * 41 * @package core_reportbuilder 42 * @covers \core_reportbuilder\privacy\provider 43 * @copyright 2021 David Matamoros <davidmc@moodle.com> 44 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 45 */ 46 class provider_test extends provider_testcase { 47 48 /** 49 * Test provider metadata 50 */ 51 public function test_get_metadata(): void { 52 $collection = new collection('core_reportbuilder'); 53 $metadata = provider::get_metadata($collection)->get_collection(); 54 55 $this->assertCount(6, $metadata); 56 57 $this->assertInstanceOf(database_table::class, $metadata[0]); 58 $this->assertEquals(report::TABLE, $metadata[0]->get_name()); 59 60 $this->assertInstanceOf(database_table::class, $metadata[1]); 61 $this->assertEquals(column::TABLE, $metadata[1]->get_name()); 62 63 $this->assertInstanceOf(database_table::class, $metadata[2]); 64 $this->assertEquals(filter::TABLE, $metadata[2]->get_name()); 65 66 $this->assertInstanceOf(database_table::class, $metadata[3]); 67 $this->assertEquals(audience::TABLE, $metadata[3]->get_name()); 68 69 $this->assertInstanceOf(database_table::class, $metadata[4]); 70 $this->assertEquals(schedule::TABLE, $metadata[4]->get_name()); 71 72 $this->assertInstanceOf(user_preference::class, $metadata[5]); 73 } 74 75 /** 76 * Test getting contexts for user who created a report 77 */ 78 public function test_get_contexts_for_userid_report(): void { 79 $this->resetAfterTest(); 80 81 $user = $this->getDataGenerator()->create_user(); 82 $this->setUser($user); 83 84 /** @var core_reportbuilder_generator $generator */ 85 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 86 $generator->create_report(['name' => 'Users', 'source' => users::class]); 87 88 $contextlist = $this->get_contexts_for_userid((int) $user->id, 'core_reportbuilder'); 89 $this->assertCount(1, $contextlist); 90 $this->assertInstanceOf(context_system::class, $contextlist->current()); 91 } 92 93 /** 94 * Test getting contexts for user who created an audience for a report by another user 95 */ 96 public function test_get_contexts_for_userid_audience(): void { 97 $this->resetAfterTest(); 98 $this->setAdminUser(); 99 100 /** @var core_reportbuilder_generator $generator */ 101 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 102 $report = $generator->create_report(['name' => 'Users', 'source' => users::class]); 103 104 // Switch user, create a report audience. 105 $user = $this->getDataGenerator()->create_user(); 106 $this->setUser($user); 107 108 $generator->create_audience(['reportid' => $report->get('id'), 'configdata' => []]); 109 110 $contextlist = $this->get_contexts_for_userid((int) $user->id, 'core_reportbuilder'); 111 $this->assertCount(1, $contextlist); 112 $this->assertInstanceOf(context_system::class, $contextlist->current()); 113 } 114 115 /** 116 * Test getting contexts for user who created a schedule for a report by another user 117 */ 118 public function test_get_contexts_for_userid_schedule(): void { 119 $this->resetAfterTest(); 120 $this->setAdminUser(); 121 122 /** @var core_reportbuilder_generator $generator */ 123 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 124 $report = $generator->create_report(['name' => 'Users', 'source' => users::class]); 125 126 // Switch user, create a report schedule. 127 $user = $this->getDataGenerator()->create_user(); 128 $this->setUser($user); 129 130 $generator->create_schedule(['reportid' => $report->get('id'), 'name' => 'My schedule']); 131 132 $contextlist = $this->get_contexts_for_userid((int) $user->id, 'core_reportbuilder'); 133 $this->assertCount(1, $contextlist); 134 $this->assertInstanceOf(context_system::class, $contextlist->current()); 135 } 136 137 /** 138 * Test getting users in given context 139 */ 140 public function test_get_users_in_context(): void { 141 $this->resetAfterTest(); 142 143 /** @var core_reportbuilder_generator $generator */ 144 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 145 146 // Switch user, create a report. 147 $reportuser = $this->getDataGenerator()->create_user(); 148 $this->setUser($reportuser); 149 150 $report = $generator->create_report(['name' => 'Users', 'source' => users::class]); 151 152 // Switch user, create a report audience. 153 $audienceuser = $this->getDataGenerator()->create_user(); 154 $this->setUser($audienceuser); 155 156 $generator->create_audience(['reportid' => $report->get('id'), 'configdata' => []]); 157 158 // Switch user, create a report schedule. 159 $scheduleuser = $this->getDataGenerator()->create_user(); 160 $this->setUser($scheduleuser); 161 162 $generator->create_schedule(['reportid' => $report->get('id'), 'name' => 'My schedule']); 163 164 $userlist = new userlist(context_system::instance(), 'core_reportbuilder'); 165 provider::get_users_in_context($userlist); 166 167 $this->assertEqualsCanonicalizing([ 168 $reportuser->id, 169 $audienceuser->id, 170 $scheduleuser->id, 171 ], $userlist->get_userids()); 172 } 173 174 /** 175 * Test export of user data 176 */ 177 public function test_export_user_data(): void { 178 $this->resetAfterTest(); 179 180 $user = $this->getDataGenerator()->create_user(); 181 $this->setUser($user); 182 183 /** @var core_reportbuilder_generator $generator */ 184 $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); 185 186 // Create some report elements for the user. 187 $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); 188 $audience = $generator->create_audience(['reportid' => $report->get('id'), 'configdata' => [], 'heading' => 'Beans']); 189 $schedule = $generator->create_schedule([ 190 'reportid' => $report->get('id'), 191 'audiences' => json_encode([$audience->get_persistent()->get('id')]), 192 'name' => 'My schedule', 193 ]); 194 195 $context = context_system::instance(); 196 $this->export_context_data_for_user((int) $user->id, $context, 'core_reportbuilder'); 197 198 /** @var \core_privacy\tests\request\content_writer $writer */ 199 $writer = writer::with_context($context); 200 $this->assertTrue($writer->has_any_data()); 201 202 $subcontext = provider::get_export_subcontext($report); 203 204 // Exported report data. 205 $reportdata = $writer->get_data($subcontext); 206 $this->assertEquals($report->get_formatted_name(), $reportdata->name); 207 $this->assertEquals(users::get_name(), $reportdata->source); 208 $this->assertEquals($user->id, $reportdata->usercreated); 209 $this->assertEquals($user->id, $reportdata->usermodified); 210 $this->assertNotEmpty($reportdata->timecreated); 211 $this->assertNotEmpty($reportdata->timemodified); 212 213 // Exported audience data. 214 $audiencedata = $writer->get_related_data($subcontext, 'audiences')->data; 215 216 $this->assertCount(1, $audiencedata); 217 $audiencedata = reset($audiencedata); 218 219 $audiencepersistent = $audience->get_persistent(); 220 $audienceclassname = $audiencepersistent->get('classname'); 221 222 $this->assertEquals($audienceclassname::instance()->get_name(), $audiencedata->classname); 223 $this->assertEquals($audiencepersistent->get('configdata'), $audiencedata->configdata); 224 $this->assertEquals($audiencepersistent->get_formatted_heading(), $audiencedata->heading); 225 $this->assertEquals($user->id, $audiencedata->usercreated); 226 $this->assertEquals($user->id, $audiencedata->usermodified); 227 $this->assertNotEmpty($audiencedata->timecreated); 228 $this->assertNotEmpty($audiencedata->timemodified); 229 230 // Exported schedule data. 231 $scheduledata = $writer->get_related_data($subcontext, 'schedules')->data; 232 233 $this->assertCount(1, $scheduledata); 234 $scheduledata = reset($scheduledata); 235 236 $this->assertEquals($schedule->get_formatted_name(), $scheduledata->name); 237 $this->assertEquals('Yes', $scheduledata->enabled); 238 $this->assertEquals('Comma separated values (.csv)', $scheduledata->format); 239 $this->assertNotEmpty($scheduledata->timescheduled); 240 $this->assertEquals('None', $scheduledata->recurrence); 241 $this->assertEquals('Schedule creator', $scheduledata->userviewas); 242 $this->assertEquals(json_encode([$audiencepersistent->get('id')]), $scheduledata->audiences); 243 $this->assertEquals($schedule->get('subject'), $scheduledata->subject); 244 $this->assertEquals(format_text($schedule->get('message'), $schedule->get('messageformat')), $scheduledata->message); 245 $this->assertEquals('Send message with empty report', $scheduledata->reportempty); 246 $this->assertEquals($user->id, $scheduledata->usercreated); 247 $this->assertEquals($user->id, $scheduledata->usermodified); 248 $this->assertNotEmpty($scheduledata->timecreated); 249 $this->assertNotEmpty($scheduledata->timemodified); 250 } 251 252 /** 253 * Test export of user data where there is nothing to export 254 */ 255 public function test_export_user_data_empty(): void { 256 $this->resetAfterTest(); 257 258 $user = $this->getDataGenerator()->create_user(); 259 260 $context = context_system::instance(); 261 $this->export_context_data_for_user((int) $user->id, $context, 'core_reportbuilder'); 262 263 $this->assertFalse(writer::with_context($context)->has_any_data()); 264 } 265 266 /** 267 * Test to check export_user_preferences. 268 */ 269 public function test_export_user_preferences(): void { 270 $this->resetAfterTest(); 271 272 $user1 = $this->getDataGenerator()->create_user(); 273 $user2 = $this->getDataGenerator()->create_user(); 274 $this->setUser($user1); 275 276 // Create report and set some filters for the user. 277 $report1 = manager::create_report_persistent((object) [ 278 'type' => 1, 279 'source' => 'class', 280 ]); 281 $filtervalues1 = [ 282 'task_log:name_operator' => 0, 283 'task_log:name_value' => 'My task logs', 284 ]; 285 user_filter_manager::set($report1->get('id'), $filtervalues1); 286 287 // Add a filter for user2. 288 $filtervalues1user2 = [ 289 'task_log:name_operator' => 0, 290 'task_log:name_value' => 'My task logs user2', 291 ]; 292 user_filter_manager::set($report1->get('id'), $filtervalues1user2, (int)$user2->id); 293 294 // Create a second report and set some filters for the user. 295 $report2 = manager::create_report_persistent((object) [ 296 'type' => 1, 297 'source' => 'class', 298 ]); 299 $filtervalues2 = [ 300 'config_change:setting_operator' => 0, 301 'config_change:setting_value' => str_repeat('A', 3000), 302 ]; 303 user_filter_manager::set($report2->get('id'), $filtervalues2); 304 305 // Switch to admin user (so we can validate preferences of our test user are still exported). 306 $this->setAdminUser(); 307 308 // Export user preferences. 309 provider::export_user_preferences((int)$user1->id); 310 $writer = writer::with_context(context_system::instance()); 311 $prefs = $writer->get_user_preferences('core_reportbuilder'); 312 313 // Check that user preferences only contain the 2 preferences from user1. 314 $this->assertCount(2, (array)$prefs); 315 316 // Check that exported user preferences for report1 are correct. 317 $report1key = 'reportbuilder-report-' . $report1->get('id'); 318 $this->assertEquals(json_encode($filtervalues1, JSON_PRETTY_PRINT), $prefs->$report1key->value); 319 320 // Check that exported user preferences for report2 are correct. 321 $report2key = 'reportbuilder-report-' . $report2->get('id'); 322 $this->assertEquals(json_encode($filtervalues2, JSON_PRETTY_PRINT), $prefs->$report2key->value); 323 } 324 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body