Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
/**
18
 * Tests for feedback events.
19
 *
20
 * @package    mod_feedback
21
 * @copyright  2013 Ankit Agarwal
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
23
 */
24
 
25
namespace mod_feedback\event;
26
 
27
/**
28
 * Class mod_feedback_events_testcase
29
 *
30
 * Class for tests related to feedback events.
31
 *
32
 * @package    mod_feedback
33
 * @copyright  2013 Ankit Agarwal
34
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
35
 */
1441 ariadna 36
final class events_test extends \advanced_testcase {
1 efrain 37
 
38
    /** @var  stdClass A user who likes to interact with feedback activity. */
39
    private $eventuser;
40
 
41
    /** @var  stdClass A course used to hold feedback activities for testing. */
42
    private $eventcourse;
43
 
44
    /** @var  stdClass A feedback activity used for feedback event testing. */
45
    private $eventfeedback;
46
 
47
    /** @var  stdClass course module object . */
48
    private $eventcm;
49
 
50
    /** @var  stdClass A feedback item. */
51
    private $eventfeedbackitem;
52
 
53
    /** @var  stdClass A feedback activity response submitted by user. */
54
    private $eventfeedbackcompleted;
55
 
56
    /** @var  stdClass value associated with $eventfeedbackitem . */
57
    private $eventfeedbackvalue;
58
 
59
    public function setUp(): void {
60
        global $DB;
1441 ariadna 61
        parent::setUp();
1 efrain 62
 
63
        $this->setAdminUser();
64
        $gen = $this->getDataGenerator();
65
        $this->eventuser = $gen->create_user(); // Create a user.
66
        $course = $gen->create_course(); // Create a course.
67
        // Assign manager role, so user can see reports.
68
        role_assign(1, $this->eventuser->id, \context_course::instance($course->id));
69
 
70
        // Add a feedback activity to the created course.
71
        $record = new \stdClass();
72
        $record->course = $course->id;
73
        $feedback = $gen->create_module('feedback', $record);
74
        $this->eventfeedback = $DB->get_record('feedback', array('id' => $feedback->id), '*', MUST_EXIST); // Get exact copy.
75
        $this->eventcm = get_coursemodule_from_instance('feedback', $this->eventfeedback->id, false, MUST_EXIST);
76
 
77
        // Create a feedback item.
78
        $item = new \stdClass();
79
        $item->feedback = $this->eventfeedback->id;
80
        $item->type = 'numeric';
81
        $item->presentation = '0|0';
82
        $itemid = $DB->insert_record('feedback_item', $item);
83
        $this->eventfeedbackitem = $DB->get_record('feedback_item', array('id' => $itemid), '*', MUST_EXIST);
84
 
85
        // Create a response from a user.
86
        $response = new \stdClass();
87
        $response->feedback = $this->eventfeedback->id;
88
        $response->userid = $this->eventuser->id;
89
        $response->anonymous_response = FEEDBACK_ANONYMOUS_YES;
90
        $completedid = $DB->insert_record('feedback_completed', $response);
91
        $this->eventfeedbackcompleted = $DB->get_record('feedback_completed', array('id' => $completedid), '*', MUST_EXIST);
92
 
93
        $value = new \stdClass();
94
        $value->course_id = $course->id;
95
        $value->item = $this->eventfeedbackitem->id;
96
        $value->completed = $this->eventfeedbackcompleted->id;
97
        $value->value = 25; // User response value.
98
        $valueid = $DB->insert_record('feedback_value', $value);
99
        $this->eventfeedbackvalue = $DB->get_record('feedback_value', array('id' => $valueid), '*', MUST_EXIST);
100
        // Do this in the end to get correct sortorder and cacherev values.
101
        $this->eventcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
102
 
103
    }
104
 
105
    /**
106
     * Tests for event response_deleted.
107
     */
11 efrain 108
    public function test_response_deleted_event(): void {
1 efrain 109
        global $USER, $DB;
110
        $this->resetAfterTest();
111
 
112
        // Create and delete a module.
113
        $sink = $this->redirectEvents();
114
        feedback_delete_completed($this->eventfeedbackcompleted->id);
115
        $events = $sink->get_events();
116
        $event = array_pop($events); // Delete feedback event.
117
        $sink->close();
118
 
119
        // Validate event data.
120
        $this->assertInstanceOf('\mod_feedback\event\response_deleted', $event);
121
        $this->assertEquals($this->eventfeedbackcompleted->id, $event->objectid);
122
        $this->assertEquals($USER->id, $event->userid);
123
        $this->assertEquals($this->eventuser->id, $event->relateduserid);
124
        $this->assertEquals('feedback_completed', $event->objecttable);
125
        $this->assertEquals(null, $event->get_url());
126
        $this->assertEquals($this->eventfeedbackcompleted, $event->get_record_snapshot('feedback_completed', $event->objectid));
127
        $this->assertEquals($this->eventcourse, $event->get_record_snapshot('course', $event->courseid));
128
        $this->assertEquals($this->eventfeedback, $event->get_record_snapshot('feedback', $event->other['instanceid']));
129
 
130
        // Test can_view() .
131
        $this->setUser($this->eventuser);
132
        $this->assertFalse($event->can_view());
133
        $this->assertDebuggingCalled();
134
        $this->setAdminUser();
135
        $this->assertTrue($event->can_view());
136
        $this->assertDebuggingCalled();
137
 
138
        // Create a response, with anonymous set to no and test can_view().
139
        $response = new \stdClass();
140
        $response->feedback = $this->eventcm->instance;
141
        $response->userid = $this->eventuser->id;
142
        $response->anonymous_response = FEEDBACK_ANONYMOUS_NO;
143
        $completedid = $DB->insert_record('feedback_completed', $response);
144
        $DB->get_record('feedback_completed', array('id' => $completedid), '*', MUST_EXIST);
145
        $value = new \stdClass();
146
        $value->course_id = $this->eventcourse->id;
147
        $value->item = $this->eventfeedbackitem->id;
148
        $value->completed = $completedid;
149
        $value->value = 25; // User response value.
150
        $DB->insert_record('feedback_valuetmp', $value);
151
 
152
        // Save the feedback.
153
        $sink = $this->redirectEvents();
154
        feedback_delete_completed($completedid);
155
        $events = $sink->get_events();
156
        $event = array_pop($events); // Response submitted feedback event.
157
        $sink->close();
158
 
159
        // Test can_view() .
160
        $this->setUser($this->eventuser);
161
        $this->assertTrue($event->can_view());
162
        $this->assertDebuggingCalled();
163
        $this->setAdminUser();
164
        $this->assertTrue($event->can_view());
165
        $this->assertDebuggingCalled();
166
        $this->assertEventContextNotUsed($event);
167
    }
168
 
169
    /**
170
     * Tests for event validations related to feedback response deletion.
171
     */
11 efrain 172
    public function test_response_deleted_event_exceptions(): void {
1 efrain 173
 
174
        $this->resetAfterTest();
175
 
176
        $context = \context_module::instance($this->eventcm->id);
177
 
178
        // Test not setting other['anonymous'].
179
        try {
180
            \mod_feedback\event\response_submitted::create(array(
181
                'context'  => $context,
182
                'objectid' => $this->eventfeedbackcompleted->id,
183
                'relateduserid' => 2,
184
            ));
185
            $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without
186
                    other['anonymous']");
187
        } catch (\coding_exception $e) {
188
            $this->assertStringContainsString("The 'anonymous' value must be set in other.", $e->getMessage());
189
        }
190
    }
191
 
192
    /**
193
     * Tests for event response_submitted.
194
     */
11 efrain 195
    public function test_response_submitted_event(): void {
1 efrain 196
        global $USER, $DB;
197
        $this->resetAfterTest();
198
        $this->setUser($this->eventuser);
199
 
200
        // Create a temporary response, with anonymous set to yes.
201
        $response = new \stdClass();
202
        $response->feedback = $this->eventcm->instance;
203
        $response->userid = $this->eventuser->id;
204
        $response->anonymous_response = FEEDBACK_ANONYMOUS_YES;
205
        $completedid = $DB->insert_record('feedback_completedtmp', $response);
206
        $completed = $DB->get_record('feedback_completedtmp', array('id' => $completedid), '*', MUST_EXIST);
207
        $value = new \stdClass();
208
        $value->course_id = $this->eventcourse->id;
209
        $value->item = $this->eventfeedbackitem->id;
210
        $value->completed = $completedid;
211
        $value->value = 25; // User response value.
212
        $DB->insert_record('feedback_valuetmp', $value);
213
 
214
        // Save the feedback.
215
        $sink = $this->redirectEvents();
216
        $id = feedback_save_tmp_values($completed);
217
        $events = $sink->get_events();
218
        $event = array_pop($events); // Response submitted feedback event.
219
        $sink->close();
220
 
221
        // Validate event data. Feedback is anonymous.
222
        $this->assertInstanceOf('\mod_feedback\event\response_submitted', $event);
223
        $this->assertEquals($id, $event->objectid);
224
        $this->assertEquals($USER->id, $event->userid);
225
        $this->assertEquals($USER->id, $event->relateduserid);
226
        $this->assertEquals('feedback_completed', $event->objecttable);
227
        $this->assertEquals(1, $event->anonymous);
228
        $this->assertEquals(FEEDBACK_ANONYMOUS_YES, $event->other['anonymous']);
229
        $this->setUser($this->eventuser);
230
        $this->assertFalse($event->can_view());
231
        $this->assertDebuggingCalled();
232
        $this->setAdminUser();
233
        $this->assertTrue($event->can_view());
234
        $this->assertDebuggingCalled();
235
 
236
        // Create a temporary response, with anonymous set to no.
237
        $response = new \stdClass();
238
        $response->feedback = $this->eventcm->instance;
239
        $response->userid = $this->eventuser->id;
240
        $response->anonymous_response = FEEDBACK_ANONYMOUS_NO;
241
        $completedid = $DB->insert_record('feedback_completedtmp', $response);
242
        $completed = $DB->get_record('feedback_completedtmp', array('id' => $completedid), '*', MUST_EXIST);
243
        $value = new \stdClass();
244
        $value->course_id = $this->eventcourse->id;
245
        $value->item = $this->eventfeedbackitem->id;
246
        $value->completed = $completedid;
247
        $value->value = 25; // User response value.
248
        $DB->insert_record('feedback_valuetmp', $value);
249
 
250
        // Save the feedback.
251
        $sink = $this->redirectEvents();
252
        feedback_save_tmp_values($completed);
253
        $events = $sink->get_events();
254
        $event = array_pop($events); // Response submitted feedback event.
255
        $sink->close();
256
 
257
        // Test can_view().
258
        $this->assertTrue($event->can_view());
259
        $this->assertDebuggingCalled();
260
        $this->setAdminUser();
261
        $this->assertTrue($event->can_view());
262
        $this->assertDebuggingCalled();
263
        $this->assertEventContextNotUsed($event);
264
    }
265
 
266
    /**
267
     * Tests for event validations related to feedback response submission.
268
     */
11 efrain 269
    public function test_response_submitted_event_exceptions(): void {
1 efrain 270
 
271
        $this->resetAfterTest();
272
 
273
        $context = \context_module::instance($this->eventcm->id);
274
 
275
        // Test not setting instanceid.
276
        try {
277
            \mod_feedback\event\response_submitted::create(array(
278
                'context'  => $context,
279
                'objectid' => $this->eventfeedbackcompleted->id,
280
                'relateduserid' => 2,
281
                'anonymous' => 0,
282
                'other'    => array('cmid' => $this->eventcm->id, 'anonymous' => 2)
283
            ));
284
            $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without
285
                    other['instanceid']");
286
        } catch (\coding_exception $e) {
287
            $this->assertStringContainsString("The 'instanceid' value must be set in other.", $e->getMessage());
288
        }
289
 
290
        // Test not setting cmid.
291
        try {
292
            \mod_feedback\event\response_submitted::create(array(
293
                'context'  => $context,
294
                'objectid' => $this->eventfeedbackcompleted->id,
295
                'relateduserid' => 2,
296
                'anonymous' => 0,
297
                'other'    => array('instanceid' => $this->eventfeedback->id, 'anonymous' => 2)
298
            ));
299
            $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without
300
                    other['cmid']");
301
        } catch (\coding_exception $e) {
302
            $this->assertStringContainsString("The 'cmid' value must be set in other.", $e->getMessage());
303
        }
304
 
305
        // Test not setting anonymous.
306
        try {
307
            \mod_feedback\event\response_submitted::create(array(
308
                 'context'  => $context,
309
                 'objectid' => $this->eventfeedbackcompleted->id,
310
                 'relateduserid' => 2,
311
                 'other'    => array('cmid' => $this->eventcm->id, 'instanceid' => $this->eventfeedback->id)
312
            ));
313
            $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without
314
                    other['anonymous']");
315
        } catch (\coding_exception $e) {
316
            $this->assertStringContainsString("The 'anonymous' value must be set in other.", $e->getMessage());
317
        }
318
    }
319
 
320
    /**
321
     * Test that event observer is executed on course deletion and the templates are removed.
322
     */
11 efrain 323
    public function test_delete_course(): void {
1 efrain 324
        global $DB;
325
        $this->resetAfterTest();
326
        feedback_save_as_template($this->eventfeedback, 'my template', 0);
327
        $courseid = $this->eventcourse->id;
328
        $this->assertNotEmpty($DB->get_records('feedback_template', array('course' => $courseid)));
329
        delete_course($this->eventcourse, false);
330
        $this->assertEmpty($DB->get_records('feedback_template', array('course' => $courseid)));
331
    }
332
}