78556c9bd529c102900b32d1b97ed742bad61906
[moodle.git] / admin / tool / policy / tests / privacy_provider_test.php
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/>.
17 /**
18  * Privacy provider tests.
19  *
20  * @package    tool_policy
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  */
26 use core_privacy\local\metadata\collection;
27 use tool_policy\privacy\provider;
28 use tool_policy\api;
29 use tool_policy\policy_version;
30 use core_privacy\local\request\approved_contextlist;
31 use core_privacy\local\request\writer;
33 defined('MOODLE_INTERNAL') || die();
35 /**
36  * Privacy provider tests class.
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 tool_policy_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
42     /** @var stdClass The user object. */
43     protected $user;
45     /** @var stdClass The manager user object. */
46     protected $manager;
48     /**
49      * Setup function. Will create a user.
50      */
51     protected function setUp() {
52         $this->resetAfterTest();
54         $generator = $this->getDataGenerator();
55         $this->user = $generator->create_user();
57         // Create manager user.
58         $this->manager = $generator->create_user();
59         $syscontext = context_system::instance();
60         $rolemanagerid = create_role('Policy manager', 'policymanager', 'Can manage policy documents');
61         assign_capability('tool/policy:managedocs', CAP_ALLOW, $rolemanagerid, $syscontext->id);
62         assign_capability('tool/policy:acceptbehalf', CAP_ALLOW, $rolemanagerid, $syscontext->id);
63         role_assign($rolemanagerid, $this->manager->id, $syscontext->id);
64         accesslib_clear_all_caches_for_unit_testing();
65     }
67     /**
68      * Test getting the context for the user ID related to this plugin.
69      */
70     public function test_get_contexts_for_userid() {
71         global $CFG;
73         // When there are no policies or agreements context list is empty.
74         $contextlist = \tool_policy\privacy\provider::get_contexts_for_userid($this->manager->id);
75         $this->assertEmpty($contextlist);
76         $contextlist = \tool_policy\privacy\provider::get_contexts_for_userid($this->user->id);
77         $this->assertEmpty($contextlist);
79         // Create a policy.
80         $this->setUser($this->manager);
81         $CFG->sitepolicyhandler = 'tool_policy';
82         $policy = $this->add_policy();
83         api::make_current($policy->get('id'));
85         // After creating a policy, there should be manager context.
86         $contextlist = \tool_policy\privacy\provider::get_contexts_for_userid($this->manager->id);
87         $this->assertEquals(1, $contextlist->count());
89         // But when there are no agreements, user context list is empty.
90         $contextlist = \tool_policy\privacy\provider::get_contexts_for_userid($this->user->id);
91         $this->assertEmpty($contextlist);
93         // Agree to the policy.
94         $this->setUser($this->user);
95         api::accept_policies([$policy->get('id')]);
97         // There should be user context.
98         $contextlist = \tool_policy\privacy\provider::get_contexts_for_userid($this->user->id);
99         $this->assertEquals(1, $contextlist->count());
100     }
102     public function test_export_agreements() {
103         global $CFG;
105         $otheruser = $this->getDataGenerator()->create_user();
106         $otherusercontext = \context_user::instance($otheruser->id);
108         // Create policies and agree to them as manager.
109         $this->setUser($this->manager);
110         $managercontext = \context_user::instance($this->manager->id);
111         $systemcontext = \context_system::instance();
112         $agreementsubcontext = [
113             get_string('privacyandpolicies', 'admin'),
114             get_string('useracceptances', 'tool_policy')
115         ];
116         $versionsubcontext = [
117             get_string('policydocuments', 'tool_policy')
118         ];
119         $CFG->sitepolicyhandler = 'tool_policy';
120         $policy1 = $this->add_policy();
121         api::make_current($policy1->get('id'));
122         $policy2 = $this->add_policy();
123         api::make_current($policy2->get('id'));
124         api::accept_policies([$policy1->get('id'), $policy2->get('id')]);
126         // Agree to the policies for oneself.
127         $this->setUser($this->user);
128         $usercontext = \context_user::instance($this->user->id);
129         api::accept_policies([$policy1->get('id'), $policy2->get('id')]);
131         // Request export for this user.
132         $contextlist = provider::get_contexts_for_userid($this->user->id);
133         $this->assertCount(1, $contextlist);
134         $this->assertEquals([$usercontext->id], $contextlist->get_contextids());
136         $approvedcontextlist = new approved_contextlist($this->user, 'tool_policy', [$usercontext->id]);
137         provider::export_user_data($approvedcontextlist);
139         // User can not see manager's agreements but can see his own.
140         $writer = writer::with_context($managercontext);
141         $this->assertFalse($writer->has_any_data());
143         $writer = writer::with_context($usercontext);
144         $this->assertTrue($writer->has_any_data());
146         // Test policy 1.
147         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy1->to_record())]);
148         $datauser = $writer->get_data($subcontext);
149         $this->assertEquals($policy1->get('name'), $datauser->name);
150         $this->assertEquals($this->user->id, $datauser->agreedby);
151         $this->assertEquals(strip_tags($policy1->get('summary')), strip_tags($datauser->summary));
152         $this->assertEquals(strip_tags($policy1->get('content')), strip_tags($datauser->content));
154         // Test policy 2.
155         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy2->to_record())]);
156         $datauser = $writer->get_data($subcontext);
157         $this->assertEquals($policy2->get('name'), $datauser->name);
158         $this->assertEquals($this->user->id, $datauser->agreedby);
159         $this->assertEquals(strip_tags($policy2->get('summary')), strip_tags($datauser->summary));
160         $this->assertEquals(strip_tags($policy2->get('content')), strip_tags($datauser->content));
161     }
163     public function test_export_agreements_for_other() {
164         global $CFG;
166         $managercontext = \context_user::instance($this->manager->id);
167         $systemcontext = \context_system::instance();
168         $usercontext = \context_user::instance($this->user->id);
170         // Create policies and agree to them as manager.
171         $this->setUser($this->manager);
172         $agreementsubcontext = [
173             get_string('privacyandpolicies', 'admin'),
174             get_string('useracceptances', 'tool_policy')
175         ];
176         $versionsubcontext = [
177             get_string('policydocuments', 'tool_policy')
178         ];
179         $CFG->sitepolicyhandler = 'tool_policy';
180         $policy1 = $this->add_policy();
181         api::make_current($policy1->get('id'));
182         $policy2 = $this->add_policy();
183         api::make_current($policy2->get('id'));
184         api::accept_policies([$policy1->get('id'), $policy2->get('id')]);
186         // Agree to the other user's policies.
187         api::accept_policies([$policy1->get('id'), $policy2->get('id')], $this->user->id, 'My note');
189         // Request export for the manager.
190         $contextlist = provider::get_contexts_for_userid($this->manager->id);
191         $this->assertCount(3, $contextlist);
192         $this->assertEquals(
193             [$managercontext->id, $usercontext->id, $systemcontext->id],
194             $contextlist->get_contextids(),
195             '',
196             0.0,
197             1,
198             true
199         );
201         $approvedcontextlist = new approved_contextlist($this->user, 'tool_policy', [$usercontext->id]);
202         provider::export_user_data($approvedcontextlist);
204         // The user context has data.
205         $writer = writer::with_context($usercontext);
206         $this->assertTrue($writer->has_any_data());
208         // Test policy 1.
209         $writer = writer::with_context($usercontext);
210         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy1->to_record())]);
211         $datauser = $writer->get_data($subcontext);
212         $this->assertEquals($policy1->get('name'), $datauser->name);
213         $this->assertEquals($this->manager->id, $datauser->agreedby);
214         $this->assertEquals(strip_tags($policy1->get('summary')), strip_tags($datauser->summary));
215         $this->assertEquals(strip_tags($policy1->get('content')), strip_tags($datauser->content));
217         // Test policy 2.
218         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy2->to_record())]);
219         $datauser = $writer->get_data($subcontext);
220         $this->assertEquals($policy2->get('name'), $datauser->name);
221         $this->assertEquals($this->manager->id, $datauser->agreedby);
222         $this->assertEquals(strip_tags($policy2->get('summary')), strip_tags($datauser->summary));
223         $this->assertEquals(strip_tags($policy2->get('content')), strip_tags($datauser->content));
224     }
226     public function test_export_created_policies() {
227         global $CFG;
229         // Create policies and agree to them as manager.
230         $this->setUser($this->manager);
231         $managercontext = \context_user::instance($this->manager->id);
232         $systemcontext = \context_system::instance();
233         $agreementsubcontext = [
234             get_string('privacyandpolicies', 'admin'),
235             get_string('useracceptances', 'tool_policy')
236         ];
237         $versionsubcontext = [
238             get_string('policydocuments', 'tool_policy')
239         ];
240         $CFG->sitepolicyhandler = 'tool_policy';
241         $policy1 = $this->add_policy();
242         api::make_current($policy1->get('id'));
243         $policy2 = $this->add_policy();
244         api::make_current($policy2->get('id'));
245         api::accept_policies([$policy1->get('id'), $policy2->get('id')]);
247         // Agree to the policies for oneself.
248         $contextlist = provider::get_contexts_for_userid($this->manager->id);
249         $this->assertCount(2, $contextlist);
250         $this->assertEquals([$managercontext->id, $systemcontext->id], $contextlist->get_contextids(), '', 0.0, 1, true);
252         $approvedcontextlist = new approved_contextlist($this->manager, 'tool_policy', $contextlist->get_contextids());
253         provider::export_user_data($approvedcontextlist);
255         // User has agreed to policies.
256         $writer = writer::with_context($managercontext);
257         $this->assertTrue($writer->has_any_data());
259         // Test policy 1.
260         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy1->to_record())]);
261         $datauser = $writer->get_data($subcontext);
262         $this->assertEquals($policy1->get('name'), $datauser->name);
263         $this->assertEquals($this->manager->id, $datauser->agreedby);
264         $this->assertEquals(strip_tags($policy1->get('summary')), strip_tags($datauser->summary));
265         $this->assertEquals(strip_tags($policy1->get('content')), strip_tags($datauser->content));
267         // Test policy 2.
268         $subcontext = array_merge($agreementsubcontext, [get_string('policynamedversion', 'tool_policy', $policy2->to_record())]);
269         $datauser = $writer->get_data($subcontext);
270         $this->assertEquals($policy2->get('name'), $datauser->name);
271         $this->assertEquals($this->manager->id, $datauser->agreedby);
272         $this->assertEquals(strip_tags($policy2->get('summary')), strip_tags($datauser->summary));
273         $this->assertEquals(strip_tags($policy2->get('content')), strip_tags($datauser->content));
275         // User can see policy documents.
276         $writer = writer::with_context($systemcontext);
277         $this->assertTrue($writer->has_any_data());
279         $subcontext = array_merge($versionsubcontext, [get_string('policynamedversion', 'tool_policy', $policy1->to_record())]);
280         $dataversion = $writer->get_data($subcontext);
281         $this->assertEquals($policy1->get('name'), $dataversion->name);
282         $this->assertEquals(get_string('yes'), $dataversion->createdbyme);
284         $subcontext = array_merge($versionsubcontext, [get_string('policynamedversion', 'tool_policy', $policy2->to_record())]);
285         $dataversion = $writer->get_data($subcontext);
286         $this->assertEquals($policy2->get('name'), $dataversion->name);
287         $this->assertEquals(get_string('yes'), $dataversion->createdbyme);
288     }
290     /**
291      * Helper method that creates a new policy for testing
292      *
293      * @param array $params
294      * @return policy_version
295      */
296     protected function add_policy($params = []) {
297         static $counter = 0;
298         $counter++;
300         $defaults = [
301             'name' => 'Policy '.$counter,
302             'summary_editor' => ['text' => "P$counter summary", 'format' => FORMAT_HTML, 'itemid' => 0],
303             'content_editor' => ['text' => "P$counter content", 'format' => FORMAT_HTML, 'itemid' => 0],
304         ];
306         $params = (array)$params + $defaults;
307         $formdata = \tool_policy\api::form_policydoc_data(new policy_version(0));
308         foreach ($params as $key => $value) {
309             $formdata->$key = $value;
310         }
311         return api::form_policydoc_add($formdata);
312     }