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
namespace core_webservice;
18
 
19
use core_external\external_api;
20
use externallib_advanced_testcase;
1441 ariadna 21
use core\tests\session\mock_handler;
1 efrain 22
 
23
defined('MOODLE_INTERNAL') || die();
24
 
25
global $CFG;
26
require_once($CFG->dirroot . '/webservice/externallib.php');
27
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
28
 
29
/**
30
 * External course functions unit tests
31
 *
32
 * @package    core_webservice
1441 ariadna 33
 * @covers     \core_webservice_external::get_site_info
1 efrain 34
 * @category   external
35
 * @copyright  2012 Paul Charsley
36
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37
 */
1441 ariadna 38
final class externallib_test extends externallib_advanced_testcase {
39
    #[\Override]
1 efrain 40
    public function setUp(): void {
41
        // Calling parent is good, always
42
        parent::setUp();
43
 
44
        // We always need enabled WS for this testcase
45
        set_config('enablewebservices', '1');
46
    }
47
 
1441 ariadna 48
    /**
49
     * Test get_site_info.
50
     */
11 efrain 51
    public function test_get_site_info(): void {
1 efrain 52
        global $DB, $USER, $CFG, $PAGE;
53
 
54
        $this->resetAfterTest(true);
55
 
56
        $maxbytes = 10485760;
57
        $userquota = 5242880;
58
        set_config('maxbytes', $maxbytes);
59
        set_config('userquota', $userquota);
60
 
61
        // Set current user
62
        set_config('allowuserthemes', 1);
63
        $user = array();
64
        $user['username'] = 'johnd';
65
        $user['firstname'] = 'John';
66
        $user['lastname'] = 'Doe';
67
        $user['theme'] = 'boost';
68
        self::setUser(self::getDataGenerator()->create_user($user));
69
 
70
        // Add a web service and token.
71
        $webservice = new \stdClass();
72
        $webservice->name = 'Test web service';
73
        $webservice->enabled = true;
74
        $webservice->restrictedusers = false;
75
        $webservice->component = 'moodle';
76
        $webservice->timecreated = time();
77
        $webservice->downloadfiles = true;
78
        $webservice->uploadfiles = true;
79
        $externalserviceid = $DB->insert_record('external_services', $webservice);
80
 
81
        // Add a function to the service
82
        $DB->insert_record('external_services_functions', array('externalserviceid' => $externalserviceid,
83
            'functionname' => 'core_course_get_contents'));
84
 
85
        $_POST['wstoken'] = 'testtoken';
86
        $externaltoken = new \stdClass();
87
        $externaltoken->token = 'testtoken';
88
        $externaltoken->tokentype = 0;
89
        $externaltoken->userid = $USER->id;
90
        $externaltoken->externalserviceid = $externalserviceid;
91
        $externaltoken->contextid = 1;
92
        $externaltoken->creatorid = $USER->id;
93
        $externaltoken->timecreated = time();
94
        $externaltoken->name = \core_external\util::generate_token_name();
95
        $DB->insert_record('external_tokens', $externaltoken);
96
 
97
        $siteinfo = \core_webservice_external::get_site_info();
98
 
99
        // We need to execute the return values cleaning process to simulate the web service server.
100
        $siteinfo = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $siteinfo);
101
 
102
        $this->assertEquals('johnd', $siteinfo['username']);
103
        $this->assertEquals('John', $siteinfo['firstname']);
104
        $this->assertEquals('Doe', $siteinfo['lastname']);
105
        $this->assertEquals(current_language(), $siteinfo['lang']);
106
        $this->assertEquals($USER->id, $siteinfo['userid']);
107
        $this->assertEquals(SITEID, $siteinfo['siteid']);
108
        $this->assertEquals(true, $siteinfo['downloadfiles']);
109
        $this->assertEquals($CFG->release, $siteinfo['release']);
110
        $this->assertEquals($CFG->version, $siteinfo['version']);
111
        $this->assertEquals('', $siteinfo['mobilecssurl']);
112
        $this->assertEquals(count($siteinfo['functions']), 1);
113
        $function = array_pop($siteinfo['functions']);
114
        $this->assertEquals($function['name'], 'core_course_get_contents');
115
        $this->assertEquals($function['version'], $siteinfo['version']);
116
        $this->assertEquals(1, $siteinfo['downloadfiles']);
117
        $this->assertEquals(1, $siteinfo['uploadfiles']);
118
 
119
        $this->assertCount(12, $siteinfo['advancedfeatures']);
120
        foreach ($siteinfo['advancedfeatures'] as $feature) {
121
            if ($feature['name'] == 'mnet_dispatcher_mode') {
122
                if ($CFG->mnet_dispatcher_mode == 'off') {
123
                    $this->assertEquals(0, $feature['value']);
124
                } else {
125
                    $this->assertEquals(1, $feature['value']);
126
                }
127
            } else if ($feature['name'] == 'enablecompetencies') {
128
                $expected = (!empty(get_config('core_competency', 'enabled'))) ? 1 : 0;
129
                $this->assertEquals($expected, $feature['value']);
130
            } else {
131
                $this->assertEquals($CFG->{$feature['name']}, $feature['value']);
132
            }
133
        }
134
 
135
        $this->assertEquals($userquota, $siteinfo['userquota']);
136
        // We can use the function for the expectation because USER_CAN_IGNORE_FILE_SIZE_LIMITS is
137
        // covered below for admin user. This test is for user not allowed to ignore limits.
138
        $this->assertEquals(get_max_upload_file_size($maxbytes), $siteinfo['usermaxuploadfilesize']);
139
        $this->assertEquals(true, $siteinfo['usercanmanageownfiles']);
140
        $userkey = get_user_key('core_files', $USER->id);
141
        $this->assertEquals($userkey, $siteinfo['userprivateaccesskey']);
142
 
143
        $this->assertEquals(HOMEPAGE_MY, $siteinfo['userhomepage']);
144
        $this->assertEquals($CFG->calendartype, $siteinfo['sitecalendartype']);
145
        if (!empty($USER->calendartype)) {
146
            $this->assertEquals($USER->calendartype, $siteinfo['usercalendartype']);
147
        } else {
148
            $this->assertEquals($CFG->calendartype, $siteinfo['usercalendartype']);
149
        }
150
        $this->assertFalse($siteinfo['userissiteadmin']);
151
        $this->assertEquals($CFG->calendartype, $siteinfo['sitecalendartype']);
152
        $this->assertEquals($user['theme'], $siteinfo['theme']);
153
        $this->assertEquals($USER->policyagreed, $siteinfo['policyagreed']);
154
 
155
        // Now as admin.
156
        $this->setAdminUser();
157
 
158
        // Set a fake token for the user admin.
159
        $_POST['wstoken'] = 'testtoken';
160
        $externaltoken = new \stdClass();
161
        $externaltoken->token = 'testtoken';
162
        $externaltoken->tokentype = 0;
163
        $externaltoken->userid = $USER->id;
164
        $externaltoken->externalserviceid = $externalserviceid;
165
        $externaltoken->contextid = 1;
166
        $externaltoken->creatorid = $USER->id;
167
        $externaltoken->timecreated = time();
168
        $externaltoken->name = \core_external\util::generate_token_name();
169
        $DB->insert_record('external_tokens', $externaltoken);
170
 
171
        // Set a home page by user preferences.
172
        $CFG->defaulthomepage = HOMEPAGE_USER;
173
        set_user_preference('user_home_page_preference', HOMEPAGE_SITE);
174
 
175
        $siteinfo = \core_webservice_external::get_site_info();
176
 
177
        // We need to execute the return values cleaning process to simulate the web service server.
178
        $siteinfo = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $siteinfo);
