1use utf8; 2use ExtUtils::testlib; 3use Test2::V0; 4use URI::Fast qw(uri); 5 6my @uris = ( 7 '/foo/bar/baz', 8 'http://www.test.com', 9 'https://test.com/some/path?aaaa=bbbb&cccc=dddd&eeee=ffff', 10 'https://user:pwd@192.168.0.1:8000/foo/bar?baz=bat&slack=fnord&asdf=the+quick%20brown+fox+%26+hound#foofrag', 11); 12 13ok(uri($_), "uri: $_") foreach @uris; 14 15is uri(undef), '', 'undef'; 16is uri(''), '', 'empty string'; 17 18is uri('/foo')->scheme, '', 'missing scheme'; 19is uri('http:'), 'http:', 'non-file scheme w/o host'; 20is uri('http://test'), 'http://test', 'auth w/ invalid host'; 21 22is uri('http://usr:pwd')->usr, '', 'no usr w/o @'; 23is uri('http://usr:pwd')->pwd, '', 'no pwd w/o @'; 24is uri('http://usr:pwd')->host, 'usr', 'host w/ invalid port'; 25is uri('http://usr:pwd')->port, 'pwd', 'invalid port number'; 26 27is uri('#')->frag, '', 'fragment empty but starts with #'; 28 29subtest 'param' => sub{ 30 is uri('?')->param('foo'), undef, 'empty query'; 31 is uri('?foo')->param('foo'), undef, 'query key w/o =value'; 32 is uri('?foo=')->param('foo'), '', 'query key w/o value'; 33 is uri('?=bar')->param('foo'), undef, 'query =value w/o key && request key ne value'; 34 is uri('?=bar')->param('bar'), undef, 'query =value w/o key && request key eq value'; 35 is uri('?=')->param('foo'), undef, 'query w/ = but w/o key or value'; 36 is uri('???')->param('??'), undef, 'multiple question marks'; 37 is uri('?food=bard&foo=bar')->param('foo'), 'bar', 'substring match'; 38 39 subtest 'edge cases' => sub{ 40 subtest 'bad input: unencoded = in query param value' => sub{ 41 my $q = '?url=http%3A%2F%2Fwww.example.com%2Fsome%2Fpath%3Fencparam=fnord&foo=bar'; 42 my $u = uri $q; 43 is scalar($u->param('url')), 'http://www.example.com/some/path?encparam=fnord', 'invalid param'; 44 is scalar($u->param('foo')), 'bar', 'valid param'; 45 }; 46 }; 47}; 48 49subtest 'query_hash' => sub{ 50 is uri('?')->query_hash, hash{ end }, 'empty query'; 51 is uri('?foo')->query_hash, hash{ field 'foo' => array{ end }; end }, 'query key w/o =value'; 52 is uri('?foo')->query_hash, hash{ field 'foo' => array{ end }; end }, 'query key w/o =value'; 53 is uri('?foo=')->query_hash, hash{ field 'foo' => array{ item ''; end }; end }, 'query key w/o value'; 54 is uri('?=bar')->query_hash, hash{ end }, 'query =value w/o key'; 55 is uri('?=')->query_hash, hash{ end }, 'query w/ = but w/o key or value'; 56 is uri('???')->query_hash, hash{ field '??' => array{ end }; end }, 'multiple question marks'; 57}; 58 59subtest 'split_path' => sub{ 60 is uri('//foo/baz.png')->split_path, array{ 61 item 'baz.png'; 62 end; 63 }, 'double leading slashes'; 64 65 is uri('/foo/bar/')->split_path, array{ 66 item 'foo'; 67 item 'bar'; 68 end; 69 }, 'trailing slash'; 70 71 is uri('/foo/bar//')->split_path, array{ 72 item 'foo'; 73 item 'bar'; 74 item ''; 75 end; 76 }, 'double trailing slashes'; 77 78 is uri('/foo//bar')->split_path, array{ 79 item 'foo'; 80 item ''; 81 item 'bar'; 82 end; 83 }, 'double internal slashes'; 84}; 85 86done_testing; 87