MDL-60570 calendar: Correct course filter label in day view
[moodle.git] / admin / tool / mobile / tests / externallib_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  * Moodle Mobile admin tool external functions tests.
19  *
20  * @package    tool_mobile
21  * @category   external
22  * @copyright  2016 Juan Leyva
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  * @since      Moodle 3.1
25  */
27 defined('MOODLE_INTERNAL') || die();
29 global $CFG;
31 require_once($CFG->dirroot . '/webservice/tests/helpers.php');
33 use tool_mobile\external;
34 use tool_mobile\api;
36 /**
37  * Moodle Mobile admin tool external functions tests.
38  *
39  * @package     tool_mobile
40  * @copyright   2016 Juan Leyva
41  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42  * @since       Moodle 3.1
43  */
44 class tool_mobile_external_testcase extends externallib_advanced_testcase {
46     /**
47      * Test get_plugins_supporting_mobile.
48      * This is a very basic test because currently there aren't plugins supporting Mobile in core.
49      */
50     public function test_get_plugins_supporting_mobile() {
51         $result = external::get_plugins_supporting_mobile();
52         $result = external_api::clean_returnvalue(external::get_plugins_supporting_mobile_returns(), $result);
53         $this->assertCount(0, $result['warnings']);
54         $this->assertArrayHasKey('plugins', $result);
55         $this->assertTrue(is_array($result['plugins']));
56     }
58     public function test_get_public_config() {
59         global $CFG, $SITE, $OUTPUT;
61         $this->resetAfterTest(true);
62         $result = external::get_public_config();
63         $result = external_api::clean_returnvalue(external::get_public_config_returns(), $result);
65         // Test default values.
66         $context = context_system::instance();
67         list($authinstructions, $notusedformat) = external_format_text($CFG->auth_instructions, FORMAT_MOODLE, $context->id);
68         list($maintenancemessage, $notusedformat) = external_format_text($CFG->maintenance_message, FORMAT_MOODLE, $context->id);
70         $expected = array(
71             'wwwroot' => $CFG->wwwroot,
72             'httpswwwroot' => $CFG->httpswwwroot,
73             'sitename' => external_format_string($SITE->fullname, $context->id, true),
74             'guestlogin' => $CFG->guestloginbutton,
75             'rememberusername' => $CFG->rememberusername,
76             'authloginviaemail' => $CFG->authloginviaemail,
77             'registerauth' => $CFG->registerauth,
78             'forgottenpasswordurl' => $CFG->forgottenpasswordurl,
79             'authinstructions' => $authinstructions,
80             'authnoneenabled' => (int) is_enabled_auth('none'),
81             'enablewebservices' => $CFG->enablewebservices,
82             'enablemobilewebservice' => $CFG->enablemobilewebservice,
83             'maintenanceenabled' => $CFG->maintenance_enabled,
84             'maintenancemessage' => $maintenancemessage,
85             'typeoflogin' => api::LOGIN_VIA_APP,
86             'mobilecssurl' => '',
87             'tool_mobile_disabledfeatures' => '',
88             'launchurl' => "$CFG->wwwroot/$CFG->admin/tool/mobile/launch.php",
89             'warnings' => array()
90         );
91         $this->assertEquals($expected, $result);
93         // Change some values.
94         set_config('registerauth', 'email');
95         $authinstructions = 'Something with <b>html tags</b>';
96         set_config('auth_instructions', $authinstructions);
97         set_config('typeoflogin', api::LOGIN_VIA_BROWSER, 'tool_mobile');
98         set_config('logo', 'mock.png', 'core_admin');
99         set_config('logocompact', 'mock.png', 'core_admin');
101         list($authinstructions, $notusedformat) = external_format_text($authinstructions, FORMAT_MOODLE, $context->id);
102         $expected['registerauth'] = 'email';
103         $expected['authinstructions'] = $authinstructions;
104         $expected['typeoflogin'] = api::LOGIN_VIA_BROWSER;
106         if ($logourl = $OUTPUT->get_logo_url()) {
107             $expected['logourl'] = $logourl->out(false);
108         }
109         if ($compactlogourl = $OUTPUT->get_compact_logo_url()) {
110             $expected['compactlogourl'] = $compactlogourl->out(false);
111         }
113         $result = external::get_public_config();
114         $result = external_api::clean_returnvalue(external::get_public_config_returns(), $result);
115         $this->assertEquals($expected, $result);
116     }
118     /**
119      * Test get_config
120      */
121     public function test_get_config() {
122         global $CFG, $SITE;
123         require_once($CFG->dirroot . '/course/format/lib.php');
125         $this->resetAfterTest(true);
127         $mysitepolicy = 'http://mysite.is/policy/';
128         set_config('sitepolicy', $mysitepolicy);
130         $result = external::get_config();
131         $result = external_api::clean_returnvalue(external::get_config_returns(), $result);
133         // SITE summary is null in phpunit which gets transformed to an empty string by format_text.
134         list($sitesummary, $unused) = external_format_text($SITE->summary, $SITE->summaryformat, context_system::instance()->id);
136         // Test default values.
137         $context = context_system::instance();
138         $expected = array(
139             array('name' => 'fullname', 'value' => $SITE->fullname),
140             array('name' => 'shortname', 'value' => $SITE->shortname),
141             array('name' => 'summary', 'value' => $sitesummary),
142             array('name' => 'summaryformat', 'value' => FORMAT_HTML),
143             array('name' => 'frontpage', 'value' => $CFG->frontpage),
144             array('name' => 'frontpageloggedin', 'value' => $CFG->frontpageloggedin),
145             array('name' => 'maxcategorydepth', 'value' => $CFG->maxcategorydepth),
146             array('name' => 'frontpagecourselimit', 'value' => $CFG->frontpagecourselimit),
147             array('name' => 'numsections', 'value' => course_get_format($SITE)->get_last_section_number()),
148             array('name' => 'newsitems', 'value' => $SITE->newsitems),
149             array('name' => 'commentsperpage', 'value' => $CFG->commentsperpage),
150             array('name' => 'sitepolicy', 'value' => $mysitepolicy),
151             array('name' => 'disableuserimages', 'value' => $CFG->disableuserimages),
152             array('name' => 'mygradesurl', 'value' => user_mygrades_url()->out(false)),
153             array('name' => 'tool_mobile_forcelogout', 'value' => 0),
154             array('name' => 'tool_mobile_customlangstrings', 'value' => ''),
155             array('name' => 'tool_mobile_disabledfeatures', 'value' => ''),
156             array('name' => 'tool_mobile_custommenuitems', 'value' => ''),
157         );
158         $this->assertCount(0, $result['warnings']);
159         $this->assertEquals($expected, $result['settings']);
161         // Change a value and retrieve filtering by section.
162         set_config('commentsperpage', 1);
163         $expected[10]['value'] = 1;
164         // Remove not expected elements.
165         array_splice($expected, 11);
167         $result = external::get_config('frontpagesettings');
168         $result = external_api::clean_returnvalue(external::get_config_returns(), $result);
169         $this->assertCount(0, $result['warnings']);
170         $this->assertEquals($expected, $result['settings']);
171     }
173     /*
174      * Test get_autologin_key.
175      */
176     public function test_get_autologin_key() {
177         global $DB, $CFG, $USER;
179         $this->resetAfterTest(true);
181         $user = $this->getDataGenerator()->create_user();
182         $this->setUser($user);
183         $service = $DB->get_record('external_services', array('shortname' => MOODLE_OFFICIAL_MOBILE_SERVICE));
185         $token = external_generate_token_for_current_user($service);
187         // Check we got the private token.
188         $this->assertTrue(isset($token->privatetoken));
190         // Enable requeriments.
191         $_GET['wstoken'] = $token->token;   // Mock parameters.
193         // Even if we force the password change for the current user we should be able to retrieve the key.
194         set_user_preference('auth_forcepasswordchange', 1, $user->id);
196         $this->setCurrentTimeStart();
197         $result = external::get_autologin_key($token->privatetoken);
198         $result = external_api::clean_returnvalue(external::get_autologin_key_returns(), $result);
199         // Validate the key.
200         $this->assertEquals(32, core_text::strlen($result['key']));
201         $key = $DB->get_record('user_private_key', array('value' => $result['key']));
202         $this->assertEquals($USER->id, $key->userid);
203         $this->assertTimeCurrent($key->validuntil - api::LOGIN_KEY_TTL);
205         // Now, try with an invalid private token.
206         set_user_preference('tool_mobile_autologin_request_last', time() - HOURSECS, $USER);
208         $this->expectException('moodle_exception');
209         $this->expectExceptionMessage(get_string('invalidprivatetoken', 'tool_mobile'));
210         $result = external::get_autologin_key(random_string('64'));
211     }
213     /**
214      * Test get_autologin_key missing ws.
215      */
216     public function test_get_autologin_key_missing_ws() {
217         global $CFG;
218         $this->resetAfterTest(true);
220         // Need to disable webservices to verify that's checked.
221         $CFG->enablewebservices = 0;
222         $CFG->enablemobilewebservice = 0;
224         $this->setAdminUser();
225         $this->expectException('moodle_exception');
226         $this->expectExceptionMessage(get_string('enablewsdescription', 'webservice'));
227         $result = external::get_autologin_key('');
228     }
230     /**
231      * Test get_autologin_key missing https.
232      */
233     public function test_get_autologin_key_missing_https() {
234         global $CFG;
236         // Need to simulate a non HTTPS site here.
237         $CFG->wwwroot = str_replace('https:', 'http:', $CFG->wwwroot);
239         $this->resetAfterTest(true);
240         $this->setAdminUser();
242         $this->expectException('moodle_exception');
243         $this->expectExceptionMessage(get_string('httpsrequired', 'tool_mobile'));
244         $result = external::get_autologin_key('');
245     }
247     /**
248      * Test get_autologin_key missing admin.
249      */
250     public function test_get_autologin_key_missing_admin() {
251         global $CFG;
253         $this->resetAfterTest(true);
254         $this->setAdminUser();
256         $this->expectException('moodle_exception');
257         $this->expectExceptionMessage(get_string('autologinnotallowedtoadmins', 'tool_mobile'));
258         $result = external::get_autologin_key('');
259     }
261     /**
262      * Test get_autologin_key locked.
263      */
264     public function test_get_autologin_key_missing_locked() {
265         global $CFG, $DB, $USER;
267         $this->resetAfterTest(true);
268         $user = $this->getDataGenerator()->create_user();
269         $this->setUser($user);
271         $service = $DB->get_record('external_services', array('shortname' => MOODLE_OFFICIAL_MOBILE_SERVICE));
273         $token = external_generate_token_for_current_user($service);
274         $_GET['wstoken'] = $token->token;   // Mock parameters.
276         $result = external::get_autologin_key($token->privatetoken);
277         $result = external_api::clean_returnvalue(external::get_autologin_key_returns(), $result);
279         // Mock last time request.
280         $mocktime = time() - 7 * MINSECS;
281         set_user_preference('tool_mobile_autologin_request_last', $mocktime, $USER);
282         $result = external::get_autologin_key($token->privatetoken);
283         $result = external_api::clean_returnvalue(external::get_autologin_key_returns(), $result);
285         // We just requested one token, we must wait.
286         $this->expectException('moodle_exception');
287         $this->expectExceptionMessage(get_string('autologinkeygenerationlockout', 'tool_mobile'));
288         $result = external::get_autologin_key($token->privatetoken);
289     }