MDL-55274 mod_chat: Add unit tests for special commands
[moodle.git] / mod / chat / tests / format_message_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/>.
17 /**
18  * Tests for format_message.
19  *
20  * @package    mod_chat
21  * @copyright  2016 Andrew NIcols
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 global $CFG;
28 require_once($CFG->dirroot . '/mod/chat/lib.php');
30 /**
31  * Tests for format_message.
32  *
33  * @package    mod_chat
34  * @copyright  2016 Andrew NIcols
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class mod_chat_format_message_testcase extends advanced_testcase {
39     const USER_CURRENT = 1;
40     const USER_OTHER = 2;
42     public function chat_format_message_manually_provider() {
43         $dateregexp = '\d{2}:\d{2}';
44         return [
45             'Beep everyone' => [
46                 'message'       => 'beep all',
47                 'system'        => false,
48                 'willreturn'    => true,
49                 'expecttext'    => "/^{$dateregexp}: " . get_string('messagebeepseveryone', 'chat', '__CURRENTUSER__') . ': /',
50                 'refreshusers'  => false,
51                 'beep'          => true,
52             ],
53             'Beep the current user' => [
54                 'message'       => 'beep __CURRENTUSER__',
55                 'system'        => false,
56                 'willreturn'    => true,
57                 'expecttext'    => "/^{$dateregexp}: " . get_string('messagebeepsyou', 'chat', '__CURRENTUSER__') . ': /',
58                 'refreshusers'  => false,
59                 'beep'          => true,
60             ],
61             'Beep another user' => [
62                 'message'       => 'beep __OTHERUSER__',
63                 'system'        => false,
64                 'willreturn'    => false,
65                 'expecttext'    => null,
66                 'refreshusers'  => null,
67                 'beep'          => null,
68             ],
69             'Malformed beep' => [
70                 'message'       => 'beep',
71                 'system'        => false,
72                 'willreturn'    => true,
73                 'expecttext'    => "/^{$dateregexp} __CURRENTUSER_FIRST__: beep$/",
74                 'refreshusers'  => false,
75                 'beep'          => false,
76             ],
77             '/me says' => [
78                 'message'       => '/me writes a test',
79                 'system'        => false,
80                 'willreturn'    => true,
81                 'expecttext'    => "/^{$dateregexp}: \*\*\* __CURRENTUSER_FIRST__ writes a test$/",
82                 'refreshusers'  => false,
83                 'beep'          => false,
84             ],
85             'Invalid command' => [
86                 'message'       => '/help',
87                 'system'        => false,
88                 'willreturn'    => true,
89                 'expecttext'    => "/^{$dateregexp} __CURRENTUSER_FIRST__: \/help$/",
90                 'refreshusers'  => false,
91                 'beep'          => false,
92             ],
93             'To user' => [
94                 'message'       => 'To Bernard:I love tests',
95                 'system'        => false,
96                 'willreturn'    => true,
97                 'expecttext'    => "/^{$dateregexp}: __CURRENTUSER_FIRST__ " . get_string('saidto', 'chat') . " Bernard: I love tests$/",
98                 'refreshusers'  => false,
99                 'beep'          => false,
100             ],
101             'To user trimmed' => [
102                 'message'       => 'To Bernard: I love tests',
103                 'system'        => false,
104                 'willreturn'    => true,
105                 'expecttext'    => "/^{$dateregexp}: __CURRENTUSER_FIRST__ " . get_string('saidto', 'chat') . " Bernard: I love tests$/",
106                 'refreshusers'  => false,
107                 'beep'          => false,
108             ],
109             'System: enter' => [
110                 'message'       => 'enter',
111                 'system'        => true,
112                 'willreturn'    => true,
113                 'expecttext'    => "/^{$dateregexp}: " . get_string('messageenter', 'chat', '__CURRENTUSER__') . "$/",
114                 'refreshusers'  => true,
115                 'beep'          => false,
116             ],
117             'System: exit' => [
118                 'message'       => 'exit',
119                 'system'        => true,
120                 'willreturn'    => true,
121                 'expecttext'    => "/^{$dateregexp}: " . get_string('messageexit', 'chat', '__CURRENTUSER__') . "$/",
122                 'refreshusers'  => true,
123                 'beep'          => false,
124             ],
125         ];
126     }
128     /**
129      * @dataProvider chat_format_message_manually_provider
130      */
131     public function test_chat_format_message_manually($messagetext, $system, $willreturn,
132             $expecttext, $refreshusers, $expectbeep) {
134         $this->resetAfterTest();
136         $course = $this->getDataGenerator()->create_course();
137         $currentuser = $this->getDataGenerator()->create_user();
138         $this->setUser($currentuser);
139         $otheruser = $this->getDataGenerator()->create_user();
141         // Replace the message texts.
142         // These can't be done in the provider because it runs before the
143         // test starts.
144         $messagetext = str_replace('__CURRENTUSER__', $currentuser->id, $messagetext);
145         $messagetext = str_replace('__OTHERUSER__', $otheruser->id, $messagetext);
147         $message = (object) [
148             'message'   => $messagetext,
149             'timestamp' => time(),
150             'system'    => $system,
151         ];
153         $result = chat_format_message_manually($message, $course->id, $currentuser, $currentuser);
155         if (!$willreturn) {
156             $this->assertFalse($result);
157         } else {
158             $this->assertNotFalse($result);
159             if (!empty($expecttext)) {
160                 $expecttext = str_replace('__CURRENTUSER__', fullname($currentuser), $expecttext);
161                 $expecttext = str_replace('__CURRENTUSER_FIRST__', $currentuser->firstname, $expecttext);
162                 $this->assertRegexp($expecttext, $result->text);
163             }
165             $this->assertEquals($refreshusers, $result->refreshusers);
166             $this->assertEquals($expectbeep, $result->beep);
167         }
168     }