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