Commit | Line | Data |
fbcc39ad |
1 | use strict; |
2 | use warnings; |
2689f8a4 |
3 | use FindBin qw/$Bin/; |
4 | use lib "$FindBin::Bin/../lib"; |
62b64711 |
5 | use Test::More; |
fbcc39ad |
6 | use URI; |
7 | |
2689f8a4 |
8 | use_ok('TestApp'); |
fbcc39ad |
9 | |
fa32ac82 |
10 | my $request = Catalyst::Request->new( { |
11 | base => URI->new('http://127.0.0.1/foo') |
12 | } ); |
2689f8a4 |
13 | my $dispatcher = TestApp->dispatcher; |
14 | my $context = TestApp->new( { |
fa32ac82 |
15 | request => $request, |
16 | namespace => 'yada', |
17 | } ); |
fbcc39ad |
18 | |
19 | is( |
20 | Catalyst::uri_for( $context, '/bar/baz' )->as_string, |
21 | 'http://127.0.0.1/foo/bar/baz', |
22 | 'URI for absolute path' |
23 | ); |
24 | |
25 | is( |
26 | Catalyst::uri_for( $context, 'bar/baz' )->as_string, |
27 | 'http://127.0.0.1/foo/yada/bar/baz', |
28 | 'URI for relative path' |
29 | ); |
30 | |
d3e7a648 |
31 | is( |
32 | Catalyst::uri_for( $context, '', 'arg1', 'arg2' )->as_string, |
33 | 'http://127.0.0.1/foo/yada/arg1/arg2', |
34 | 'URI for undef action with args' |
35 | ); |
36 | |
37 | |
fbcc39ad |
38 | is( Catalyst::uri_for( $context, '../quux' )->as_string, |
39 | 'http://127.0.0.1/foo/quux', 'URI for relative dot path' ); |
fdba7a9d |
40 | |
8327e2e2 |
41 | is( |
42 | Catalyst::uri_for( $context, 'quux', { param1 => 'value1' } )->as_string, |
43 | 'http://127.0.0.1/foo/yada/quux?param1=value1', |
44 | 'URI for undef action with query params' |
45 | ); |
46 | |
57e74a1e |
47 | is (Catalyst::uri_for( $context, '/bar/wibble?' )->as_string, |
48 | 'http://127.0.0.1/foo/bar/wibble%3F', 'Question Mark gets encoded' |
49 | ); |
5d50f369 |
50 | |
57e74a1e |
51 | is( Catalyst::uri_for( $context, qw/bar wibble?/, 'with space' )->as_string, |
52 | 'http://127.0.0.1/foo/yada/bar/wibble%3F/with%20space', 'Space gets encoded' |
53 | ); |
54 | |
f0417b32 |
55 | is( |
56 | Catalyst::uri_for( $context, '/bar', 'with+plus', { 'also' => 'with+plus' })->as_string, |
57 | 'http://127.0.0.1/foo/bar/with+plus?also=with%2Bplus', |
58 | 'Plus is not encoded' |
59 | ); |
57e74a1e |
60 | |
5a8e2ba0 |
61 | TODO: { |
62 | local $TODO = 'broken by 5.7008'; |
63 | is( |
64 | Catalyst::uri_for( $context, '/bar#fragment', { param1 => 'value1' } )->as_string, |
65 | 'http://127.0.0.1/foo/bar?param1=value1#fragment', |
66 | 'URI for path with fragment and query params' |
67 | ); |
68 | } |
69 | |
5789a3d8 |
70 | # test with utf-8 |
71 | is( |
72 | Catalyst::uri_for( $context, 'quux', { param1 => "\x{2620}" } )->as_string, |
73 | 'http://127.0.0.1/foo/yada/quux?param1=%E2%98%A0', |
74 | 'URI for undef action with query params in unicode' |
75 | ); |
2f381252 |
76 | is( |
77 | Catalyst::uri_for( $context, 'quux', { 'param:1' => "foo" } )->as_string, |
78 | 'http://127.0.0.1/foo/yada/quux?param%3A1=foo', |
79 | 'URI for undef action with query params in unicode' |
80 | ); |
5789a3d8 |
81 | |
fbb513f7 |
82 | # test with object |
83 | is( |
84 | Catalyst::uri_for( $context, 'quux', { param1 => $request->base } )->as_string, |
85 | 'http://127.0.0.1/foo/yada/quux?param1=http%3A%2F%2F127.0.0.1%2Ffoo', |
86 | 'URI for undef action with query param as object' |
87 | ); |
88 | |
fa32ac82 |
89 | $request->base( URI->new('http://localhost:3000/') ); |
90 | $request->match( 'orderentry/contract' ); |
fdba7a9d |
91 | is( |
92 | Catalyst::uri_for( $context, '/Orderentry/saveContract' )->as_string, |
93 | 'http://localhost:3000/Orderentry/saveContract', |
94 | 'URI for absolute path' |
95 | ); |
bdcb95ef |
96 | |
97 | { |
fa32ac82 |
98 | $request->base( URI->new('http://127.0.0.1/') ); |
bdcb95ef |
99 | |
fa32ac82 |
100 | $context->namespace(''); |
bdcb95ef |
101 | |
102 | is( Catalyst::uri_for( $context, '/bar/baz' )->as_string, |
103 | 'http://127.0.0.1/bar/baz', 'URI with no base or match' ); |
fcea752e |
104 | |
105 | # test "0" as the path |
106 | is( Catalyst::uri_for( $context, qw/0 foo/ )->as_string, |
107 | 'http://127.0.0.1/0/foo', '0 as path is ok' |
108 | ); |
109 | |
bdcb95ef |
110 | } |
5789a3d8 |
111 | |
d0f0fcf6 |
112 | # test with undef -- no warnings should be thrown |
113 | { |
114 | my $warnings = 0; |
115 | local $SIG{__WARN__} = sub { $warnings++ }; |
116 | |
117 | Catalyst::uri_for( $context, '/bar/baz', { foo => undef } )->as_string, |
118 | is( $warnings, 0, "no warnings emitted" ); |
119 | } |
120 | |
7a2295bc |
121 | # Test with parameters '/', 'foo', 'bar' - should not generate a // |
122 | is( Catalyst::uri_for( $context, qw| / foo bar | )->as_string, |
123 | 'http://127.0.0.1/foo/bar', 'uri is /foo/bar, not //foo/bar' |
124 | ); |
125 | |
6a99f9e6 |
126 | TODO: { |
127 | local $TODO = 'RFCs are for people who, erm - fix this test..'; |
1b5227a1 |
128 | # Test rfc3986 reserved characters. These characters should all be escaped |
129 | # according to the RFC, but it is a very big feature change so I've removed it |
6a99f9e6 |
130 | no warnings; # Yes, everything in qw is sane |
131 | is( |
132 | Catalyst::uri_for( $context, qw|! * ' ( ) ; : @ & = $ / ? % # [ ] ,|, )->as_string, |
1b5227a1 |
133 | 'http://127.0.0.1/%21/%2A/%27/%2B/%29/%3B/%3A/%40/%26/%3D/%24/%2C/%2F/%3F/%25/%23/%5B/%5D', |
134 | 'rfc 3986 reserved characters' |
135 | ); |
1b5227a1 |
136 | |
294773ca |
137 | # jshirley bug - why the hell does only one of these get encoded |
138 | # has been like this forever however. |
139 | is( |
140 | Catalyst::uri_for( $context, qw|{1} {2}| )->as_string, |
141 | 'http://127.0.0.1/{1}/{2}', |
142 | 'not-escaping unreserved characters' |
143 | ); |
144 | } |
6a99f9e6 |
145 | |
1f851263 |
146 | # make sure caller's query parameter hash isn't messed up |
147 | { |
148 | my $query_params_base = {test => "one two", |
149 | bar => ["foo baz", "bar"]}; |
150 | my $query_params_test = {test => "one two", |
151 | bar => ["foo baz", "bar"]}; |
152 | Catalyst::uri_for($context, '/bar/baz', $query_params_test); |
153 | is_deeply($query_params_base, $query_params_test, |
154 | "uri_for() doesn't mess up query parameter hash in the caller"); |
155 | } |
62b64711 |
156 | |
2689f8a4 |
157 | |
158 | { |
159 | my $path_action = $dispatcher->get_action_by_path( |
160 | '/action/path/six' |
161 | ); |
162 | |
163 | # 5.80018 is only encoding the first of the / in the arg. |
164 | is( |
165 | Catalyst::uri_for( $context, $path_action, 'foo/bar/baz' )->as_string, |
166 | 'http://127.0.0.1/action/path/six/foo%2Fbar%2Fbaz', |
167 | 'Escape all forward slashes in args as %2F' |
168 | ); |
169 | } |
170 | |
76cd735d |
171 | { |
172 | my $index_not_private = $dispatcher->get_action_by_path( |
173 | '/action/chained/argsorder/index' |
174 | ); |
175 | |
176 | is( |
177 | Catalyst::uri_for( $context, $index_not_private )->as_string, |
178 | 'http://127.0.0.1/argsorder', |
179 | 'Return non-DispatchType::Index path for index action with args' |
180 | ); |
181 | } |
62b64711 |
182 | |
183 | done_testing; |
184 | |