Moodle release 3.3.8
[moodle.git] / competency / tests / lib_test.php
blob9ed2e9268448d6c682cd3d3bf8daca67897720a8
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.
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 * Lib tests.
20 * @package core_competency
21 * @copyright 2015 Frédéric Massart - FMCorz.net
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') || die();
27 use core_competency\plan;
28 use core_competency\url;
29 use core_competency\user_competency;
31 global $CFG;
33 /**
34 * Lib testcase.
36 * @package core_competency
37 * @copyright 2015 Frédéric Massart - FMCorz.net
38 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40 class core_competency_lib_testcase extends advanced_testcase {
42 public function test_comment_add_user_competency() {
43 global $DB;
44 $this->resetAfterTest();
45 $dg = $this->getDataGenerator();
46 $lpg = $dg->get_plugin_generator('core_competency');
48 $u1 = $dg->create_user();
49 $u2 = $dg->create_user();
50 $u3 = $dg->create_user();
51 $reviewerroleid = $dg->create_role();
52 assign_capability('moodle/competency:planview', CAP_ALLOW, $reviewerroleid, context_system::instance()->id, true);
53 assign_capability('moodle/competency:usercompetencycomment', CAP_ALLOW, $reviewerroleid,
54 context_system::instance()->id, true);
55 $dg->role_assign($reviewerroleid, $u2->id, context_user::instance($u1->id));
56 $dg->role_assign($reviewerroleid, $u3->id, context_user::instance($u1->id));
57 accesslib_clear_all_caches_for_unit_testing();
59 $f1 = $lpg->create_framework();
60 $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'))); // In 1 plan.
61 $c2 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'))); // In 2 plans.
62 $c3 = $lpg->create_competency(array('competencyframeworkid' => $f1->get('id'))); // Orphan.
64 $p1 = $lpg->create_plan(array('userid' => $u1->id));
65 $lpg->create_plan_competency(array('planid' => $p1->get('id'), 'competencyid' => $c1->get('id')));
66 $lpg->create_plan_competency(array('planid' => $p1->get('id'), 'competencyid' => $c2->get('id')));
67 $p2 = $lpg->create_plan(array('userid' => $u1->id));
68 $lpg->create_plan_competency(array('planid' => $p2->get('id'), 'competencyid' => $c2->get('id')));
70 $DB->set_field(plan::TABLE, 'timemodified', 1, array('id' => $p1->get('id'))); // Make plan 1 appear as old.
71 $p1->read();
73 $uc1 = $lpg->create_user_competency(array('userid' => $u1->id, 'competencyid' => $c1->get('id'),
74 'status' => user_competency::STATUS_IN_REVIEW, 'reviewerid' => $u2->id));
75 $uc2 = $lpg->create_user_competency(array('userid' => $u1->id, 'competencyid' => $c2->get('id'),
76 'status' => user_competency::STATUS_IN_REVIEW, 'reviewerid' => $u2->id));
77 $uc3 = $lpg->create_user_competency(array('userid' => $u1->id, 'competencyid' => $c3->get('id'),
78 'status' => user_competency::STATUS_IN_REVIEW, 'reviewerid' => $u2->id));
80 // Post a comment for the user competency being in one plan. The reviewer is messaged.
81 $this->setUser($u1);
82 $comment = $uc1->get_comment_object();
83 $sink = $this->redirectMessages();
84 $comment->add('Hello world!');
85 $messages = $sink->get_messages();
86 $sink->close();
87 $this->assertCount(1, $messages);
88 $message = array_pop($messages);
90 $expectedurlname = $c1->get('shortname');
91 $expectedurl = url::user_competency_in_plan($u1->id, $c1->get('id'), $p1->get('id'));
92 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
93 $this->assertEquals($u2->id, $message->useridto);
94 $this->assertTrue(strpos($message->fullmessage, 'Hello world!') !== false);
95 $this->assertTrue(strpos($message->fullmessagehtml, 'Hello world!') !== false);
96 $this->assertEquals(FORMAT_MOODLE, $message->fullmessageformat);
97 $this->assertEquals($expectedurl->out(false), $message->contexturl);
98 $this->assertEquals($expectedurlname, $message->contexturlname);
100 // Reviewer posts a comment for the user competency being in two plans. Owner is messaged.
101 $this->setUser($u2);
102 $comment = $uc2->get_comment_object();
103 $sink = $this->redirectMessages();
104 $comment->add('Hello world!');
105 $messages = $sink->get_messages();
106 $sink->close();
107 $this->assertCount(1, $messages);
108 $message = array_pop($messages);
110 $expectedurlname = $c2->get('shortname');
111 $expectedurl = url::user_competency_in_plan($u1->id, $c2->get('id'), $p2->get('id'));
112 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
113 $this->assertEquals($u1->id, $message->useridto);
114 $this->assertTrue(strpos($message->fullmessage, 'Hello world!') !== false);
115 $this->assertTrue(strpos($message->fullmessagehtml, 'Hello world!') !== false);
116 $this->assertEquals(FORMAT_MOODLE, $message->fullmessageformat);
117 $this->assertEquals($expectedurl->out(false), $message->contexturl);
118 $this->assertEquals($expectedurlname, $message->contexturlname);
120 // Reviewer posts a comment for the user competency being in no plans. User is messaged.
121 $this->setUser($u2);
122 $comment = $uc3->get_comment_object();
123 $sink = $this->redirectMessages();
124 $comment->add('Hello world!');
125 $messages = $sink->get_messages();
126 $sink->close();
127 $this->assertCount(1, $messages);
128 $message = array_pop($messages);
130 $expectedurlname = get_string('userplans', 'core_competency');
131 $expectedurl = url::plans($u1->id);
132 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
133 $this->assertEquals($u1->id, $message->useridto);
134 $this->assertTrue(strpos($message->fullmessage, 'Hello world!') !== false);
135 $this->assertTrue(strpos($message->fullmessagehtml, 'Hello world!') !== false);
136 $this->assertEquals(FORMAT_MOODLE, $message->fullmessageformat);
137 $this->assertEquals($expectedurl->out(false), $message->contexturl);
138 $this->assertEquals($expectedurlname, $message->contexturlname);
140 // A comment is posted by another user, reviewer and owner are messaged.
141 $this->setUser($u3);
142 $comment = $uc3->get_comment_object();
143 $sink = $this->redirectMessages();
144 $comment->add('Hello world!');
145 $messages = $sink->get_messages();
146 $sink->close();
147 $this->assertCount(2, $messages);
148 $message1 = array_shift($messages);
149 $message2 = array_shift($messages);
150 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
151 $this->assertEquals($u1->id, $message1->useridto);
152 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
153 $this->assertEquals($u2->id, $message2->useridto);
155 // A comment is posted in HTML.
156 $this->setUser($u2);
157 $comment = $uc3->get_comment_object();
158 $sink = $this->redirectMessages();
159 $comment->add('<em>Hello world!</em>', FORMAT_HTML);
160 $messages = $sink->get_messages();
161 $sink->close();
162 $this->assertCount(1, $messages);
163 $message = array_pop($messages);
165 $expectedurlname = get_string('userplans', 'core_competency');
166 $expectedurl = url::plans($u1->id);
167 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
168 $this->assertEquals($u1->id, $message->useridto);
169 $this->assertTrue(strpos($message->fullmessage, '<em>Hello world!</em>') !== false);
170 $this->assertTrue(strpos($message->fullmessagehtml, '<em>Hello world!</em>') !== false);
171 $this->assertEquals(FORMAT_HTML, $message->fullmessageformat);
172 $this->assertEquals($expectedurl->out(false), $message->contexturl);
173 $this->assertEquals($expectedurlname, $message->contexturlname);
177 * Commenting on a plan.
179 public function test_comment_add_plan() {
180 $this->resetAfterTest();
181 $dg = $this->getDataGenerator();
182 $lpg = $dg->get_plugin_generator('core_competency');
184 $u1 = $dg->create_user();
185 $u2 = $dg->create_user();
186 $u3 = $dg->create_user();
187 $userroleid = $dg->create_role();
188 $reviewerroleid = $dg->create_role();
189 assign_capability('moodle/competency:planviewowndraft', CAP_ALLOW, $userroleid, context_system::instance()->id, true);
190 assign_capability('moodle/competency:planviewown', CAP_ALLOW, $userroleid, context_system::instance()->id, true);
191 assign_capability('moodle/competency:planviewdraft', CAP_ALLOW, $reviewerroleid, context_system::instance()->id, true);
192 assign_capability('moodle/competency:planmanage', CAP_ALLOW, $reviewerroleid, context_system::instance()->id, true);
193 assign_capability('moodle/competency:plancomment', CAP_ALLOW, $reviewerroleid, context_system::instance()->id, true);
194 $dg->role_assign($userroleid, $u1->id, context_user::instance($u1->id));
195 $dg->role_assign($reviewerroleid, $u2->id, context_user::instance($u1->id));
196 $dg->role_assign($reviewerroleid, $u3->id, context_system::instance());
197 accesslib_clear_all_caches_for_unit_testing();
199 $p1 = $lpg->create_plan(array('userid' => $u1->id));
201 // Post a comment in own plan, no reviewer. Nobody is messaged.
202 $this->setUser($u1);
203 $comment = $p1->get_comment_object();
204 $sink = $this->redirectMessages();
205 $comment->add('Hello world!');
206 $messages = $sink->get_messages();
207 $sink->close();
208 $this->assertCount(0, $messages);
210 // Post a comment in plan as someone else, no reviewer. The owner is messages.
211 $this->setUser($u3);
212 $comment = $p1->get_comment_object();
213 $sink = $this->redirectMessages();
214 $comment->add('Hello world!');
215 $messages = $sink->get_messages();
216 $sink->close();
217 $this->assertCount(1, $messages);
218 $message = array_pop($messages);
219 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
220 $this->assertEquals($u1->id, $message->useridto);
222 // Post a comment in a plan with reviewer. The reviewer is messaged.
223 $p1->set('reviewerid', $u2->id);
224 $p1->update();
225 $this->setUser($u1);
226 $comment = $p1->get_comment_object();
227 $sink = $this->redirectMessages();
228 $comment->add('Hello world!');
229 $messages = $sink->get_messages();
230 $sink->close();
231 $this->assertCount(1, $messages);
232 $message = array_pop($messages);
233 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
234 $this->assertEquals($u2->id, $message->useridto);
236 // Post a comment as reviewer in a plan being reviewed. The owner is messaged.
237 $p1->set('reviewerid', $u2->id);
238 $p1->update();
239 $this->setUser($u2);
240 $comment = $p1->get_comment_object();
241 $sink = $this->redirectMessages();
242 $comment->add('Hello world!');
243 $messages = $sink->get_messages();
244 $sink->close();
245 $this->assertCount(1, $messages);
246 $message = array_pop($messages);
247 $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom);
248 $this->assertEquals($u1->id, $message->useridto);
250 // Post a comment as someone else in a plan being reviewed. The owner and reviewer are messaged.
251 $p1->set('reviewerid', $u2->id);
252 $p1->update();
253 $this->setUser($u3);
254 $comment = $p1->get_comment_object();
255 $sink = $this->redirectMessages();
256 $comment->add('Hello world!');
257 $messages = $sink->get_messages();
258 $sink->close();
259 $this->assertCount(2, $messages);
260 $message1 = array_shift($messages);
261 $message2 = array_shift($messages);
262 $this->assertEquals(core_user::get_noreply_user()->id, $message1->useridfrom);
263 $this->assertEquals($u1->id, $message1->useridto);
264 $this->assertEquals(core_user::get_noreply_user()->id, $message2->useridfrom);
265 $this->assertEquals($u2->id, $message2->useridto);
267 $p1->set('reviewerid', null);
268 $p1->update();
270 // Test message content.
271 $this->setUser($u3);
272 $comment = $p1->get_comment_object();
273 $sink = $this->redirectMessages();
274 $comment->add('Hello world!');
275 $messages = $sink->get_messages();
276 $sink->close();
277 $this->assertCount(1, $messages);
278 $message = array_pop($messages);
280 $expectedurlname = $p1->get('name');
281 $expectedurl = url::plan($p1->get('id'));
282 $this->assertTrue(strpos($message->fullmessage, 'Hello world!') !== false);
283 $this->assertTrue(strpos($message->fullmessagehtml, 'Hello world!') !== false);
284 $this->assertEquals(FORMAT_MOODLE, $message->fullmessageformat);
285 $this->assertEquals($expectedurl->out(false), $message->contexturl);
286 $this->assertEquals($expectedurlname, $message->contexturlname);
288 // Test message content as HTML.
289 $this->setUser($u3);
290 $comment = $p1->get_comment_object();
291 $sink = $this->redirectMessages();
292 $comment->add('<em>Hello world!</em>', FORMAT_HTML);
293 $messages = $sink->get_messages();
294 $sink->close();
295 $this->assertCount(1, $messages);
296 $message = array_pop($messages);
298 $expectedurlname = $p1->get('name');
299 $expectedurl = url::plan($p1->get('id'));
300 $this->assertTrue(strpos($message->fullmessage, '<em>Hello world!</em>') !== false);
301 $this->assertTrue(strpos($message->fullmessagehtml, '<em>Hello world!</em>') !== false);
302 $this->assertEquals(FORMAT_HTML, $message->fullmessageformat);
303 $this->assertEquals($expectedurl->out(false), $message->contexturl);
304 $this->assertEquals($expectedurlname, $message->contexturlname);