MDL-61308 assign_submission: Privacy code for user rights.
[moodle.git] / mod / assign / tests / privacy_submission_legacy_polyfill_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  * Unit tests for the privacy legacy polyfill for mod_assign.
18  *
19  * @package     mod_assign
20  * @category    test
21  * @copyright   2018 Adrian Greeve <adriangreeve.com>
22  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 defined('MOODLE_INTERNAL') || die();
26 global $CFG;
27 require_once($CFG->dirroot . '/mod/assign/submissionplugin.php');
28 require_once($CFG->dirroot . '/mod/assign/submission/comments/locallib.php');
30 /**
31  * Unit tests for the assignment submission subplugins API's privacy legacy_polyfill.
32  *
33  * @copyright   2018 Adrian Greeve <adriangreeve.com>
34  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35  */
36 class mod_assignsubmission_privacy_legacy_polyfill_test extends advanced_testcase {
38     /**
39      * Convenience function to create an instance of an assignment.
40      *
41      * @param array $params Array of parameters to pass to the generator
42      * @return assign The assign class.
43      */
44     protected function create_instance($params = array()) {
45         $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
46         $instance = $generator->create_instance($params);
47         $cm = get_coursemodule_from_instance('assign', $instance->id);
48         $context = \context_module::instance($cm->id);
49         return new \assign($context, $cm, $params['course']);
50     }
52     /**
53      * Test the get_context_for_userid_within_submission shim.
54      */
55     public function test_get_context_for_userid_within_submission() {
56         
57         $userid = 21;
58         $contextlist = new \core_privacy\local\request\contextlist();
59         $mock = $this->createMock(test_assignsubmission_legacy_polyfill_mock_wrapper::class);
60         $mock->expects($this->once())
61             ->method('get_return_value')
62             ->with('_get_context_for_userid_within_submission', [$userid, $contextlist]);
63         test_legacy_polyfill_submission_provider::$mock = $mock;
64         test_legacy_polyfill_submission_provider::get_context_for_userid_within_submission($userid, $contextlist);
65     }
67     /**
68      * Test the get_student_user_ids shim.
69      */
70     public function test_get_student_user_ids() {
71         $teacherid = 107;
72         $assignid = 15;
73         $useridlist = new \mod_assign\privacy\useridlist($teacherid, $assignid);
74         $mock = $this->createMock(test_assignsubmission_legacy_polyfill_mock_wrapper::class);
75         $mock->expects($this->once())
76             ->method('get_return_value')
77             ->with('_get_student_user_ids', [$useridlist]);
78         test_legacy_polyfill_submission_provider::$mock = $mock;
79         test_legacy_polyfill_submission_provider::get_student_user_ids($useridlist);
80     }
82     /**
83      * Test the export_submission_user_data shim.
84      */
85     public function test_export_submission_user_data() {
86         $this->resetAfterTest();
87         $course = $this->getDataGenerator()->create_course();
88         $assign = $this->create_instance(['course' => $course]);
89         $context = context_system::instance();
90         $subplugin = new assign_submission_comments($assign, 'comment');
91         $requestdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign);
92         $mock = $this->createMock(test_assignsubmission_legacy_polyfill_mock_wrapper::class);
93         $mock->expects($this->once())
94             ->method('get_return_value')
95             ->with('_export_submission_user_data', [$requestdata]);
96         test_legacy_polyfill_submission_provider::$mock = $mock;
97         test_legacy_polyfill_submission_provider::export_submission_user_data($requestdata);
98     }
100     /**
101      * Test the delete_submission_for_context shim.
102      */
103     public function test_delete_submission_for_context() {
104         $this->resetAfterTest();
105         $course = $this->getDataGenerator()->create_course();
106         $assign = $this->create_instance(['course' => $course]);
107         $context = context_system::instance();
108         $subplugin = new assign_submission_comments($assign, 'comment');
109         $requestdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign);
110         $mock = $this->createMock(test_assignsubmission_legacy_polyfill_mock_wrapper::class);
111         $mock->expects($this->once())
112             ->method('get_return_value')
113             ->with('_delete_submission_for_context', [$requestdata]);
114         test_legacy_polyfill_submission_provider::$mock = $mock;
115         test_legacy_polyfill_submission_provider::delete_submission_for_context($requestdata);
116     }
118     /**
119      * Test the delete submission for grade shim.
120      */
121     public function test_delete_submission_for_userid() {
122         $this->resetAfterTest();
123         $course = $this->getDataGenerator()->create_course();
124         $assign = $this->create_instance(['course' => $course]);
125         $context = context_system::instance();
126         $subplugin = new assign_submission_comments($assign, 'comment');
127         $requestdata = new \mod_assign\privacy\assign_plugin_request_data($context, $assign);
128         $mock = $this->createMock(test_assignsubmission_legacy_polyfill_mock_wrapper::class);
129         $mock->expects($this->once())
130             ->method('get_return_value')
131             ->with('_delete_submission_for_userid', [$requestdata]);
132         test_legacy_polyfill_submission_provider::$mock = $mock;
133         test_legacy_polyfill_submission_provider::delete_submission_for_userid($requestdata);
134     }
136 /**
137  * Legacy polyfill test class for the assignsubmission_provider.
138  *
139  * @copyright   2018 Adrian Greeve <adriangreeve.com>
140  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
141  */
142 class test_legacy_polyfill_submission_provider implements \mod_assign\privacy\assignsubmission_provider {
143     use \mod_assign\privacy\submission_legacy_polyfill;
144     /**
145      * @var test_legacy_polyfill_submission_provider $mock.
146      */
147     public static $mock = null;
149     /**
150      * Retrieves the contextids associated with the provided userid for this subplugin.
151      * NOTE if your subplugin must have an entry in the assign_grade table to work, then this
152      * method can be empty.
153      *
154      * @param  int $userid The user ID to get context IDs for.
155      * @param  contextlist $contextlist Use add_from_sql with this object to add your context IDs.
156      */
157     public static function _get_context_for_userid_within_submission(int $userid,
158             \core_privacy\local\request\contextlist $contextlist) {
159         static::$mock->get_return_value(__FUNCTION__, func_get_args());
160     }
162     /**
163      * Returns student user ids related to the provided teacher ID. If it is possible that a student ID will not be returned by
164      * the sql query in \mod_assign\privacy\provider::find_grader_info() Then you need to provide some sql to retrive those
165      * student IDs. This is highly likely if you had to fill in get_context_for_userid_within_submission above.
166      *
167      * @param  useridlist $useridlist A list of user IDs of students graded by this user.
168      */
169     public static function _get_student_user_ids(\mod_assign\privacy\useridlist $useridlist) {
170         static::$mock->get_return_value(__FUNCTION__, func_get_args());
171     }
173     /**
174      * This method is used to export any user data this sub-plugin has using the assign_plugin_request_data object to get the
175      * context and userid.
176      * assign_plugin_request_data contains:
177      * - context
178      * - grade object
179      * - current path (subcontext)
180      * - user object
181      *
182      * @param  assign_plugin_request_data $exportdata Contains data to help export the user information.
183      */
184     public static function _export_submission_user_data(\mod_assign\privacy\assign_plugin_request_data $exportdata) {
185         static::$mock->get_return_value(__FUNCTION__, func_get_args());
186     }
188     /**
189      * Any call to this method should delete all user data for the context defined in the deletion_criteria.
190      * assign_plugin_request_data contains:
191      * - context
192      * - assign object
193      *
194      * @param  assign_plugin_request_data $requestdata Data useful for deleting user data from this sub-plugin.
195      */
196     public static function _delete_submission_for_context(\mod_assign\privacy\assign_plugin_request_data $requestdata) {
197         static::$mock->get_return_value(__FUNCTION__, func_get_args());
198     }
200     /**
201      * A call to this method should delete user data (where practicle) from the userid and context.
202      * assign_plugin_request_data contains:
203      * - context
204      * - grade object
205      * - user object
206      * - assign object
207      *
208      * @param  assign_plugin_request_data $requestdata Data useful for deleting user data.
209      */
210     public static function _delete_submission_for_userid(\mod_assign\privacy\assign_plugin_request_data $requestdata) {
211         static::$mock->get_return_value(__FUNCTION__, func_get_args());
212     }
214 /**
215  * Called inside the polyfill methods in the test polyfill provider, allowing us to ensure these are called with correct params.
216  *
217  * @copyright   2018 Adrian Greeve <adriangreeve.com>
218  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
219  */
220 class test_assignsubmission_legacy_polyfill_mock_wrapper {
221     /**
222      * Get the return value for the specified item.
223      */
224     public function get_return_value() {
225     }