1f15394e6c3ba2c8cf2afbac977d5e52d954b659
[moodle.git] / comment / tests / privacy_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/>.
16 /**
17  * Privacy tests for core_comment.
18  *
19  * @package    core_comment
20  * @category   test
21  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
26 global $CFG;
28 require_once($CFG->dirroot . '/comment/locallib.php');
29 require_once($CFG->dirroot . '/comment/lib.php');
31 use \core_privacy\tests\provider_testcase;
33 /**
34  * Unit tests for comment/classes/privacy/policy
35  *
36  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
37  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class core_comment_privacy_testcase extends provider_testcase {
41     /**
42      * Check the exporting of comments for a user id in a context.
43      */
44     public function test_export_comments() {
45         $this->resetAfterTest(true);
46         $course = $this->getDataGenerator()->create_course();
47         $context = context_course::instance($course->id);
49         $comment = $this->get_comment_object($context, $course);
51         $user1 = $this->getDataGenerator()->create_user();
52         $user2 = $this->getDataGenerator()->create_user();
54         // Add comments.
55         $comments = [];
56         $firstcomment = 'This is the first comment';
57         $this->setUser($user1);
58         $comment->add($firstcomment);
59         $comments[$user1->id] = $firstcomment;
61         $secondcomment = 'From the second user';
62         $this->setUser($user2);
63         $comment->add($secondcomment);
64         $comments[$user2->id] = $secondcomment;
66         // Retrieve comments only for user1.
67         $this->setUser($user1);
68         $writer = \core_privacy\local\request\writer::with_context($context);
69         \core_comment\privacy\provider::export_comments($context, 'block_comments', 'page_comments', 0, []);
71         $data = $writer->get_data([get_string('commentsubcontext', 'core_comment')]);
72         $exportedcomments = $data->comments;
74         // There is only one comment made by this user.
75         $this->assertCount(1, $exportedcomments);
76         $comment = reset($exportedcomments);
77         $this->assertEquals($comments[$user1->id], format_string($comment->content, FORMAT_PLAIN));
79         // Retrieve comments from any user.
80         \core_comment\privacy\provider::export_comments($context, 'block_comments', 'page_comments', 0, [], false);
82         $data = $writer->get_data([get_string('commentsubcontext', 'core_comment')]);
83         $exportedcomments = $data->comments;
85         // The whole conversation is two comments.
86         $this->assertCount(2, $exportedcomments);
87         foreach ($exportedcomments as $comment) {
88             $this->assertEquals($comments[$comment->userid], format_string($comment->content, FORMAT_PLAIN));
89         }
90     }
92     /**
93      * Tests the deletion of all comments in a context.
94      */
95     public function test_delete_comments_for_all_users_in_context() {
96         $this->resetAfterTest();
98         $course1 = $this->getDataGenerator()->create_course();
99         $course2 = $this->getDataGenerator()->create_course();
101         $coursecontext1 = context_course::instance($course1->id);
102         $coursecontext2 = context_course::instance($course2->id);
104         $user1 = $this->getDataGenerator()->create_user();
105         $user2 = $this->getDataGenerator()->create_user();
107         $comment1 = $this->get_comment_object($coursecontext1, $course1);
108         $comment2 = $this->get_comment_object($coursecontext2, $course2);
110         $this->setUser($user1);
111         $comment1->add('First comment for user 1 on comment 1');
112         $comment2->add('First comment for user 1 on comment 2');
113         $this->setUser($user2);
114         $comment1->add('First comment for user 2 on comment 1');
115         $comment2->add('First comment for user 2 on comment 2');
117         // Delete only for the first context. All records in the comments table for this context should be removed.
118         \core_comment\privacy\provider::delete_comments_for_all_users_in_context($coursecontext1);
119         // No records left here.
120         $this->assertCount(0, $comment1->get_comments());
121         // All of the records are left intact here.
122         $this->assertCount(2, $comment2->get_comments());
124     }
126     /**
127      * Tests deletion of comments for a specified user and contexts.
128      */
129     public function test_delete_comments_for_user() {
130         $this->resetAfterTest();
132         $course1 = $this->getDataGenerator()->create_course();
133         $course2 = $this->getDataGenerator()->create_course();
134         $course3 = $this->getDataGenerator()->create_course();
136         $coursecontext1 = context_course::instance($course1->id);
137         $coursecontext2 = context_course::instance($course2->id);
138         $coursecontext3 = context_course::instance($course3->id);
140         $user1 = $this->getDataGenerator()->create_user();
141         $user2 = $this->getDataGenerator()->create_user();
143         $comment1 = $this->get_comment_object($coursecontext1, $course1);
144         $comment2 = $this->get_comment_object($coursecontext2, $course2);
145         $comment3 = $this->get_comment_object($coursecontext3, $course3);
147         $this->setUser($user1);
148         $comment1->add('First comment for user 1');
149         $comment2->add('User 1 comment in second comment');
151         $this->setUser($user2);
152         $comment2->add('User two replied in comment two');
153         $comment3->add('Comment three for user 2.');
155         // Delete the comments for user 1.
156         $approvedcontextlist = new core_privacy\tests\request\approved_contextlist($user1, 'block_comments',
157                 [$coursecontext1->id, $coursecontext2->id]);
158         \core_comment\privacy\provider::delete_comments_for_user($approvedcontextlist);
160         // No comments left in comments 1 as only user 1 commented there.
161         $this->assertCount(0, $comment1->get_comments());
162         // Only user 2 comments left in comments 2.
163         $comment2comments = $comment2->get_comments();
164         $this->assertCount(1, $comment2comments);
165         $this->assertEquals($user2->id, $comment2comments[0]->userid);
166         // Nothing changed here as user 1 did not leave a comment.
167         $comment3comments = $comment3->get_comments();
168         $this->assertCount(1, $comment3comments);
169         $this->assertEquals($user2->id, $comment3comments[0]->userid);
170     }
172     /**
173      * Creates a comment object
174      *
175      * @param  context $context A context object.
176      * @param  stdClass $course A course object.
177      * @return comment The comment object.
178      */
179     protected function get_comment_object($context, $course) {
180         // Comment on course page.
181         $args = new stdClass;
182         $args->context = $context;
183         $args->course = $course;
184         $args->area = 'page_comments';
185         $args->itemid = 0;
186         $args->component = 'block_comments';
187         $comment = new comment($args);
188         $comment->set_post_permission(true);
189         return $comment;
190     }