source: trunk/server/www/vendors/simpletest/test/url_test.php @ 6

Last change on this file since 6 was 6, checked in by sander, 12 years ago

Added SimpleTest? test framework

File size: 19.1 KB
Line 
1<?php
2// $Id: url_test.php 1598 2007-12-24 10:44:09Z pp11 $
3require_once(dirname(__FILE__) . '/../autorun.php');
4require_once(dirname(__FILE__) . '/../url.php');
5
6class TestOfUrl extends UnitTestCase {
7   
8    function testDefaultUrl() {
9        $url = new SimpleUrl('');
10        $this->assertEqual($url->getScheme(), '');
11        $this->assertEqual($url->getHost(), '');
12        $this->assertEqual($url->getScheme('http'), 'http');
13        $this->assertEqual($url->getHost('localhost'), 'localhost');
14        $this->assertEqual($url->getPath(), '');
15    }
16   
17    function testBasicParsing() {
18        $url = new SimpleUrl('https://www.lastcraft.com/test/');
19        $this->assertEqual($url->getScheme(), 'https');
20        $this->assertEqual($url->getHost(), 'www.lastcraft.com');
21        $this->assertEqual($url->getPath(), '/test/');
22    }
23   
24    function testRelativeUrls() {
25        $url = new SimpleUrl('../somewhere.php');
26        $this->assertEqual($url->getScheme(), false);
27        $this->assertEqual($url->getHost(), false);
28        $this->assertEqual($url->getPath(), '../somewhere.php');
29    }
30   
31    function testParseBareParameter() {
32        $url = new SimpleUrl('?a');
33        $this->assertEqual($url->getPath(), '');
34        $this->assertEqual($url->getEncodedRequest(), '?a');
35        $url->addRequestParameter('x', 'X');
36        $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
37    }
38   
39    function testParseEmptyParameter() {
40        $url = new SimpleUrl('?a=');
41        $this->assertEqual($url->getPath(), '');
42        $this->assertEqual($url->getEncodedRequest(), '?a=');
43        $url->addRequestParameter('x', 'X');
44        $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
45    }
46   
47    function testParseParameterPair() {
48        $url = new SimpleUrl('?a=A');
49        $this->assertEqual($url->getPath(), '');
50        $this->assertEqual($url->getEncodedRequest(), '?a=A');
51        $url->addRequestParameter('x', 'X');
52        $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X');
53    }
54   
55    function testParseMultipleParameters() {
56        $url = new SimpleUrl('?a=A&b=B');
57        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
58        $url->addRequestParameter('x', 'X');
59        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X');
60    }
61   
62    function testParsingParameterMixture() {
63        $url = new SimpleUrl('?a=A&b=&c');
64        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
65        $url->addRequestParameter('x', 'X');
66        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X');
67    }
68   
69    function testAddParametersFromScratch() {
70        $url = new SimpleUrl('');
71        $url->addRequestParameter('a', 'A');
72        $this->assertEqual($url->getEncodedRequest(), '?a=A');
73        $url->addRequestParameter('b', 'B');
74        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
75        $url->addRequestParameter('a', 'aaa');
76        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa');
77    }
78   
79    function testClearingParameters() {
80        $url = new SimpleUrl('');
81        $url->addRequestParameter('a', 'A');
82        $url->clearRequest();
83        $this->assertIdentical($url->getEncodedRequest(), '');
84    }
85   
86    function testEncodingParameters() {
87        $url = new SimpleUrl('');
88        $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|£$%^&*()_+-=');
89        $this->assertIdentical(
90                $request = $url->getEncodedRequest(),
91                '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D');
92    }
93   
94    function testDecodingParameters() {           
95        $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D');
96        $this->assertEqual(
97                $url->getEncodedRequest(),
98                '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|£$%^&*()_+-='));
99    }
100   
101    function testUrlInQueryDoesNotConfuseParsing() {
102        $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/');
103        $this->assertFalse($url->getScheme());
104        $this->assertFalse($url->getHost());
105        $this->assertEqual($url->getPath(), 'wibble/login.php');
106        $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/');
107    }
108   
109    function testSettingCordinates() {
110        $url = new SimpleUrl('');
111        $url->setCoordinates('32', '45');
112        $this->assertIdentical($url->getX(), 32);
113        $this->assertIdentical($url->getY(), 45);
114        $this->assertEqual($url->getEncodedRequest(), '');
115    }
116   
117    function testParseCordinates() {
118        $url = new SimpleUrl('?32,45');
119        $this->assertIdentical($url->getX(), 32);
120        $this->assertIdentical($url->getY(), 45);
121    }
122   
123    function testClearingCordinates() {
124        $url = new SimpleUrl('?32,45');
125        $url->setCoordinates();
126        $this->assertIdentical($url->getX(), false);
127        $this->assertIdentical($url->getY(), false);
128    }
129   
130    function testParsingParameterCordinateMixture() {
131        $url = new SimpleUrl('?a=A&b=&c?32,45');
132        $this->assertIdentical($url->getX(), 32);
133        $this->assertIdentical($url->getY(), 45);
134        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
135    }
136   
137    function testParsingParameterWithBadCordinates() {
138        $url = new SimpleUrl('?a=A&b=&c?32');
139        $this->assertIdentical($url->getX(), false);
140        $this->assertIdentical($url->getY(), false);
141        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32');
142    }
143   
144    function testPageSplitting() {
145        $url = new SimpleUrl('./here/../there/somewhere.php');
146        $this->assertEqual($url->getPath(), './here/../there/somewhere.php');
147        $this->assertEqual($url->getPage(), 'somewhere.php');
148        $this->assertEqual($url->getBasePath(), './here/../there/');
149    }
150   
151    function testAbsolutePathPageSplitting() {
152        $url = new SimpleUrl("http://host.com/here/there/somewhere.php");
153        $this->assertEqual($url->getPath(), "/here/there/somewhere.php");
154        $this->assertEqual($url->getPage(), "somewhere.php");
155        $this->assertEqual($url->getBasePath(), "/here/there/");
156    }
157   
158    function testSplittingUrlWithNoPageGivesEmptyPage() {
159        $url = new SimpleUrl('/here/there/');
160        $this->assertEqual($url->getPath(), '/here/there/');
161        $this->assertEqual($url->getPage(), '');
162        $this->assertEqual($url->getBasePath(), '/here/there/');
163    }
164   
165    function testPathNormalisation() {
166        $this->assertEqual(
167                SimpleUrl::normalisePath('https://host.com/I/am/here/../there/somewhere.php'),
168                'https://host.com/I/am/there/somewhere.php');
169    }
170
171    // regression test for #1535407
172    function testPathNormalisationWithSinglePeriod() {
173        $this->assertEqual(
174            SimpleUrl::normalisePath('https://host.com/I/am/here/./../there/somewhere.php'),
175            'https://host.com/I/am/there/somewhere.php');
176    }
177   
178    // regression test for #1852413
179    function testHostnameExtractedFromUContainingAtSign() {
180        $url = new SimpleUrl("http://localhost/name@example.com");
181        $this->assertEqual($url->getScheme(), "http");
182        $this->assertEqual($url->getUsername(), "");
183        $this->assertEqual($url->getPassword(), "");
184        $this->assertEqual($url->getHost(), "localhost");
185        $this->assertEqual($url->getPath(), "/name@example.com");
186    }
187
188    function testHostnameInLocalhost() {
189        $url = new SimpleUrl("http://localhost/name/example.com");
190        $this->assertEqual($url->getScheme(), "http");
191        $this->assertEqual($url->getUsername(), "");
192        $this->assertEqual($url->getPassword(), "");
193        $this->assertEqual($url->getHost(), "localhost");
194        $this->assertEqual($url->getPath(), "/name/example.com");
195    }
196
197    function testUsernameAndPasswordAreUrlDecoded() {
198        $url = new SimpleUrl('http://' . urlencode('test@test') .
199                ':' . urlencode('$!£@*&%') . '@www.lastcraft.com');
200        $this->assertEqual($url->getUsername(), 'test@test');
201        $this->assertEqual($url->getPassword(), '$!£@*&%');
202    }
203   
204    function testBlitz() {
205        $this->assertUrl(
206                "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor",
207                array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"),
208                array("a" => "1", "b" => "2"));
209        $this->assertUrl(
210                "username:password@www.somewhere.com/this/that/here.php?a=1",
211                array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false),
212                array("a" => "1"));
213        $this->assertUrl(
214                "username:password@somewhere.com:243?1,2",
215                array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false),
216                array(),
217                array(1, 2));
218        $this->assertUrl(
219                "https://www.somewhere.com",
220                array("https", false, false, "www.somewhere.com", false, "/", "com", "", false));
221        $this->assertUrl(
222                "username@www.somewhere.com:243#anchor",
223                array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor"));
224        $this->assertUrl(
225                "/this/that/here.php?a=1&b=2?3,4",
226                array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false),
227                array("a" => "1", "b" => "2"),
228                array(3, 4));
229        $this->assertUrl(
230                "username@/here.php?a=1&b=2",
231                array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false),
232                array("a" => "1", "b" => "2"));
233    }
234   
235    function testAmbiguousHosts() {
236        $this->assertUrl(
237                "tigger",
238                array(false, false, false, false, false, "tigger", false, "", false));
239        $this->assertUrl(
240                "/tigger",
241                array(false, false, false, false, false, "/tigger", false, "", false));
242        $this->assertUrl(
243                "//tigger",
244                array(false, false, false, "tigger", false, "/", false, "", false));
245        $this->assertUrl(
246                "//tigger/",
247                array(false, false, false, "tigger", false, "/", false, "", false));
248        $this->assertUrl(
249                "tigger.com",
250                array(false, false, false, "tigger.com", false, "/", "com", "", false));
251        $this->assertUrl(
252                "me.net/tigger",
253                array(false, false, false, "me.net", false, "/tigger", "net", "", false));
254    }
255   
256    function testAsString() {
257        $this->assertPreserved('https://www.here.com');
258        $this->assertPreserved('http://me:secret@www.here.com');
259        $this->assertPreserved('http://here/there');
260        $this->assertPreserved('http://here/there?a=A&b=B');
261        $this->assertPreserved('http://here/there?a=1&a=2');
262        $this->assertPreserved('http://here/there?a=1&a=2?9,8');
263        $this->assertPreserved('http://host?a=1&a=2');
264        $this->assertPreserved('http://host#stuff');
265        $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6');
266        $this->assertPreserved('http://www.here.com/?a=A__b=B');
267    }
268   
269    function assertUrl($raw, $parts, $params = false, $coords = false) {
270        if (! is_array($params)) {
271            $params = array();
272        }
273        $url = new SimpleUrl($raw);
274        $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s");
275        $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s");
276        $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s");
277        $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s");
278        $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s");
279        $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s");
280        $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s");
281        $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s");
282        $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s");
283        if ($coords) {
284            $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s");
285            $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s");
286        }
287    }
288   
289    function testUrlWithTwoSlashesInPath() {
290        $url = new SimpleUrl('/article/categoryedit/insert//');
291        $this->assertEqual($url->getPath(), '/article/categoryedit/insert//');
292    }
293   
294    function assertPreserved($string) {
295        $url = new SimpleUrl($string);
296        $this->assertEqual($url->asString(), $string);
297    }
298}
299
300class TestOfAbsoluteUrls extends UnitTestCase {
301   
302        function testDirectoriesAfterFilename() {
303                $string = '../../index.php/foo/bar';
304                $url = new SimpleUrl($string);
305                $this->assertEqual($url->asString(), $string);
306               
307                $absolute = $url->makeAbsolute('http://www.domain.com/some/path/');
308                $this->assertEqual($absolute->asString(), 'http://www.domain.com/index.php/foo/bar');
309        }
310
311    function testMakingAbsolute() {
312        $url = new SimpleUrl('../there/somewhere.php');
313        $this->assertEqual($url->getPath(), '../there/somewhere.php');
314        $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/');
315        $this->assertEqual($absolute->getScheme(), 'https');
316        $this->assertEqual($absolute->getHost(), 'host.com');
317        $this->assertEqual($absolute->getPort(), 1234);
318        $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php');
319    }
320   
321    function testMakingAnEmptyUrlAbsolute() {
322        $url = new SimpleUrl('');
323        $this->assertEqual($url->getPath(), '');
324        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
325        $this->assertEqual($absolute->getScheme(), 'http');
326        $this->assertEqual($absolute->getHost(), 'host.com');
327        $this->assertEqual($absolute->getPath(), '/I/am/here/page.html');
328    }
329   
330    function testMakingAnEmptyUrlAbsoluteWithMissingPageName() {
331        $url = new SimpleUrl('');
332        $this->assertEqual($url->getPath(), '');
333        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
334        $this->assertEqual($absolute->getScheme(), 'http');
335        $this->assertEqual($absolute->getHost(), 'host.com');
336        $this->assertEqual($absolute->getPath(), '/I/am/here/');
337    }
338   
339    function testMakingAShortQueryUrlAbsolute() {
340        $url = new SimpleUrl('?a#b');
341        $this->assertEqual($url->getPath(), '');
342        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
343        $this->assertEqual($absolute->getScheme(), 'http');
344        $this->assertEqual($absolute->getHost(), 'host.com');
345        $this->assertEqual($absolute->getPath(), '/I/am/here/');
346        $this->assertEqual($absolute->getEncodedRequest(), '?a');
347        $this->assertEqual($absolute->getFragment(), 'b');
348    }
349   
350    function testMakingADirectoryUrlAbsolute() {
351        $url = new SimpleUrl('hello/');
352        $this->assertEqual($url->getPath(), 'hello/');
353        $this->assertEqual($url->getBasePath(), 'hello/');
354        $this->assertEqual($url->getPage(), '');
355        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
356        $this->assertEqual($absolute->getPath(), '/I/am/here/hello/');
357    }
358   
359    function testMakingARootUrlAbsolute() {
360        $url = new SimpleUrl('/');
361        $this->assertEqual($url->getPath(), '/');
362        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
363        $this->assertEqual($absolute->getPath(), '/');
364    }
365   
366    function testMakingARootPageUrlAbsolute() {
367        $url = new SimpleUrl('/here.html');
368        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
369        $this->assertEqual($absolute->getPath(), '/here.html');
370    }
371   
372    function testCarryAuthenticationFromRootPage() {
373        $url = new SimpleUrl('here.html');
374        $absolute = $url->makeAbsolute('http://test:secret@host.com/');
375        $this->assertEqual($absolute->getPath(), '/here.html');
376        $this->assertEqual($absolute->getUsername(), 'test');
377        $this->assertEqual($absolute->getPassword(), 'secret');
378    }
379   
380    function testMakingCoordinateUrlAbsolute() {
381        $url = new SimpleUrl('?1,2');
382        $this->assertEqual($url->getPath(), '');
383        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
384        $this->assertEqual($absolute->getScheme(), 'http');
385        $this->assertEqual($absolute->getHost(), 'host.com');
386        $this->assertEqual($absolute->getPath(), '/I/am/here/');
387        $this->assertEqual($absolute->getX(), 1);
388        $this->assertEqual($absolute->getY(), 2);
389    }
390   
391    function testMakingAbsoluteAppendedPath() {
392        $url = new SimpleUrl('./there/somewhere.php');
393        $absolute = $url->makeAbsolute('https://host.com/here/');
394        $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
395    }
396   
397    function testMakingAbsoluteBadlyFormedAppendedPath() {
398        $url = new SimpleUrl('there/somewhere.php');
399        $absolute = $url->makeAbsolute('https://host.com/here/');
400        $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
401    }
402   
403    function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() {
404        $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f');
405        $absolute = $url->makeAbsolute('http://host.com/here/');
406        $this->assertEqual($absolute->getScheme(), 'https');
407        $this->assertEqual($absolute->getUsername(), 'test');
408        $this->assertEqual($absolute->getPassword(), 'secret');
409        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
410        $this->assertEqual($absolute->getPort(), 321);
411        $this->assertEqual($absolute->getPath(), '/stuff/');
412        $this->assertEqual($absolute->getEncodedRequest(), '?a=1');
413        $this->assertEqual($absolute->getFragment(), 'f');
414    }
415   
416    function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() {
417        $url = new SimpleUrl('https://www.lastcraft.com');
418        $absolute = $url->makeAbsolute('http://test:secret@host.com/here/');
419        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
420        $this->assertEqual($absolute->getUsername(), 'test');
421        $this->assertEqual($absolute->getPassword(), 'secret');
422    }
423   
424    function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() {
425        $url = new SimpleUrl('http://www.lastcraft.com');
426        $absolute = $url->makeAbsolute('https://host.com:81/here/');
427        $this->assertEqual($absolute->getScheme(), 'http');
428        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
429        $this->assertIdentical($absolute->getPort(), false);
430        $this->assertEqual($absolute->getPath(), '/');
431    }
432}
433
434class TestOfFrameUrl extends UnitTestCase {
435   
436    function testTargetAttachment() {
437        $url = new SimpleUrl('http://www.site.com/home.html');
438        $this->assertIdentical($url->getTarget(), false);
439        $url->setTarget('A frame');
440        $this->assertIdentical($url->getTarget(), 'A frame');
441    }
442}
443?>
Note: See TracBrowser for help on using the repository browser.