179
 
180
        $this->assertEquals(0, $siteinfo['userquota']);
181
        $this->assertEquals(USER_CAN_IGNORE_FILE_SIZE_LIMITS, $siteinfo['usermaxuploadfilesize']);
182
        $this->assertEquals(true, $siteinfo['usercanmanageownfiles']);
183
        $this->assertTrue($siteinfo['userissiteadmin']);
184
        $this->assertEmpty($USER->theme);
185
        $this->assertEquals($PAGE->theme->name, $siteinfo['theme']);
186
        $this->assertEquals($CFG->limitconcurrentlogins, $siteinfo['limitconcurrentlogins']);
187
        $this->assertFalse(isset($siteinfo['usersessionscount']));
188
 
189
        $CFG->limitconcurrentlogins = 1;
190
        $record = new \stdClass();
191
        $record->state        = 0;
192
        $record->sessdata     = null;
193
        $record->userid       = $USER->id;
194
        $record->timemodified = time();
195
        $record->firstip      = $record->lastip = '10.0.0.1';
196
        $record->sid = md5('hokus1');
197
        $record->timecreated = time();
198
 
1441 ariadna 199
        $mockhandler = new mock_handler();
200
        $mockhandler->add_test_session($record);
201
 
1 efrain 202
        $siteinfo = \core_webservice_external::get_site_info();
203
        $siteinfo = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $siteinfo);
204
        $this->assertEquals($CFG->limitconcurrentlogins, $siteinfo['limitconcurrentlogins']);
205
        $this->assertEquals(1, $siteinfo['usersessionscount']);
206
    }
207
 
