diff --git a/admin/tool/dataprivacy/tests/privacy_provider_test.php b/admin/tool/dataprivacy/tests/privacy_provider_test.php new file mode 100644 index 00000000000..e671fa73796 --- /dev/null +++ b/admin/tool/dataprivacy/tests/privacy_provider_test.php @@ -0,0 +1,187 @@ +. + +/** + * Tests for the plugin privacy provider + * + * @package tool_dataprivacy + * @copyright 2020 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +use core_privacy\local\request\userlist; +use core_privacy\local\request\writer; +use core_privacy\tests\provider_testcase; +use tool_dataprivacy\api; +use tool_dataprivacy\local\helper; +use tool_dataprivacy\privacy\provider; + +/** + * Privacy provider tests + * + * @package tool_dataprivacy + * @copyright 2020 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class tool_dataprivacy_privacy_provider_testcase extends provider_testcase { + + /** + * Test provider get_contexts_for_userid method + * + * @return void + */ + public function test_get_contexts_for_userid() { + $this->resetAfterTest(); + + $user = $this->getDataGenerator()->create_user(); + $context = context_user::instance($user->id); + + // Returned context list should contain a single item. + $contextlist = $this->get_contexts_for_userid($user->id, 'tool_dataprivacy'); + $this->assertCount(1, $contextlist); + + // We should have the user context of our test user. + $this->assertSame($context, $contextlist->current()); + } + + /** + * Test provider get_users_in_context method + * + * @return void + */ + public function test_get_users_in_context() { + $this->resetAfterTest(); + + $user = $this->getDataGenerator()->create_user(); + $context = context_user::instance($user->id); + + $userlist = new userlist($context, 'tool_dataprivacy'); + provider::get_users_in_context($userlist); + + $this->assertEquals([$user->id], $userlist->get_userids()); + } + + /** + * Test provider get_users_in_context method for a non-user context + * + * @return void + */ + public function test_get_users_in_context_non_user_context() { + $context = context_system::instance(); + + $userlist = new userlist($context, 'tool_dataprivacy'); + provider::get_users_in_context($userlist); + + $this->assertEmpty($userlist); + } + + /** + * Test provider export_user_data method + * + * @return void + */ + public function test_export_user_data() { + $this->resetAfterTest(); + + $user = $this->getDataGenerator()->create_user(); + $context = context_user::instance($user->id); + + $this->setUser($user); + + // Create an export request, approve it. + $requestexport = api::create_data_request($user->id, api::DATAREQUEST_TYPE_EXPORT, + 'Please export my stuff'); + api::update_request_status($requestexport->get('id'), api::DATAREQUEST_STATUS_APPROVED); + + // Create a deletion request, reject it. + $requestdelete = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE); + api::update_request_status($requestdelete->get('id'), api::DATAREQUEST_STATUS_REJECTED, 0, 'Nope'); + + $this->export_context_data_for_user($user->id, $context, 'tool_dataprivacy'); + + /** @var \core_privacy\tests\request\content_writer $writer */ + $writer = writer::with_context($context); + $this->assertTrue($writer->has_any_data()); + + /** @var stdClass[] $data */ + $data = (array) $writer->get_data([ + get_string('privacyandpolicies', 'admin'), + get_string('datarequests', 'tool_dataprivacy'), + ]); + + $this->assertCount(2, $data); + + $strs = get_strings(['requesttypeexportshort', 'requesttypedeleteshort', + 'statusapproved', 'statusrejected', 'creationmanual'], 'tool_dataprivacy'); + + // First item is the approved export request. + $this->assertEquals($strs->requesttypeexportshort, $data[0]->type); + $this->assertEquals($strs->statusapproved, $data[0]->status); + $this->assertEquals($strs->creationmanual, $data[0]->creationmethod); + $this->assertEquals($requestexport->get('comments'), $data[0]->comments); + $this->assertEmpty($data[0]->dpocomment); + $this->assertNotEmpty($data[0]->timecreated); + + // Next is the rejected deletion request. + $this->assertEquals($strs->requesttypedeleteshort, $data[1]->type); + $this->assertEquals($strs->statusrejected, $data[1]->status); + $this->assertEquals($strs->creationmanual, $data[1]->creationmethod); + $this->assertEmpty($data[1]->comments); + $this->assertContains('Nope', $data[1]->dpocomment); + $this->assertNotEmpty($data[1]->timecreated); + } + + /** + * Test class export_user_preferences method + * + * @return void + */ + public function test_export_user_preferences() { + $this->resetAfterTest(); + + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + + // Set filters preference. + $filters = [ + helper::FILTER_TYPE . ':' . api::DATAREQUEST_TYPE_EXPORT, + helper::FILTER_STATUS . ':' . api::DATAREQUEST_STATUS_PENDING, + ]; + set_user_preference(helper::PREF_REQUEST_FILTERS, json_encode($filters), $user); + + // Set paging preference. + set_user_preference(helper::PREF_REQUEST_PERPAGE, 6, $user); + + provider::export_user_preferences($user->id); + + /** @var \core_privacy\tests\request\content_writer $writer */ + $writer = writer::with_context(context_system::instance()); + $this->assertTrue($writer->has_any_data()); + + /** @var stdClass[] $preferences */ + $preferences = (array) $writer->get_user_preferences('tool_dataprivacy'); + $this->assertCount(2, $preferences); + + $this->assertEquals((object) [ + 'value' => '1:1, 2:0', + 'description' => 'Type: Export, Status: Pending', + ], $preferences[helper::PREF_REQUEST_FILTERS]); + + $this->assertEquals(6, $preferences[helper::PREF_REQUEST_PERPAGE]->value); + } +} \ No newline at end of file