AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_sms\privacy;
use core_privacy\local\metadata\collection;
use core_privacy\local\request\approved_contextlist;
use core_privacy\local\request\approved_userlist;
use core_privacy\local\request\contextlist;
use core_privacy\local\request\userlist;
use core_privacy\local\request\writer;
use core_sms\manager;
/**
* Tests for sms
*
* @package core_sms
* @category test
* @copyright 2024 Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @covers \core_sms\privacy\provider
*/
final class provider_test extends \core_privacy\tests\provider_testcase {
public function test_get_metadata(): void {
$collection = new collection('core_sms');
$newcollection = provider::get_metadata($collection);
$this->assertCount(1, $newcollection->get_collection());
$types = $newcollection->get_collection();
$type = reset($types);
$this->assertEquals('sms_messages', $type->get_name());
}
public function test_get_contexts_for_userid_no_messagse(): void {
$user = get_admin();
$contextlist = provider::get_contexts_for_userid($user->id);
$this->assertInstanceOf(contextlist::class, $contextlist);
$this->assertCount(0, $contextlist);
}
public function test_get_contexts_for_userid_with_messages(): void {
$this->resetAfterTest(true);
$user = get_admin();
$manager = \core\di::get(manager::class);
$message = $manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$contextlist = provider::get_contexts_for_userid($user->id);
$this->assertInstanceOf(contextlist::class, $contextlist);
$this->assertCount(1, $contextlist);
$context = $contextlist->current();
$this->assertInstanceOf(\core\context\user::class, $context);
$this->assertEquals($user->id, $context->instanceid);
}
public function test_export_user_data(): void {
global $DB;
$this->resetAfterTest(true);
$clock = $this->mock_clock_with_frozen(99999);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$clock->set_to(10000000);
// Get the data for the User.
$usercontext = \core\context\user::instance($user->id);
/** @var \core_privacy\tests\request\content_writer */
$writer = writer::with_context($usercontext);
$this->assertFalse($writer->has_any_data_in_any_context());
// Export data for the user.
$this->export_all_data_for_user($user->id, 'core_sms');
$this->assertTrue($writer->has_any_data_in_any_context());
$data = $writer->get_data([get_string('sms', 'core_sms')]);
$this->assertObjectHasProperty('messages', $data);
$this->assertCount(2, $data->messages);
$message = reset($data->messages);
$this->assertArrayHasKey('content', $message);
$this->assertEquals('Hello world', $message['content']);
$this->assertArrayHasKey('messagetype', $message);
$this->assertEquals('example', $message['messagetype']);
$this->assertArrayHasKey('status', $message);
$this->assertArrayHasKey('timecreated', $message);
$this->assertEquals(99999, $message['timecreated']);
}
public function test_export_course_data(): void {
$this->resetAfterTest(true);
$clock = $this->mock_clock_with_frozen(99999);
$course = $this->getDataGenerator()->create_course();
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$clock->set_to(10000000);
// Get the data for the User Context.
$usercontext = \core\context\user::instance($user->id);
/** @var \core_privacy\tests\request\content_writer */
$writer = writer::with_context($usercontext);
$this->assertFalse($writer->has_any_data_in_any_context());
// Export data for the Course - there should be none.
$this->export_context_data_for_user($user->id, \core\context\course::instance($course->id), 'core_sms');
$this->assertFalse($writer->has_any_data_in_any_context());
}
public function test_delete_data_for_all_users_in_context(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
// No data is store under the system context. Nothing should be deleted.
provider::delete_data_for_all_users_in_context(\core\context\system::instance());
$this->assertEquals(3, $DB->count_records('sms_messages'));
$usercontext = \core\context\user::instance($user->id);
provider::delete_data_for_all_users_in_context($usercontext);
$this->assertEmpty($DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages'));
}
public function test_delete_data_for_user(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
$usercontext = \core\context\user::instance($user->id);
provider::delete_data_for_user(new approved_contextlist($user, 'core_sms', [$usercontext->id]));
$this->assertEmpty($DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages'));
}
public function test_delete_data_for_users_incorrect_userid(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
$usercontext = \core\context\user::instance($user->id);
// Data is all stored under the users own context.
provider::delete_data_for_users(new approved_userlist(
$usercontext,
'core_sms',
[$otheruser->id]
));
$this->assertEquals(0, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(1, $DB->count_records('sms_messages'));
}
public function test_delete_data_for_users_correct_user(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
$usercontext = \core\context\user::instance($user->id);
// Deleting data for both users only deletes that user's content.
provider::delete_data_for_users(new approved_userlist(
$usercontext,
'core_sms',
[$user->id, $otheruser->id],
));
$this->assertEquals(0, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(1, $DB->count_records('sms_messages'));
}
public function test_delete_data_for_users_wrong_context(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
// Incorrect contexts are ignored.
provider::delete_data_for_users(new approved_userlist(
\core\context\system::instance(),
'core_sms',
[$user->id, $otheruser->id],
));
$this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
}
public function test_get_users_in_context(): void {
global $DB;
$this->resetAfterTest(true);
$user = get_admin();
$otheruser = $this->getDataGenerator()->create_user();
$manager = \core\di::get(manager::class);
$manager->send(
recipientnumber: '12345',
content: 'Hello world',
component: 'core_sms',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $user->id,
async: false,
);
$manager->send(
recipientnumber: '12345',
content: 'Hello, world!',
component: 'core_course',
messagetype: 'example',
recipientuserid: $otheruser->id,
async: false,
);
$this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
$this->assertEquals(3, $DB->count_records('sms_messages'));
// Get the users in the user context - should just be the user of that user context.
$userlist = new userlist(\core\context\user::instance($user->id), 'core_sms');
provider::get_users_in_context($userlist);
$this->assertEquals([$user->id], $userlist->get_userids());
// No users in the system context.
$userlist = new userlist(\core\context\system::instance(), 'core_sms');
provider::get_users_in_context($userlist);
$this->assertEquals([], $userlist->get_userids());
}
}