208
    /**
209
     * Test get_site_info with values > PHP_INT_MAX. We check only userquota since maxbytes require PHP ini changes.
210
     */
11 efrain 211
    public function test_get_site_info_max_int(): void {
1 efrain 212
        $this->resetAfterTest(true);
213
 
214
        self::setUser(self::getDataGenerator()->create_user());
215
 
216
        // Check values higher than PHP_INT_MAX. This value may come from settings (as string).
217
        $userquota = PHP_INT_MAX . '000';
218
        set_config('userquota', $userquota);
219
 
220
        $result = \core_webservice_external::get_site_info();
221
        $result = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $result);
222
        $this->assertEquals(PHP_INT_MAX, $result['userquota']);
223
    }
224
 
225
    /**
226
     * Test get_site_info with missing components.
227
     */
11 efrain 228
    public function test_get_site_missing_components(): void {
1 efrain 229
        global $USER, $DB;
230
 
231
        $this->resetAfterTest(true);
232
        $this->setAdminUser();
233
 
234
        // Add a web service and token.
235
        $webservice = new \stdClass();
236
        $webservice->name = 'Test web service';
237
        $webservice->enabled = true;
238
        $webservice->restrictedusers = false;
239
        $webservice->component = 'moodle';
240
        $webservice->timecreated = time();
241
        $webservice->downloadfiles = true;
242
        $webservice->uploadfiles = true;
243
        $externalserviceid = $DB->insert_record('external_services', $webservice);
244
 
245
        // Add a function to the service (missing plugin).
246
        $DB->insert_record('external_functions',
247
            [
248
                'component' => 'mod_random',
249
                'name' => 'mod_random_get_info'
250
            ]
251
        );
252
 
253
        // Insert one from missing component.
254
        $DB->insert_record('external_services_functions',
255
            [
256
                'externalserviceid' => $externalserviceid,
257
                'functionname' => 'mod_random_get_info'
258
            ]
259
        );
260
        // Insert a core one.
261
        $DB->insert_record('external_services_functions',
262
            [
263
                'externalserviceid' => $externalserviceid,
264
                'functionname' => 'core_user_get_users'
265
            ]
266
        );
267
 
268
        $_POST['wstoken'] = 'testtoken';
269
        $externaltoken = new \stdClass();
270
        $externaltoken->token = 'testtoken';
271
        $externaltoken->tokentype = 0;
272
        $externaltoken->userid = $USER->id;
273
        $externaltoken->externalserviceid = $externalserviceid;
274
        $externaltoken->contextid = 1;
275
        $externaltoken->creatorid = $USER->id;
276
        $externaltoken->timecreated = time();
277
        $externaltoken->name = \core_external\util::generate_token_name();
278
        $DB->insert_record('external_tokens', $externaltoken);
279
 
280
        // Execution should complete.
281
        $result = \core_webservice_external::get_site_info();
282
        $result = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $result);
283
        // Check we ignore the missing component function.
284
        $this->assertCount(1, $result['functions']);
285
        $this->assertEquals('core_user_get_users', $result['functions'][0]['name']);
286
    }
287
 
1441 ariadna 288
 
289
    /**
290
     * Test get_site_info returns the default home page URL when needed.
291
     */
292
    public function test_get_site_info_default_home_page(): void {
293
        global $CFG;
294
 
295
        $this->resetAfterTest();
296
        $this->setAdminUser();
297
 
298
        // Site configuration.
299
        $CFG->defaulthomepage = HOMEPAGE_MY;
300
 
301
        $result = \core_webservice_external::get_site_info();
302
        $result = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $result);
303
        $this->assertEquals(HOMEPAGE_MY, $result['userhomepage']);
304
        $this->assertArrayNotHasKey('userhomepageurl', $result);
305
 
306
        $CFG->defaulthomepage = "/home";
307
 
308
        $result = \core_webservice_external::get_site_info();
309
        $result = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $result);
310
        $this->assertEquals(HOMEPAGE_URL, $result['userhomepage']);
311
        $this->assertEquals("{$CFG->wwwroot}/home", $result['userhomepageurl']);
312
 
313
        // User preference.
314
        $CFG->defaulthomepage = HOMEPAGE_USER;
315
 
316
        $userpreference = "/about";
317
        set_user_preference('user_home_page_preference', $userpreference);
318
 
319
        $result = \core_webservice_external::get_site_info();
320
        $result = external_api::clean_returnvalue(\core_webservice_external::get_site_info_returns(), $result);
321
        $this->assertEquals(HOMEPAGE_URL, $result['userhomepage']);
322
        $this->assertEquals("{$CFG->wwwroot}/about", $result['userhomepageurl']);
323
    }
324
 
1 efrain 325
}