source: moodle/trunk/fuentes/blog/tests/lib_test.php @ 1331

Last change on this file since 1331 was 1331, checked in by jrpelegrina, 3 years ago

Updated to moodle 3.0.3

File size: 21.7 KB
Line 
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 * Unit tests for blog
19 *
20 * @package    core_blog
21 * @category   phpunit
22 * @copyright  2009 Nicolas Connault
23 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24 */
25
26global $CFG;
27require_once($CFG->dirroot . '/blog/locallib.php');
28require_once($CFG->dirroot . '/blog/lib.php');
29
30/**
31 * Test functions that rely on the DB tables
32 */
33class core_blog_lib_testcase extends advanced_testcase {
34
35    private $courseid;
36    private $cmid;
37    private $groupid;
38    private $userid;
39    private $tagid;
40    private $postid;
41
42    protected function setUp() {
43        global $DB;
44        parent::setUp();
45
46        $this->resetAfterTest();
47
48        // Create default course.
49        $course = $this->getDataGenerator()->create_course(array('category'=>1, 'shortname'=>'ANON'));
50        $this->assertNotEmpty($course);
51        $page = $this->getDataGenerator()->create_module('page', array('course'=>$course->id));
52        $this->assertNotEmpty($page);
53
54        // Create default group.
55        $group = new stdClass();
56        $group->courseid = $course->id;
57        $group->name = 'ANON';
58        $group->id = $DB->insert_record('groups', $group);
59
60        // Create default user.
61        $user = $this->getDataGenerator()->create_user(array('username'=>'testuser', 'firstname'=>'Jimmy', 'lastname'=>'Kinnon'));
62
63        // Create default tag.
64        $tag = new stdClass();
65        $tag->userid = $user->id;
66        $tag->name = 'testtagname';
67        $tag->rawname = 'Testtagname';
68        $tag->tagtype = 'official';
69        $tag->id = $DB->insert_record('tag', $tag);
70
71        // Create default post.
72        $post = new stdClass();
73        $post->userid = $user->id;
74        $post->groupid = $group->id;
75        $post->content = 'test post content text';
76        $post->id = $DB->insert_record('post', $post);
77
78        // Grab important ids.
79        $this->courseid = $course->id;
80        $this->cmid = $page->cmid;
81        $this->groupid  = $group->id;
82        $this->userid  = $user->id;
83        $this->tagid  = $tag->id;
84        $this->postid = $post->id;
85    }
86
87
88    public function test_overrides() {
89        global $SITE;
90
91        // Try all the filters at once: Only the entry filter is active.
92        $filters = array('site' => $SITE->id, 'course' => $this->courseid, 'module' => $this->cmid,
93            'group' => $this->groupid, 'user' => $this->userid, 'tag' => $this->tagid, 'entry' => $this->postid);
94        $blog_listing = new blog_listing($filters);
95        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
96        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
97        $this->assertFalse(array_key_exists('module', $blog_listing->filters));
98        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
99        $this->assertFalse(array_key_exists('user', $blog_listing->filters));
100        $this->assertFalse(array_key_exists('tag', $blog_listing->filters));
101        $this->assertTrue(array_key_exists('entry', $blog_listing->filters));
102
103        // Again, but without the entry filter: This time, the tag, user and module filters are active.
104        $filters = array('site' => $SITE->id, 'course' => $this->courseid, 'module' => $this->cmid,
105            'group' => $this->groupid, 'user' => $this->userid, 'tag' => $this->postid);
106        $blog_listing = new blog_listing($filters);
107        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
108        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
109        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
110        $this->assertTrue(array_key_exists('module', $blog_listing->filters));
111        $this->assertTrue(array_key_exists('user', $blog_listing->filters));
112        $this->assertTrue(array_key_exists('tag', $blog_listing->filters));
113
114        // We should get the same result by removing the 3 inactive filters: site, course and group.
115        $filters = array('module' => $this->cmid, 'user' => $this->userid, 'tag' => $this->tagid);
116        $blog_listing = new blog_listing($filters);
117        $this->assertFalse(array_key_exists('site', $blog_listing->filters));
118        $this->assertFalse(array_key_exists('course', $blog_listing->filters));
119        $this->assertFalse(array_key_exists('group', $blog_listing->filters));
120        $this->assertTrue(array_key_exists('module', $blog_listing->filters));
121        $this->assertTrue(array_key_exists('user', $blog_listing->filters));
122        $this->assertTrue(array_key_exists('tag', $blog_listing->filters));
123
124    }
125
126    // The following series of 'test_blog..' functions correspond to the blog_get_headers() function within blog/lib.php.
127    // Some cases are omitted due to the optional_param variables used.
128
129    public function test_blog_get_headers_case_1() {
130        global $CFG, $PAGE, $OUTPUT;
131        $blogheaders = blog_get_headers();
132        $this->assertEquals($blogheaders['heading'], get_string('siteblogheading', 'blog'));
133    }
134
135    public function test_blog_get_headers_case_6() {
136        global $CFG, $PAGE, $OUTPUT;
137        $blogheaders = blog_get_headers($this->courseid, null, $this->userid);
138        $this->assertNotEquals($blogheaders['heading'], '');
139    }
140
141    public function test_blog_get_headers_case_7() {
142        global $CFG, $PAGE, $OUTPUT;
143        $blogheaders = blog_get_headers(null, $this->groupid);
144        $this->assertNotEquals($blogheaders['heading'], '');
145    }
146
147    public function test_blog_get_headers_case_10() {
148        global $CFG, $PAGE, $OUTPUT;
149        $blogheaders = blog_get_headers($this->courseid);
150        $this->assertNotEquals($blogheaders['heading'], '');
151    }
152
153    /**
154     * Test various blog related events.
155     */
156    public function test_blog_entry_created_event() {
157        global $USER;
158
159        $this->setAdminUser();
160        $this->resetAfterTest();
161
162        // Create a blog entry for another user as Admin.
163        $sink = $this->redirectEvents();
164        $blog = new blog_entry();
165        $blog->subject = "Subject of blog";
166        $blog->userid = $this->userid;
167        $states = blog_entry::get_applicable_publish_states();
168        $blog->publishstate = reset($states);
169        $blog->add();
170        $events = $sink->get_events();
171        $sink->close();
172        $event = reset($events);
173        $sitecontext = context_system::instance();
174
175        // Validate event data.
176        $this->assertInstanceOf('\core\event\blog_entry_created', $event);
177        $url = new moodle_url('/blog/index.php', array('entryid' => $event->objectid));
178        $this->assertEquals($url, $event->get_url());
179        $this->assertEquals($sitecontext->id, $event->contextid);
180        $this->assertEquals($blog->id, $event->objectid);
181        $this->assertEquals($USER->id, $event->userid);
182        $this->assertEquals($this->userid, $event->relateduserid);
183        $this->assertEquals("post", $event->objecttable);
184        $arr = array(SITEID, 'blog', 'add', 'index.php?userid=' . $this->userid . '&entryid=' . $blog->id, $blog->subject);
185        $this->assertEventLegacyLogData($arr, $event);
186        $this->assertEquals("blog_entry_added", $event->get_legacy_eventname());
187        $this->assertEventLegacyData($blog, $event);
188        $this->assertEventContextNotUsed($event);
189    }
190
191    /**
192     * Tests for event blog_entry_updated.
193     */
194    public function test_blog_entry_updated_event() {
195        global $USER;
196
197        $this->setAdminUser();
198        $this->resetAfterTest();
199        $sitecontext = context_system::instance();
200
201        // Edit a blog entry as Admin.
202        $blog = new blog_entry($this->postid);
203        $sink = $this->redirectEvents();
204        $blog->summary_editor = array('text' => 'Something', 'format' => FORMAT_MOODLE);
205        $blog->edit(array(), null, array(), array());
206        $events = $sink->get_events();
207        $event = array_pop($events);
208        $sink->close();
209
210        // Validate event data.
211        $this->assertInstanceOf('\core\event\blog_entry_updated', $event);
212        $url = new moodle_url('/blog/index.php', array('entryid' => $event->objectid));
213        $this->assertEquals($url, $event->get_url());
214        $this->assertEquals($sitecontext->id, $event->contextid);
215        $this->assertEquals($blog->id, $event->objectid);
216        $this->assertEquals($USER->id, $event->userid);
217        $this->assertEquals($this->userid, $event->relateduserid);
218        $this->assertEquals("post", $event->objecttable);
219        $this->assertEquals("blog_entry_edited", $event->get_legacy_eventname());
220        $this->assertEventLegacyData($blog, $event);
221        $arr = array (SITEID, 'blog', 'update', 'index.php?userid=' . $this->userid . '&entryid=' . $blog->id, $blog->subject);
222        $this->assertEventLegacyLogData($arr, $event);
223        $this->assertEventContextNotUsed($event);
224    }
225
226    /**
227     * Tests for event blog_entry_deleted.
228     */
229    public function test_blog_entry_deleted_event() {
230        global $USER, $DB;
231
232        $this->setAdminUser();
233        $this->resetAfterTest();
234        $sitecontext = context_system::instance();
235
236        // Delete a user blog entry as Admin.
237        $blog = new blog_entry($this->postid);
238        $sink = $this->redirectEvents();
239        $record = $DB->get_record('post', array('id' => $blog->id));
240        $blog->delete();
241        $events = $sink->get_events();
242        $event = array_pop($events);
243        $sink->close();
244
245        // Validate event data.
246        $this->assertInstanceOf('\core\event\blog_entry_deleted', $event);
247        $this->assertEquals(null, $event->get_url());
248        $this->assertEquals($sitecontext->id, $event->contextid);
249        $this->assertEquals($blog->id, $event->objectid);
250        $this->assertEquals($USER->id, $event->userid);
251        $this->assertEquals($this->userid, $event->relateduserid);
252        $this->assertEquals("post", $event->objecttable);
253        $this->assertEquals($record, $event->get_record_snapshot("post", $blog->id));
254        $this->assertSame('blog_entry_deleted', $event->get_legacy_eventname());
255        $arr = array(SITEID, 'blog', 'delete', 'index.php?userid=' . $blog->userid, 'deleted blog entry with entry id# ' .
256                $blog->id);
257        $this->assertEventLegacyLogData($arr, $event);
258        $this->assertEventLegacyData($blog, $event);
259        $this->assertEventContextNotUsed($event);
260    }
261
262
263    /**
264     * Tests for event blog_association_created.
265     */
266    public function test_blog_association_created_event() {
267        global $USER;
268
269        $this->setAdminUser();
270        $this->resetAfterTest();
271        $sitecontext = context_system::instance();
272        $coursecontext = context_course::instance($this->courseid);
273        $contextmodule = context_module::instance($this->cmid);
274
275        // Add blog associations with a course.
276        $blog = new blog_entry($this->postid);
277        $sink = $this->redirectEvents();
278        $blog->add_association($coursecontext->id);
279        $events = $sink->get_events();
280        $event = reset($events);
281        $sink->close();
282
283        // Validate event data.
284        $this->assertInstanceOf('\core\event\blog_association_created', $event);
285        $this->assertEquals($sitecontext->id, $event->contextid);
286        $url = new moodle_url('/blog/index.php', array('entryid' => $event->other['blogid']));
287        $this->assertEquals($url, $event->get_url());
288        $this->assertEquals($blog->id, $event->other['blogid']);
289        $this->assertEquals($this->courseid, $event->other['associateid']);
290        $this->assertEquals('course', $event->other['associatetype']);
291        $this->assertEquals($blog->subject, $event->other['subject']);
292        $this->assertEquals($USER->id, $event->userid);
293        $this->assertEquals($this->userid, $event->relateduserid);
294        $this->assertEquals('blog_association', $event->objecttable);
295        $arr = array(SITEID, 'blog', 'add association', 'index.php?userid=' . $this->userid . '&entryid=' . $blog->id,
296                     $blog->subject, 0, $this->userid);
297        $this->assertEventLegacyLogData($arr, $event);
298
299        // Add blog associations with a module.
300        $blog = new blog_entry($this->postid);
301        $sink = $this->redirectEvents();
302        $blog->add_association($contextmodule->id);
303        $events = $sink->get_events();
304        $event = reset($events);
305        $sink->close();
306
307        // Validate event data.
308        $this->assertEquals($blog->id, $event->other['blogid']);
309        $this->assertEquals($this->cmid, $event->other['associateid']);
310        $this->assertEquals('coursemodule', $event->other['associatetype']);
311        $arr = array(SITEID, 'blog', 'add association', 'index.php?userid=' . $this->userid . '&entryid=' . $blog->id,
312                     $blog->subject, $this->cmid, $this->userid);
313        $this->assertEventLegacyLogData($arr, $event);
314        $this->assertEventContextNotUsed($event);
315    }
316
317    /**
318     * Tests for event blog_association_created validations.
319     */
320    public function test_blog_association_created_event_validations() {
321
322        $this->resetAfterTest();
323
324         // Make sure associatetype validations work.
325        try {
326            \core\event\blog_association_created::create(array(
327                'contextid' => 1,
328                'objectid' => 3,
329                'relateduserid' => 2,
330                'other' => array('associateid' => 2 , 'blogid' => 3, 'subject' => 'blog subject')));
331        } catch (coding_exception $e) {
332            $this->assertContains('The \'associatetype\' value must be set in other and be a valid type.', $e->getMessage());
333        }
334        try {
335            \core\event\blog_association_created::create(array(
336                'contextid' => 1,
337                'objectid' => 3,
338                'relateduserid' => 2,
339                'other' => array('associateid' => 2 , 'blogid' => 3, 'associatetype' => 'random', 'subject' => 'blog subject')));
340        } catch (coding_exception $e) {
341            $this->assertContains('The \'associatetype\' value must be set in other and be a valid type.', $e->getMessage());
342        }
343        // Make sure associateid validations work.
344        try {
345            \core\event\blog_association_created::create(array(
346                'contextid' => 1,
347                'objectid' => 3,
348                'relateduserid' => 2,
349                'other' => array('blogid' => 3, 'associatetype' => 'course', 'subject' => 'blog subject')));
350        } catch (coding_exception $e) {
351            $this->assertContains('The \'associateid\' value must be set in other.', $e->getMessage());
352        }
353        // Make sure blogid validations work.
354        try {
355            \core\event\blog_association_created::create(array(
356                'contextid' => 1,
357                'objectid' => 3,
358                'relateduserid' => 2,
359                'other' => array('associateid' => 3, 'associatetype' => 'course', 'subject' => 'blog subject')));
360        } catch (coding_exception $e) {
361            $this->assertContains('The \'blogid\' value must be set in other.', $e->getMessage());
362        }
363        // Make sure blogid validations work.
364        try {
365            \core\event\blog_association_created::create(array(
366                'contextid' => 1,
367                'objectid' => 3,
368                'relateduserid' => 2,
369                'other' => array('blogid' => 3, 'associateid' => 3, 'associatetype' => 'course')));
370        } catch (coding_exception $e) {
371            $this->assertContains('The \'subject\' value must be set in other.', $e->getMessage());
372        }
373    }
374
375    /**
376     * Tests for event blog_entries_viewed.
377     */
378    public function test_blog_entries_viewed_event() {
379
380        $this->setAdminUser();
381
382        $other = array('entryid' => $this->postid, 'tagid' => $this->tagid, 'userid' => $this->userid, 'modid' => $this->cmid,
383                       'groupid' => $this->groupid, 'courseid' => $this->courseid, 'search' => 'search', 'fromstart' => 2);
384
385        // Trigger event.
386        $sink = $this->redirectEvents();
387        $eventparams = array('other' => $other);
388        $eventinst = \core\event\blog_entries_viewed::create($eventparams);
389        $eventinst->trigger();
390        $events = $sink->get_events();
391        $event = reset($events);
392        $sink->close();
393
394        // Validate event data.
395        $url = new moodle_url('/blog/index.php', $other);
396        $url2 = new moodle_url('index.php', $other);
397        $this->assertEquals($url, $event->get_url());
398        $arr = array(SITEID, 'blog', 'view', $url2->out(), 'view blog entry');
399        $this->assertEventLegacyLogData($arr, $event);
400        $this->assertEventContextNotUsed($event);
401    }
402
403    /**
404     * Test comment_created event.
405     */
406    public function test_blog_comment_created_event() {
407        global $USER, $CFG;
408
409        $this->setAdminUser();
410
411        require_once($CFG->dirroot . '/comment/lib.php');
412        $context = context_user::instance($USER->id);
413
414        $cmt = new stdClass();
415        $cmt->context = $context;
416        $cmt->courseid = $this->courseid;
417        $cmt->area = 'format_blog';
418        $cmt->itemid = $this->postid;
419        $cmt->showcount = 1;
420        $cmt->component = 'blog';
421        $manager = new comment($cmt);
422
423        // Triggering and capturing the event.
424        $sink = $this->redirectEvents();
425        $manager->add("New comment");
426        $events = $sink->get_events();
427        $this->assertCount(1, $events);
428        $event = reset($events);
429
430        // Checking that the event contains the expected values.
431        $this->assertInstanceOf('\core\event\blog_comment_created', $event);
432        $this->assertEquals($context, $event->get_context());
433        $this->assertEquals($this->postid, $event->other['itemid']);
434        $url = new moodle_url('/blog/index.php', array('entryid' => $this->postid));
435        $this->assertEquals($url, $event->get_url());
436        $this->assertEventContextNotUsed($event);
437    }
438
439    /**
440     * Test comment_deleted event.
441     */
442    public function test_blog_comment_deleted_event() {
443        global $USER, $CFG;
444
445        $this->setAdminUser();
446
447        require_once($CFG->dirroot . '/comment/lib.php');
448        $context = context_user::instance($USER->id);
449
450        $cmt = new stdClass();
451        $cmt->context = $context;
452        $cmt->courseid = $this->courseid;
453        $cmt->area = 'format_blog';
454        $cmt->itemid = $this->postid;
455        $cmt->showcount = 1;
456        $cmt->component = 'blog';
457        $manager = new comment($cmt);
458        $newcomment = $manager->add("New comment");
459
460        // Triggering and capturing the event.
461        $sink = $this->redirectEvents();
462        $manager->delete($newcomment->id);
463        $events = $sink->get_events();
464        $this->assertCount(1, $events);
465        $event = reset($events);
466
467        // Checking that the event contains the expected values.
468        $this->assertInstanceOf('\core\event\blog_comment_deleted', $event);
469        $this->assertEquals($context, $event->get_context());
470        $this->assertEquals($this->postid, $event->other['itemid']);
471        $url = new moodle_url('/blog/index.php', array('entryid' => $this->postid));
472        $this->assertEquals($url, $event->get_url());
473        $this->assertEventContextNotUsed($event);
474    }
475
476    /**
477     * Tests the core_blog_myprofile_navigation() function.
478     */
479    public function test_core_blog_myprofile_navigation() {
480        global $USER;
481
482        // Set up the test.
483        $tree = new \core_user\output\myprofile\tree();
484        $this->setAdminUser();
485        $iscurrentuser = true;
486        $course = null;
487
488        // Enable blogs.
489        set_config('enableblogs', true);
490
491        // Check the node tree is correct.
492        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
493        $reflector = new ReflectionObject($tree);
494        $nodes = $reflector->getProperty('nodes');
495        $nodes->setAccessible(true);
496        $this->assertArrayHasKey('blogs', $nodes->getValue($tree));
497    }
498
499    /**
500     * Tests the core_blog_myprofile_navigation() function as a guest.
501     */
502    public function test_core_blog_myprofile_navigation_as_guest() {
503        global $USER;
504
505        // Set up the test.
506        $tree = new \core_user\output\myprofile\tree();
507        $iscurrentuser = false;
508        $course = null;
509
510        // Set user as guest.
511        $this->setGuestUser();
512
513        // Check the node tree is correct.
514        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
515        $reflector = new ReflectionObject($tree);
516        $nodes = $reflector->getProperty('nodes');
517        $nodes->setAccessible(true);
518        $this->assertArrayNotHasKey('blogs', $nodes->getValue($tree));
519    }
520
521    /**
522     * Tests the core_blog_myprofile_navigation() function when blogs are disabled.
523     */
524    public function test_core_blog_myprofile_navigation_blogs_disabled() {
525        global $USER;
526
527        // Set up the test.
528        $tree = new \core_user\output\myprofile\tree();
529        $this->setAdminUser();
530        $iscurrentuser = false;
531        $course = null;
532
533        // Disable blogs.
534        set_config('enableblogs', false);
535
536        // Check the node tree is correct.
537        core_blog_myprofile_navigation($tree, $USER, $iscurrentuser, $course);
538        $reflector = new ReflectionObject($tree);
539        $nodes = $reflector->getProperty('nodes');
540        $nodes->setAccessible(true);
541        $this->assertArrayNotHasKey('blogs', $nodes->getValue($tree));
542    }
543}
544
Note: See TracBrowser for help on using the repository browser.