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
 * Events tests.
19
 *
20
 * @package   core
21
 * @category  test
22
 * @copyright 2014 Mark Nelson <markn@moodle.com>
23
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
 
26
namespace core\event;
27
 
28
defined('MOODLE_INTERNAL') || die();
29
 
30
require_once(__DIR__.'/../fixtures/event_fixtures.php');
31
 
1441 ariadna 32
final class events_test extends \advanced_testcase {
1 efrain 33
 
34
    /**
35
     * Test set up.
36
     *
37
     * This is executed before running any test in this file.
38
     */
39
    public function setUp(): void {
1441 ariadna 40
        parent::setUp();
1 efrain 41
        $this->resetAfterTest();
42
    }
43
 
44
    /**
45
     * Test the course category created event.
46
     */
11 efrain 47
    public function test_course_category_created(): void {
1 efrain 48
        // Trigger and capture the event.
49
        $sink = $this->redirectEvents();
50
        $category = $this->getDataGenerator()->create_category();
51
        $events = $sink->get_events();
52
        $event = reset($events);
53
 
54
        // Check that the event data is valid.
55
        $this->assertInstanceOf('\core\event\course_category_created', $event);
56
        $this->assertEquals(\context_coursecat::instance($category->id), $event->get_context());
57
        $url = new \moodle_url('/course/management.php', array('categoryid' => $event->objectid));
58
        $this->assertEquals($url, $event->get_url());
59
        $this->assertEventContextNotUsed($event);
60
    }
61
 
62
    /**
63
     * Test the course category updated event.
64
     */
11 efrain 65
    public function test_course_category_updated(): void {
1 efrain 66
        // Create a category.
67
        $category = $this->getDataGenerator()->create_category();
68
 
69
        // Create some data we are going to use to update this category.
70
        $data = new \stdClass();
71
        $data->name = 'Category name change';
72
 
73
        // Trigger and capture the event for updating a category.
74
        $sink = $this->redirectEvents();
75
        $category->update($data);
76
        $events = $sink->get_events();
77
        $event = reset($events);
78
 
79
        // Check that the event data is valid.
80
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
81
        $this->assertEquals(\context_coursecat::instance($category->id), $event->get_context());
82
        $url = new \moodle_url('/course/editcategory.php', array('id' => $event->objectid));
83
        $this->assertEquals($url, $event->get_url());
84
 
85
        // Create another category and a child category.
86
        $category2 = $this->getDataGenerator()->create_category();
87
        $childcat = $this->getDataGenerator()->create_category(array('parent' => $category2->id));
88
 
89
        // Trigger and capture the event for changing the parent of a category.
90
        $sink = $this->redirectEvents();
91
        $childcat->change_parent($category);
92
        $events = $sink->get_events();
93
        $event = reset($events);
94
 
95
        // Check that the event data is valid.
96
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
97
        $this->assertEquals(\context_coursecat::instance($childcat->id), $event->get_context());
98
 
99
        // Trigger and capture the event for changing the sortorder of a category.
100
        $sink = $this->redirectEvents();
101
        $category2->change_sortorder_by_one(true);
102
        $events = $sink->get_events();
103
        $event = reset($events);
104
 
105
        // Check that the event data is valid.
106
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
107
        $this->assertEquals(\context_coursecat::instance($category2->id), $event->get_context());
108
 
109
        // Trigger and capture the event for deleting a category and moving it's children to another.
110
        $sink = $this->redirectEvents();
111
        $category->delete_move($category->id);
112
        $events = $sink->get_events();
113
        $event = reset($events);
114
 
115
        // Check that the event data is valid.
116
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
117
        $this->assertEquals(\context_coursecat::instance($childcat->id), $event->get_context());
118
 
119
        // Trigger and capture the event for hiding a category.
120
        $sink = $this->redirectEvents();
121
        $category2->hide();
122
        $events = $sink->get_events();
123
        $event = reset($events);
124
 
125
        // Check that the event data is valid.
126
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
127
        $this->assertEquals(\context_coursecat::instance($category2->id), $event->get_context());
128
 
129
        // Trigger and capture the event for unhiding a category.
130
        $sink = $this->redirectEvents();
131
        $category2->show();
132
        $events = $sink->get_events();
133
        $event = reset($events);
134
 
135
        // Check that the event data is valid.
136
        $this->assertInstanceOf('\core\event\course_category_updated', $event);
137
        $this->assertEquals(\context_coursecat::instance($category2->id), $event->get_context());
138
        $this->assertEventContextNotUsed($event);
139
    }
140
 
141
    /**
142
     * Test the email failed event.
143
     *
144
     * It's not possible to use the moodle API to simulate the failure of sending
145
     * an email, so here we simply create the event and trigger it.
146
     */
11 efrain 147
    public function test_email_failed(): void {
1 efrain 148
        // Trigger event for failing to send email.
149
        $event = \core\event\email_failed::create(array(
150
            'context' => \context_system::instance(),
151
            'userid' => 1,
152
            'relateduserid' => 2,
153
            'other' => array(
154
                'subject' => 'This is a subject',
155
                'message' => 'This is a message',
156
                'errorinfo' => 'The email failed to send!'
157
            )
158
        ));
159
 
160
        // Trigger and capture the event.
161
        $sink = $this->redirectEvents();
162
        $event->trigger();
163
        $events = $sink->get_events();
164
        $event = reset($events);
165
 
166
        $this->assertInstanceOf('\core\event\email_failed', $event);
167
        $this->assertEquals(\context_system::instance(), $event->get_context());
168
        $this->assertEventContextNotUsed($event);
169
    }
170
 
171
    /**
172
     * There is no api involved so the best we can do is test legacy data by triggering event manually.
173
     */
11 efrain 174
    public function test_course_user_report_viewed(): void {
1 efrain 175
 
176
        $user = $this->getDataGenerator()->create_user();
177
        $course = $this->getDataGenerator()->create_course();
178
        $context = \context_course::instance($course->id);
179
 
180
        $eventparams = array();
181
        $eventparams['context'] = $context;
182
        $eventparams['relateduserid'] = $user->id;
183
        $eventparams['other'] = array();
184
        $eventparams['other']['mode'] = 'grade';
185
        $event = \core\event\course_user_report_viewed::create($eventparams);
186
 
187
        // Trigger and capture the event.
188
        $sink = $this->redirectEvents();
189
        $event->trigger();
190
        $events = $sink->get_events();
191
        $event = reset($events);
192
 
193
        $this->assertInstanceOf('\core\event\course_user_report_viewed', $event);
194
        $this->assertEquals(\context_course::instance($course->id), $event->get_context());
195
        $this->assertEventContextNotUsed($event);
196
    }
197
 
198
    /**
199
     * There is no api involved so the best we can do is test legacy data by triggering event manually.
200
     */
11 efrain 201
    public function test_course_viewed(): void {
1 efrain 202
 
203
        $user = $this->getDataGenerator()->create_user();
204
        $course = $this->getDataGenerator()->create_course();
205
        $context = \context_course::instance($course->id);
206
 
207
        // First try with no optional parameters.
208
        $eventparams = array();
209
        $eventparams['context'] = $context;
210
        $event = \core\event\course_viewed::create($eventparams);
211
 
212
        // Trigger and capture the event.
213
        $sink = $this->redirectEvents();
214
        $event->trigger();
215
        $events = $sink->get_events();
216
        $event = reset($events);
217
 
218
        $this->assertInstanceOf('\core\event\course_viewed', $event);
219
        $this->assertEquals(\context_course::instance($course->id), $event->get_context());
220
        $this->assertEventContextNotUsed($event);
221
 
222
        // Now try with optional parameters.
223
        $sectionnumber = 7;
224
        $eventparams = array();
225
        $eventparams['context'] = $context;
226
        $eventparams['other'] = array('coursesectionnumber' => $sectionnumber);
227
        $event = \core\event\course_viewed::create($eventparams);
228
 
229
        // Trigger and capture the event.
230
        $sink = $this->redirectEvents();
231
        $event->trigger();
232
        $loggeddata = $event->get_data();
233
        $events = $sink->get_events();
234
        $event = reset($events);
235
 
236
 
237
        $this->assertInstanceOf('\core\event\course_viewed', $event);
238
        $this->assertEquals(\context_course::instance($course->id), $event->get_context());
239
        $this->assertEventContextNotUsed($event);
240
 
241
        delete_course($course->id, false);
242
        $restored = \core\event\base::restore($loggeddata, array('origin' => 'web', 'ip' => '127.0.0.1'));
243
        $this->assertInstanceOf('\core\event\course_viewed', $restored);
244
        $this->assertNull($restored->get_url());
245
    }
246
 
11 efrain 247
    public function test_recent_capability_viewed(): void {
1 efrain 248
        $this->resetAfterTest();
249
 
250
        $this->setAdminUser();
251
        $course = $this->getDataGenerator()->create_course();
252
        $context = \context_course::instance($course->id);
253
 
254
        $event = \core\event\recent_activity_viewed::create(array('context' => $context));
255
 
256
        // Trigger and capture the event.
257
        $sink = $this->redirectEvents();
258
        $event->trigger();
259
        $events = $sink->get_events();
260
        $event = reset($events);
261
 
262
        $this->assertInstanceOf('\core\event\recent_activity_viewed', $event);
263
        $this->assertEquals($context, $event->get_context());
264
        $this->assertEventContextNotUsed($event);
265
        $url = new \moodle_url('/course/recent.php', array('id' => $course->id));
266
        $this->assertEquals($url, $event->get_url());
267
        $event->get_name();
268
    }
269
 
11 efrain 270
    public function test_user_profile_viewed(): void {
1 efrain 271
        $this->resetAfterTest();
272
        $this->setAdminUser();
273
 
274
        $user = $this->getDataGenerator()->create_user();
275
        $course = $this->getDataGenerator()->create_course();
276
        $coursecontext = \context_course::instance($course->id);
277
 
278
        // User profile viewed in course context.
279
        $eventparams = array(
280
            'objectid' => $user->id,
281
            'relateduserid' => $user->id,
282
            'courseid' => $course->id,
283
            'context' => $coursecontext,
284
            'other' => array(
285
                'courseid' => $course->id,
286
                'courseshortname' => $course->shortname,
287
                'coursefullname' => $course->fullname
288
            )
289
        );
290
        $event = \core\event\user_profile_viewed::create($eventparams);
291
 
292
        // Trigger and capture the event.
293
        $sink = $this->redirectEvents();
294
        $event->trigger();
295
        $events = $sink->get_events();
296
        $event = reset($events);
297
 
298
        $this->assertInstanceOf('\core\event\user_profile_viewed', $event);
299
        $this->assertEventContextNotUsed($event);
300
 
301
        // User profile viewed in user context.
302
        $usercontext = \context_user::instance($user->id);
303
        $eventparams['context'] = $usercontext;
304
        unset($eventparams['courseid'], $eventparams['other']);
305
        $event = \core\event\user_profile_viewed::create($eventparams);
306
 
307
        // Trigger and capture the event.
308
        $sink = $this->redirectEvents();
309
        $event->trigger();
310
        $events = $sink->get_events();
311
        $event = reset($events);
312
 
313
        $this->assertInstanceOf('\core\event\user_profile_viewed', $event);
314
        $this->assertEventContextNotUsed($event);
315
    }
316
 
317
    /**
318
     * There is no API associated with this event, so we will just test standard features.
319
     */
11 efrain 320
    public function test_grade_viewed(): void {
1 efrain 321
        $this->resetAfterTest();
322
        $this->setAdminUser();
323
 
324
        $user = $this->getDataGenerator()->create_user();
325
        $course = $this->getDataGenerator()->create_course();
326
        $coursecontext = \context_course::instance($course->id);
327
 
328
        $event = \core_tests\event\grade_report_viewed::create(
329
            array(
330
                'context' => $coursecontext,
331
                'courseid' => $course->id,
332
                'userid' => $user->id,
333
            )
334
        );
335
 
336
        // Trigger and capture the event.
337
        $sink = $this->redirectEvents();
338
        $event->trigger();
339
        $events = $sink->get_events();
340
        $event = reset($events);
341
 
342
        $this->assertInstanceOf('\core\event\grade_report_viewed', $event);
343
        $this->assertEquals($event->courseid, $course->id);
344
        $this->assertEquals($event->userid, $user->id);
345
        $this->assertEventContextNotUsed($event);
346
    }
347
 
348
    /**
349
     * Test the database text field content replaced event.
350
     */
11 efrain 351
    public function test_database_text_field_content_replaced(): void {
1 efrain 352
        global $CFG;
353
 
354
        require_once($CFG->dirroot . '/lib/adminlib.php');
355
 
356
        // Trigger and capture the event for finding and replacing strings in the database.
357
        $sink = $this->redirectEvents();
358
        ob_start();
359
        db_replace('searchstring', 'replacestring');
360
        ob_end_clean();
361
        $events = $sink->get_events();
362
        $event = reset($events);
363
 
364
        // Check that the event data is valid.
365
        $this->assertInstanceOf('\core\event\database_text_field_content_replaced', $event);
366
        $this->assertEquals(\context_system::instance(), $event->get_context());
367
        $this->assertEquals('searchstring', $event->other['search']);
368
        $this->assertEquals('replacestring', $event->other['replace']);
369
    }
370
}