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( { |
7c1c4dc6 |
11 | _log => Catalyst::Log->new, |
fa32ac82 |
12 | base => URI->new('http://127.0.0.1/foo') |
13 | } ); |
2689f8a4 |
14 | my $dispatcher = TestApp->dispatcher; |
15 | my $context = TestApp->new( { |
fa32ac82 |
16 | request => $request, |
17 | namespace => 'yada', |
18 | } ); |
fbcc39ad |
19 | |
20 | is( |
21 | Catalyst::uri_for( $context, '/bar/baz' )->as_string, |
22 | 'http://127.0.0.1/foo/bar/baz', |
23 | 'URI for absolute path' |
24 | ); |
25 | |
26 | is( |
27 | Catalyst::uri_for( $context, 'bar/baz' )->as_string, |
28 | 'http://127.0.0.1/foo/yada/bar/baz', |
29 | 'URI for relative path' |
30 | ); |
31 | |
d3e7a648 |
32 | is( |
33 | Catalyst::uri_for( $context, '', 'arg1', 'arg2' )->as_string, |
34 | 'http://127.0.0.1/foo/yada/arg1/arg2', |
35 | 'URI for undef action with args' |
36 | ); |
37 | |
38 | |
fbcc39ad |
39 | is( Catalyst::uri_for( $context, '../quux' )->as_string, |
40 | 'http://127.0.0.1/foo/quux', 'URI for relative dot path' ); |
fdba7a9d |
41 | |
8327e2e2 |
42 | is( |
43 | Catalyst::uri_for( $context, 'quux', { param1 => 'value1' } )->as_string, |
44 | 'http://127.0.0.1/foo/yada/quux?param1=value1', |
45 | 'URI for undef action with query params' |
46 | ); |
47 | |
57e74a1e |
48 | is (Catalyst::uri_for( $context, '/bar/wibble?' )->as_string, |
49 | 'http://127.0.0.1/foo/bar/wibble%3F', 'Question Mark gets encoded' |
50 | ); |
5d50f369 |
51 | |
57e74a1e |
52 | is( Catalyst::uri_for( $context, qw/bar wibble?/, 'with space' )->as_string, |
53 | 'http://127.0.0.1/foo/yada/bar/wibble%3F/with%20space', 'Space gets encoded' |
54 | ); |
55 | |
f0417b32 |
56 | is( |
57 | Catalyst::uri_for( $context, '/bar', 'with+plus', { 'also' => 'with+plus' })->as_string, |
58 | 'http://127.0.0.1/foo/bar/with+plus?also=with%2Bplus', |
59 | 'Plus is not encoded' |
60 | ); |
57e74a1e |
61 | |
3a6d7f15 |
62 | is( |
901b4331 |
63 | Catalyst::uri_for( $context, '/bar', 'with space', { 'also with' => 'space here' })->as_string, |
64 | 'http://127.0.0.1/foo/bar/with%20space?also+with=space+here', |
65 | 'Spaces encoded correctly' |
66 | ); |
67 | |
68 | is( |
3a6d7f15 |
69 | Catalyst::uri_for( $context, '/bar#fragment', { param1 => 'value1' } )->as_string, |
02336198 |
70 | 'http://127.0.0.1/foo/bar?param1=value1#fragment', |
9d1f9508 |
71 | 'URI for path with fragment and query params 1' |
3a6d7f15 |
72 | ); |
5a8e2ba0 |
73 | |
9d1f9508 |
74 | is( |
3662b13e |
75 | Catalyst::uri_for( $context, '/bar', { param1 => 'value1' }, \'fragment' )->as_string, |
76 | 'http://127.0.0.1/foo/bar?param1=value1#fragment', |
77 | 'URI for path with fragment and query params 1' |
78 | ); |
79 | |
80 | is( |
7064f69b |
81 | Catalyst::uri_for( $context, '0#fragment', { param1 => 'value1' } )->as_string, |
82 | 'http://127.0.0.1/foo/yada/0?param1=value1#fragment', |
83 | 'URI for path 0 with fragment and query params 1' |
84 | ); |
85 | |
86 | is( |
9d1f9508 |
87 | Catalyst::uri_for( $context, '/bar#fragment^%$', { param1 => 'value1' } )->as_string, |
02336198 |
88 | 'http://127.0.0.1/foo/bar?param1=value1#fragment^%$', |
9d1f9508 |
89 | 'URI for path with fragment and query params 3' |
90 | ); |
91 | |
6b9f9ef7 |
92 | is( |
02336198 |
93 | Catalyst::uri_for( $context, '/foo#bar/baz', { param1 => 'value1' } )->as_string, |
94 | 'http://127.0.0.1/foo/foo?param1=value1#bar/baz', |
95 | 'URI for path with fragment and query params 3' |
6b9f9ef7 |
96 | ); |
97 | |
1f8714f6 |
98 | is( |
950282bc |
99 | Catalyst::uri_for( 'TestApp', '/bar/baz' )->as_string, |
100 | '/bar/baz', |
101 | 'URI for absolute path, called with only class name' |
102 | ); |
103 | |
104 | ## relative action (or path) doesn't make sense when calling as class method |
105 | # is( |
106 | # Catalyst::uri_for( 'TestApp', 'bar/baz' )->as_string, |
107 | # '/yada/bar/baz', |
108 | # 'URI for relative path, called with only class name' |
109 | # ); |
110 | |
111 | is( |
112 | Catalyst::uri_for( 'TestApp', '/', 'arg1', 'arg2' )->as_string, |
113 | '/arg1/arg2', |
114 | 'URI for root action with args, called with only class name' |
115 | ); |
116 | |
117 | ## relative action (or path) doesn't make sense when calling as class method |
118 | # is( Catalyst::uri_for( 'TestApp', '../quux' )->as_string, |
119 | # '/quux', 'URI for relative dot path, called with only class name' ); |
120 | |
121 | is( |
122 | Catalyst::uri_for( 'TestApp', '/quux', { param1 => 'value1' } )->as_string, |
123 | '/quux?param1=value1', |
124 | 'URI for quux action with query params, called with only class name' |
125 | ); |
126 | |
127 | is (Catalyst::uri_for( 'TestApp', '/bar/wibble?' )->as_string, |
128 | '/bar/wibble%3F', 'Question Mark gets encoded, called with only class name' |
129 | ); |
130 | |
131 | ## relative action (or path) doesn't make sense when calling as class method |
132 | # is( Catalyst::uri_for( 'TestApp', qw/bar wibble?/, 'with space' )->as_string, |
133 | # '/yada/bar/wibble%3F/with%20space', 'Space gets encoded, called with only class name' |
134 | # ); |
135 | |
136 | is( |
137 | Catalyst::uri_for( 'TestApp', '/bar', 'with+plus', { 'also' => 'with+plus' })->as_string, |
138 | '/bar/with+plus?also=with%2Bplus', |
139 | 'Plus is not encoded, called with only class name' |
140 | ); |
141 | |
901b4331 |
142 | is( |
143 | Catalyst::uri_for( 'TestApp', '/bar', 'with space', { 'also with' => 'space here' })->as_string, |
144 | '/bar/with%20space?also+with=space+here', |
145 | 'Spaces encoded correctly, called with only class name' |
146 | ); |
147 | |
5a8e2ba0 |
148 | TODO: { |
149 | local $TODO = 'broken by 5.7008'; |
150 | is( |
151 | Catalyst::uri_for( $context, '/bar#fragment', { param1 => 'value1' } )->as_string, |
152 | 'http://127.0.0.1/foo/bar?param1=value1#fragment', |
153 | 'URI for path with fragment and query params' |
154 | ); |
155 | } |
156 | |
5789a3d8 |
157 | # test with utf-8 |
158 | is( |
159 | Catalyst::uri_for( $context, 'quux', { param1 => "\x{2620}" } )->as_string, |
160 | 'http://127.0.0.1/foo/yada/quux?param1=%E2%98%A0', |
161 | 'URI for undef action with query params in unicode' |
162 | ); |
2f381252 |
163 | is( |
164 | Catalyst::uri_for( $context, 'quux', { 'param:1' => "foo" } )->as_string, |
165 | 'http://127.0.0.1/foo/yada/quux?param%3A1=foo', |
166 | 'URI for undef action with query params in unicode' |
167 | ); |
5789a3d8 |
168 | |
fbb513f7 |
169 | # test with object |
170 | is( |
171 | Catalyst::uri_for( $context, 'quux', { param1 => $request->base } )->as_string, |
172 | 'http://127.0.0.1/foo/yada/quux?param1=http%3A%2F%2F127.0.0.1%2Ffoo', |
173 | 'URI for undef action with query param as object' |
a8020c62 |
174 | ); |
175 | |
176 | # test with empty arg |
177 | { |
178 | my @warnings; |
179 | local $SIG{__WARN__} = sub { push @warnings, @_ }; |
180 | is( |
181 | Catalyst::uri_for( $context )->as_string, |
182 | 'http://127.0.0.1/foo/yada', |
183 | 'URI with no action' |
184 | ); |
7064f69b |
185 | |
186 | is( |
187 | Catalyst::uri_for( $context, 0 )->as_string, |
188 | 'http://127.0.0.1/foo/yada/0', |
189 | 'URI with 0 path' |
190 | ); |
191 | |
a8020c62 |
192 | is_deeply(\@warnings, [], "No warnings with no path argument"); |
193 | } |
fbb513f7 |
194 | |
fa32ac82 |
195 | $request->base( URI->new('http://localhost:3000/') ); |
196 | $request->match( 'orderentry/contract' ); |
fdba7a9d |
197 | is( |
198 | Catalyst::uri_for( $context, '/Orderentry/saveContract' )->as_string, |
199 | 'http://localhost:3000/Orderentry/saveContract', |
200 | 'URI for absolute path' |
201 | ); |
bdcb95ef |
202 | |
203 | { |
fa32ac82 |
204 | $request->base( URI->new('http://127.0.0.1/') ); |
bdcb95ef |
205 | |
fa32ac82 |
206 | $context->namespace(''); |
bdcb95ef |
207 | |
208 | is( Catalyst::uri_for( $context, '/bar/baz' )->as_string, |
209 | 'http://127.0.0.1/bar/baz', 'URI with no base or match' ); |
fcea752e |
210 | |
211 | # test "0" as the path |
212 | is( Catalyst::uri_for( $context, qw/0 foo/ )->as_string, |
213 | 'http://127.0.0.1/0/foo', '0 as path is ok' |
214 | ); |
215 | |
bdcb95ef |
216 | } |
5789a3d8 |
217 | |
d0f0fcf6 |
218 | # test with undef -- no warnings should be thrown |
219 | { |
220 | my $warnings = 0; |
221 | local $SIG{__WARN__} = sub { $warnings++ }; |
222 | |
223 | Catalyst::uri_for( $context, '/bar/baz', { foo => undef } )->as_string, |
224 | is( $warnings, 0, "no warnings emitted" ); |
225 | } |
226 | |
7a2295bc |
227 | # Test with parameters '/', 'foo', 'bar' - should not generate a // |
228 | is( Catalyst::uri_for( $context, qw| / foo bar | )->as_string, |
229 | 'http://127.0.0.1/foo/bar', 'uri is /foo/bar, not //foo/bar' |
230 | ); |
231 | |
6a99f9e6 |
232 | TODO: { |
233 | local $TODO = 'RFCs are for people who, erm - fix this test..'; |
1b5227a1 |
234 | # Test rfc3986 reserved characters. These characters should all be escaped |
235 | # according to the RFC, but it is a very big feature change so I've removed it |
6a99f9e6 |
236 | no warnings; # Yes, everything in qw is sane |
237 | is( |
238 | Catalyst::uri_for( $context, qw|! * ' ( ) ; : @ & = $ / ? % # [ ] ,|, )->as_string, |
1b5227a1 |
239 | 'http://127.0.0.1/%21/%2A/%27/%2B/%29/%3B/%3A/%40/%26/%3D/%24/%2C/%2F/%3F/%25/%23/%5B/%5D', |
240 | 'rfc 3986 reserved characters' |
241 | ); |
1b5227a1 |
242 | |
294773ca |
243 | # jshirley bug - why the hell does only one of these get encoded |
244 | # has been like this forever however. |
245 | is( |
246 | Catalyst::uri_for( $context, qw|{1} {2}| )->as_string, |
247 | 'http://127.0.0.1/{1}/{2}', |
248 | 'not-escaping unreserved characters' |
249 | ); |
250 | } |
6a99f9e6 |
251 | |
1f851263 |
252 | # make sure caller's query parameter hash isn't messed up |
253 | { |
254 | my $query_params_base = {test => "one two", |
255 | bar => ["foo baz", "bar"]}; |
256 | my $query_params_test = {test => "one two", |
257 | bar => ["foo baz", "bar"]}; |
258 | Catalyst::uri_for($context, '/bar/baz', $query_params_test); |
259 | is_deeply($query_params_base, $query_params_test, |
260 | "uri_for() doesn't mess up query parameter hash in the caller"); |
261 | } |
62b64711 |
262 | |
2689f8a4 |
263 | |
264 | { |
265 | my $path_action = $dispatcher->get_action_by_path( |
266 | '/action/path/six' |
267 | ); |
268 | |
269 | # 5.80018 is only encoding the first of the / in the arg. |
270 | is( |
271 | Catalyst::uri_for( $context, $path_action, 'foo/bar/baz' )->as_string, |
272 | 'http://127.0.0.1/action/path/six/foo%2Fbar%2Fbaz', |
273 | 'Escape all forward slashes in args as %2F' |
274 | ); |
275 | } |
276 | |
76cd735d |
277 | { |
278 | my $index_not_private = $dispatcher->get_action_by_path( |
279 | '/action/chained/argsorder/index' |
280 | ); |
281 | |
282 | is( |
283 | Catalyst::uri_for( $context, $index_not_private )->as_string, |
284 | 'http://127.0.0.1/argsorder', |
285 | 'Return non-DispatchType::Index path for index action with args' |
286 | ); |
287 | } |
62b64711 |
288 | |
0ee04045 |
289 | { |
290 | package MyStringThing; |
291 | |
292 | use overload '""' => sub { $_[0]->{string} }, fallback => 1; |
293 | } |
62b64711 |
294 | |
0ee04045 |
295 | is( |
296 | Catalyst::uri_for( $context, bless( { string => 'test' }, 'MyStringThing' ) ), |
297 | 'http://127.0.0.1/test', |
298 | 'overloaded object handled correctly' |
299 | ); |
300 | |
3662b13e |
301 | is( |
302 | Catalyst::uri_for( $context, bless( { string => 'test' }, 'MyStringThing' ), \'fragment' ), |
303 | 'http://127.0.0.1/test#fragment', |
304 | 'overloaded object handled correctly' |
305 | ); |
306 | |
0ee04045 |
307 | done_testing; |