Commit | Line | Data |
---|---|---|
a3d5830a PS |
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 | * These tests rely on the rsstest.xml file on download.moodle.org, | |
19 | * from eloys listing: | |
20 | * rsstest.xml: One valid rss feed. | |
21 | * md5: 8fd047914863bf9b3a4b1514ec51c32c | |
22 | * size: 32188 | |
23 | * | |
24 | * If networking/proxy configuration is wrong these tests will fail.. | |
25 | * | |
26 | * @package core | |
27 | * @category phpunit | |
28 | * @copyright © 2006 The Open University | |
29 | * @author T.J.Hunt@open.ac.uk | |
30 | * @license http://www.gnu.org/copyleft/gpl.html GNU Public License | |
31 | */ | |
32 | ||
33 | defined('MOODLE_INTERNAL') || die(); | |
34 | ||
35 | ||
f0202ae9 | 36 | class web_testcase extends advanced_testcase { |
a3d5830a PS |
37 | |
38 | function test_format_string() { | |
39 | global $CFG; | |
40 | ||
41 | // Ampersands | |
42 | $this->assertEquals(format_string("& &&&&& &&"), "& &&&&& &&"); | |
43 | $this->assertEquals(format_string("ANother & &&&&& Category"), "ANother & &&&&& Category"); | |
44 | $this->assertEquals(format_string("ANother & &&&&& Category", true), "ANother & &&&&& Category"); | |
45 | $this->assertEquals(format_string("Nick's Test Site & Other things", true), "Nick's Test Site & Other things"); | |
46 | ||
47 | // String entities | |
48 | $this->assertEquals(format_string("""), """); | |
49 | ||
50 | // Digital entities | |
51 | $this->assertEquals(format_string("&11234;"), "&11234;"); | |
52 | ||
53 | // Unicode entities | |
54 | $this->assertEquals(format_string("ᅻ"), "ᅻ"); | |
55 | ||
56 | // < and > signs | |
57 | $originalformatstringstriptags = $CFG->formatstringstriptags; | |
58 | ||
59 | $CFG->formatstringstriptags = false; | |
60 | $this->assertEquals(format_string('x < 1'), 'x < 1'); | |
61 | $this->assertEquals(format_string('x > 1'), 'x > 1'); | |
62 | $this->assertEquals(format_string('x < 1 and x > 0'), 'x < 1 and x > 0'); | |
63 | ||
64 | $CFG->formatstringstriptags = true; | |
65 | $this->assertEquals(format_string('x < 1'), 'x < 1'); | |
66 | $this->assertEquals(format_string('x > 1'), 'x > 1'); | |
67 | $this->assertEquals(format_string('x < 1 and x > 0'), 'x < 1 and x > 0'); | |
68 | ||
69 | $CFG->formatstringstriptags = $originalformatstringstriptags; | |
70 | } | |
71 | ||
72 | function test_s() { | |
328ac306 TH |
73 | // Special cases. |
74 | $this->assertSame('0', s(0)); | |
75 | $this->assertSame('0', s('0')); | |
76 | $this->assertSame('0', s(false)); | |
77 | $this->assertSame('', s(null)); | |
78 | ||
79 | // Normal cases. | |
80 | $this->assertEquals('This Breaks " Strict', s('This Breaks " Strict')); | |
81 | $this->assertEquals('This Breaks <a>" Strict</a>', s('This Breaks <a>" Strict</a>')); | |
82 | ||
83 | // Unicode characters. | |
84 | $this->assertEquals('Café', s('Café')); | |
85 | $this->assertEquals('一, 二, 三', s('一, 二, 三')); | |
86 | ||
87 | // Don't escape already-escaped numeric entities. (Note, this behaviour | |
88 | // may not be desirable. Perhaps we should remove these tests and that | |
89 | // functionality, but we can only do that if we understand why it was added.) | |
0c6f9e75 | 90 | $this->assertEquals('An entity: ৿.', s('An entity: ৿.')); |
328ac306 TH |
91 | $this->assertEquals('An entity: б.', s('An entity: б.')); |
92 | $this->assertEquals('An entity: &amp;.', s('An entity: &.')); | |
93 | $this->assertEquals('Not an entity: &amp;#x09ff;.', s('Not an entity: &#x09ff;.')); | |
a3d5830a PS |
94 | } |
95 | ||
96 | function test_format_text_email() { | |
97 | $this->assertEquals("This is a TEST", | |
98 | format_text_email('<p>This is a <strong>test</strong></p>',FORMAT_HTML)); | |
99 | $this->assertEquals("This is a TEST", | |
100 | format_text_email('<p class="frogs">This is a <strong class=\'fishes\'>test</strong></p>',FORMAT_HTML)); | |
101 | $this->assertEquals('& so is this', | |
102 | format_text_email('& so is this',FORMAT_HTML)); | |
103 | $this->assertEquals('Two bullets: '.textlib::code2utf8(8226).' *', | |
104 | format_text_email('Two bullets: • •',FORMAT_HTML)); | |
105 | $this->assertEquals(textlib::code2utf8(0x7fd2).textlib::code2utf8(0x7fd2), | |
106 | format_text_email('習習',FORMAT_HTML)); | |
107 | } | |
108 | ||
66056f99 PS |
109 | function test_obfuscate_email() { |
110 | $email = 'some.user@example.com'; | |
111 | $obfuscated = obfuscate_email($email); | |
112 | $this->assertNotSame($email, $obfuscated); | |
113 | $back = textlib::entities_to_utf8(urldecode($email), true); | |
114 | $this->assertSame($email, $back); | |
115 | } | |
116 | ||
117 | function test_obfuscate_text() { | |
118 | $text = 'Žluťoučký koníček 32131'; | |
119 | $obfuscated = obfuscate_text($text); | |
120 | $this->assertNotSame($text, $obfuscated); | |
121 | $back = textlib::entities_to_utf8($obfuscated, true); | |
122 | $this->assertSame($text, $back); | |
123 | } | |
124 | ||
a3d5830a PS |
125 | function test_highlight() { |
126 | $this->assertEquals(highlight('good', 'This is good'), 'This is <span class="highlight">good</span>'); | |
127 | $this->assertEquals(highlight('SpaN', 'span'), '<span class="highlight">span</span>'); | |
128 | $this->assertEquals(highlight('span', 'SpaN'), '<span class="highlight">SpaN</span>'); | |
129 | $this->assertEquals(highlight('span', '<span>span</span>'), '<span><span class="highlight">span</span></span>'); | |
130 | $this->assertEquals(highlight('good is', 'He is good'), 'He <span class="highlight">is</span> <span class="highlight">good</span>'); | |
131 | $this->assertEquals(highlight('+good', 'This is good'), 'This is <span class="highlight">good</span>'); | |
132 | $this->assertEquals(highlight('-good', 'This is good'), 'This is good'); | |
133 | $this->assertEquals(highlight('+good', 'This is goodness'), 'This is goodness'); | |
134 | $this->assertEquals(highlight('good', 'This is goodness'), 'This is <span class="highlight">good</span>ness'); | |
135 | } | |
136 | ||
137 | function test_replace_ampersands() { | |
138 | $this->assertEquals(replace_ampersands_not_followed_by_entity("This & that "), "This & that "); | |
139 | $this->assertEquals(replace_ampersands_not_followed_by_entity("This   that "), "This &nbsp that "); | |
140 | } | |
141 | ||
142 | function test_strip_links() { | |
143 | $this->assertEquals(strip_links('this is a <a href="http://someaddress.com/query">link</a>'), 'this is a link'); | |
144 | } | |
145 | ||
146 | function test_wikify_links() { | |
147 | $this->assertEquals(wikify_links('this is a <a href="http://someaddress.com/query">link</a>'), 'this is a link [ http://someaddress.com/query ]'); | |
148 | } | |
149 | ||
61b223a6 SH |
150 | /** |
151 | * Test basic moodle_url construction. | |
152 | */ | |
153 | function test_moodle_url_constructor() { | |
154 | global $CFG; | |
155 | ||
156 | $url = new moodle_url('/index.php'); | |
157 | $this->assertEquals($CFG->wwwroot.'/index.php', $url->out()); | |
158 | ||
159 | $url = new moodle_url('/index.php', array()); | |
160 | $this->assertEquals($CFG->wwwroot.'/index.php', $url->out()); | |
161 | ||
162 | $url = new moodle_url('/index.php', array('id' => 2)); | |
163 | $this->assertEquals($CFG->wwwroot.'/index.php?id=2', $url->out()); | |
164 | ||
165 | $url = new moodle_url('/index.php', array('id' => 'two')); | |
166 | $this->assertEquals($CFG->wwwroot.'/index.php?id=two', $url->out()); | |
167 | ||
168 | $url = new moodle_url('/index.php', array('id' => 1, 'cid' => '2')); | |
169 | $this->assertEquals($CFG->wwwroot.'/index.php?id=1&cid=2', $url->out()); | |
170 | $this->assertEquals($CFG->wwwroot.'/index.php?id=1&cid=2', $url->out(false)); | |
171 | ||
172 | $url = new moodle_url('/index.php', null, 'test'); | |
173 | $this->assertEquals($CFG->wwwroot.'/index.php#test', $url->out()); | |
174 | ||
175 | $url = new moodle_url('/index.php', array('id' => 2), 'test'); | |
176 | $this->assertEquals($CFG->wwwroot.'/index.php?id=2#test', $url->out()); | |
177 | } | |
178 | ||
ffe4de97 | 179 | /** |
180 | * Tests moodle_url::get_path(). | |
181 | */ | |
182 | public function test_moodle_url_get_path() { | |
183 | $url = new moodle_url('http://www.example.org:447/my/file/is/here.txt?really=1'); | |
184 | $this->assertEquals('/my/file/is/here.txt', $url->get_path()); | |
185 | ||
186 | $url = new moodle_url('http://www.example.org/'); | |
187 | $this->assertEquals('/', $url->get_path()); | |
188 | ||
189 | $url = new moodle_url('http://www.example.org/pluginfile.php/slash/arguments'); | |
190 | $this->assertEquals('/pluginfile.php/slash/arguments', $url->get_path()); | |
191 | $this->assertEquals('/pluginfile.php', $url->get_path(false)); | |
192 | } | |
193 | ||
a3d5830a PS |
194 | function test_moodle_url_round_trip() { |
195 | $strurl = 'http://moodle.org/course/view.php?id=5'; | |
196 | $url = new moodle_url($strurl); | |
197 | $this->assertEquals($strurl, $url->out(false)); | |
198 | ||
199 | $strurl = 'http://moodle.org/user/index.php?contextid=53&sifirst=M&silast=D'; | |
200 | $url = new moodle_url($strurl); | |
201 | $this->assertEquals($strurl, $url->out(false)); | |
202 | } | |
203 | ||
616396a6 SH |
204 | /** |
205 | * Test Moodle URL objects created with a param with empty value. | |
206 | */ | |
207 | function test_moodle_url_empty_param_values() { | |
208 | $strurl = 'http://moodle.org/course/view.php?id=0'; | |
209 | $url = new moodle_url($strurl, array('id' => 0)); | |
210 | $this->assertEquals($strurl, $url->out(false)); | |
211 | ||
45d97522 | 212 | $strurl = 'http://moodle.org/course/view.php?id'; |
616396a6 SH |
213 | $url = new moodle_url($strurl, array('id' => false)); |
214 | $this->assertEquals($strurl, $url->out(false)); | |
215 | ||
45d97522 | 216 | $strurl = 'http://moodle.org/course/view.php?id'; |
616396a6 SH |
217 | $url = new moodle_url($strurl, array('id' => null)); |
218 | $this->assertEquals($strurl, $url->out(false)); | |
219 | ||
a697000b SH |
220 | $strurl = 'http://moodle.org/course/view.php?id'; |
221 | $url = new moodle_url($strurl, array('id' => '')); | |
222 | $this->assertEquals($strurl, $url->out(false)); | |
223 | ||
45d97522 | 224 | $strurl = 'http://moodle.org/course/view.php?id'; |
616396a6 SH |
225 | $url = new moodle_url($strurl); |
226 | $this->assertEquals($strurl, $url->out(false)); | |
227 | } | |
228 | ||
a3d5830a PS |
229 | function test_moodle_url_round_trip_array_params() { |
230 | $strurl = 'http://example.com/?a%5B1%5D=1&a%5B2%5D=2'; | |
231 | $url = new moodle_url($strurl); | |
232 | $this->assertEquals($strurl, $url->out(false)); | |
233 | ||
234 | $url = new moodle_url('http://example.com/?a[1]=1&a[2]=2'); | |
235 | $this->assertEquals($strurl, $url->out(false)); | |
236 | ||
237 | // For un-keyed array params, we expect 0..n keys to be returned | |
238 | $strurl = 'http://example.com/?a%5B0%5D=0&a%5B1%5D=1'; | |
239 | $url = new moodle_url('http://example.com/?a[]=0&a[]=1'); | |
240 | $this->assertEquals($strurl, $url->out(false)); | |
241 | } | |
242 | ||
243 | function test_compare_url() { | |
244 | $url1 = new moodle_url('index.php', array('var1' => 1, 'var2' => 2)); | |
245 | $url2 = new moodle_url('index2.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); | |
246 | ||
247 | $this->assertFalse($url1->compare($url2, URL_MATCH_BASE)); | |
248 | $this->assertFalse($url1->compare($url2, URL_MATCH_PARAMS)); | |
249 | $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); | |
250 | ||
251 | $url2 = new moodle_url('index.php', array('var1' => 1, 'var3' => 3)); | |
252 | ||
253 | $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); | |
254 | $this->assertFalse($url1->compare($url2, URL_MATCH_PARAMS)); | |
255 | $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); | |
256 | ||
257 | $url2 = new moodle_url('index.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); | |
258 | ||
259 | $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); | |
260 | $this->assertTrue($url1->compare($url2, URL_MATCH_PARAMS)); | |
261 | $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); | |
262 | ||
263 | $url2 = new moodle_url('index.php', array('var2' => 2, 'var1' => 1)); | |
264 | ||
265 | $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); | |
266 | $this->assertTrue($url1->compare($url2, URL_MATCH_PARAMS)); | |
267 | $this->assertTrue($url1->compare($url2, URL_MATCH_EXACT)); | |
268 | } | |
269 | ||
270 | function test_out_as_local_url() { | |
72b181ba RT |
271 | global $CFG; |
272 | // Test http url. | |
a3d5830a PS |
273 | $url1 = new moodle_url('/lib/tests/weblib_test.php'); |
274 | $this->assertEquals('/lib/tests/weblib_test.php', $url1->out_as_local_url()); | |
72b181ba RT |
275 | |
276 | // Test https url. | |
277 | $httpswwwroot = str_replace("http://", "https://", $CFG->wwwroot); | |
278 | $url2 = new moodle_url($httpswwwroot.'/login/profile.php'); | |
279 | $this->assertEquals('/login/profile.php', $url2->out_as_local_url()); | |
280 | ||
281 | // Test http url matching wwwroot. | |
282 | $url3 = new moodle_url($CFG->wwwroot); | |
283 | $this->assertEquals('', $url3->out_as_local_url()); | |
284 | ||
285 | // Test http url matching wwwroot ending with slash (/). | |
286 | $url3 = new moodle_url($CFG->wwwroot.'/'); | |
287 | $this->assertEquals('/', $url3->out_as_local_url()); | |
a3d5830a PS |
288 | } |
289 | ||
290 | /** | |
291 | * @expectedException coding_exception | |
292 | * @return void | |
293 | */ | |
294 | function test_out_as_local_url_error() { | |
4ca04fb5 | 295 | $url2 = new moodle_url('http://www.google.com/lib/tests/weblib_test.php'); |
a3d5830a PS |
296 | $url2->out_as_local_url(); |
297 | } | |
298 | ||
72b181ba RT |
299 | /** |
300 | * You should get error with modified url | |
301 | * | |
302 | * @expectedException coding_exception | |
303 | * @return void | |
304 | */ | |
305 | public function test_modified_url_out_as_local_url_error() { | |
306 | global $CFG; | |
307 | ||
308 | $modifiedurl = $CFG->wwwroot.'1'; | |
309 | $url3 = new moodle_url($modifiedurl.'/login/profile.php'); | |
310 | $url3->out_as_local_url(); | |
311 | } | |
312 | ||
313 | /** | |
314 | * Try get local url from external https url and you should get error | |
315 | * | |
316 | * @expectedException coding_exception | |
317 | * @return void | |
318 | */ | |
319 | public function test_https_out_as_local_url_error() { | |
320 | $url4 = new moodle_url('https://www.google.com/lib/tests/weblib_test.php'); | |
321 | $url4->out_as_local_url(); | |
322 | } | |
323 | ||
a3d5830a PS |
324 | public function test_clean_text() { |
325 | $text = "lala <applet>xx</applet>"; | |
326 | $this->assertEquals($text, clean_text($text, FORMAT_PLAIN)); | |
327 | $this->assertEquals('lala xx', clean_text($text, FORMAT_MARKDOWN)); | |
328 | $this->assertEquals('lala xx', clean_text($text, FORMAT_MOODLE)); | |
329 | $this->assertEquals('lala xx', clean_text($text, FORMAT_HTML)); | |
330 | } | |
f0202ae9 | 331 | |
bd319d12 | 332 | public function test_qualified_me() { |
f0202ae9 PS |
333 | global $PAGE, $FULLME, $CFG; |
334 | $this->resetAfterTest(); | |
335 | ||
336 | $PAGE = new moodle_page(); | |
337 | ||
338 | $FULLME = $CFG->wwwroot.'/course/view.php?id=1&xx=yy'; | |
339 | $this->assertEquals($FULLME, qualified_me()); | |
340 | ||
341 | $PAGE->set_url('/course/view.php', array('id'=>1)); | |
342 | $this->assertEquals($CFG->wwwroot.'/course/view.php?id=1', qualified_me()); | |
343 | } | |
837e3042 PS |
344 | |
345 | public function test_null_progres_trace() { | |
346 | $this->resetAfterTest(false); | |
347 | ||
348 | $trace = new null_progress_trace(); | |
837e3042 PS |
349 | $trace->output('do'); |
350 | $trace->output('re', 1); | |
351 | $trace->output('mi', 2); | |
352 | $trace->finished(); | |
353 | $output = ob_get_contents(); | |
837e3042 | 354 | $this->assertSame('', $output); |
4fa7fdea | 355 | $this->expectOutputString(''); |
837e3042 PS |
356 | } |
357 | ||
358 | public function test_text_progres_trace() { | |
359 | $this->resetAfterTest(false); | |
360 | ||
361 | $trace = new text_progress_trace(); | |
837e3042 PS |
362 | $trace->output('do'); |
363 | $trace->output('re', 1); | |
364 | $trace->output('mi', 2); | |
365 | $trace->finished(); | |
4fa7fdea | 366 | $this->expectOutputString("do\n re\n mi\n"); |
837e3042 PS |
367 | } |
368 | ||
369 | public function test_html_progres_trace() { | |
370 | $this->resetAfterTest(false); | |
371 | ||
372 | $trace = new html_progress_trace(); | |
837e3042 PS |
373 | $trace->output('do'); |
374 | $trace->output('re', 1); | |
375 | $trace->output('mi', 2); | |
376 | $trace->finished(); | |
4fa7fdea | 377 | $this->expectOutputString("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n"); |
837e3042 PS |
378 | } |
379 | ||
380 | public function test_html_list_progress_trace() { | |
381 | $this->resetAfterTest(false); | |
382 | ||
383 | $trace = new html_list_progress_trace(); | |
837e3042 PS |
384 | $trace->output('do'); |
385 | $trace->output('re', 1); | |
386 | $trace->output('mi', 2); | |
387 | $trace->finished(); | |
4fa7fdea | 388 | $this->expectOutputString("<ul>\n<li>do<ul>\n<li>re<ul>\n<li>mi</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n"); |
837e3042 PS |
389 | } |
390 | ||
391 | public function test_progres_trace_buffer() { | |
392 | $this->resetAfterTest(false); | |
393 | ||
394 | $trace = new progress_trace_buffer(new html_progress_trace()); | |
395 | ob_start(); | |
396 | $trace->output('do'); | |
397 | $trace->output('re', 1); | |
398 | $trace->output('mi', 2); | |
399 | $trace->finished(); | |
400 | $output = ob_get_contents(); | |
401 | ob_end_clean(); | |
402 | $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $output); | |
403 | $this->assertSame($output, $trace->get_buffer()); | |
404 | ||
405 | $trace = new progress_trace_buffer(new html_progress_trace(), false); | |
837e3042 PS |
406 | $trace->output('do'); |
407 | $trace->output('re', 1); | |
408 | $trace->output('mi', 2); | |
409 | $trace->finished(); | |
837e3042 PS |
410 | $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace->get_buffer()); |
411 | $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace->get_buffer()); | |
412 | $trace->reset_buffer(); | |
413 | $this->assertSame('', $trace->get_buffer()); | |
4fa7fdea | 414 | $this->expectOutputString(''); |
837e3042 | 415 | } |
e7259ec9 PS |
416 | |
417 | public function test_combined_progres_trace() { | |
418 | $this->resetAfterTest(false); | |
419 | ||
420 | $trace1 = new progress_trace_buffer(new html_progress_trace(), false); | |
421 | $trace2 = new progress_trace_buffer(new text_progress_trace(), false); | |
422 | ||
423 | $trace = new combined_progress_trace(array($trace1, $trace2)); | |
e7259ec9 PS |
424 | $trace->output('do'); |
425 | $trace->output('re', 1); | |
426 | $trace->output('mi', 2); | |
427 | $trace->finished(); | |
e7259ec9 PS |
428 | $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace1->get_buffer()); |
429 | $this->assertSame("do\n re\n mi\n", $trace2->get_buffer()); | |
4fa7fdea | 430 | $this->expectOutputString(''); |
e7259ec9 | 431 | } |
a3d5830a | 432 | } |