Commit | Line | Data |
141459fa |
1 | #!perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use FindBin; |
7 | use lib "$FindBin::Bin/lib"; |
8 | |
9 | our $iters; |
10 | |
11 | BEGIN { $iters = $ENV{CAT_BENCH_ITERS} || 2; } |
12 | |
8a6a6581 |
13 | use Test::More tests => 101*$iters; |
141459fa |
14 | use Catalyst::Test 'TestApp'; |
15 | |
16 | if ( $ENV{CAT_BENCHMARK} ) { |
17 | require Benchmark; |
18 | Benchmark::timethis( $iters, \&run_tests ); |
19 | } |
20 | else { |
21 | for ( 1 .. $iters ) { |
8a6a6581 |
22 | run_tests($_); |
141459fa |
23 | } |
24 | } |
922c58d6 |
25 | |
141459fa |
26 | sub run_tests { |
8a6a6581 |
27 | my ($run_number) = @_; |
d416846e |
28 | |
29 | # |
30 | # This is a simple test where the parent and child actions are |
31 | # within the same controller. |
32 | # |
141459fa |
33 | { |
34 | my @expected = qw[ |
5882c86e |
35 | TestApp::Controller::Action::Chained->begin |
36 | TestApp::Controller::Action::Chained->foo |
37 | TestApp::Controller::Action::Chained->endpoint |
38 | TestApp::Controller::Action::Chained->end |
141459fa |
39 | ]; |
922c58d6 |
40 | |
141459fa |
41 | my $expected = join( ", ", @expected ); |
922c58d6 |
42 | |
5882c86e |
43 | ok( my $response = request('http://localhost/chained/foo/1/end/2'), 'chained + local endpoint' ); |
141459fa |
44 | is( $response->header('X-Catalyst-Executed'), |
45 | $expected, 'Executed actions' ); |
46 | is( $response->content, '1; 2', 'Content OK' ); |
47 | } |
d416846e |
48 | |
49 | # |
50 | # This makes sure the above isn't found if the argument for the |
51 | # end action isn't supplied. |
52 | # |
53 | { |
54 | my $expected = undef; |
55 | |
5882c86e |
56 | ok( my $response = request('http://localhost/chained/foo/1/end'), |
57 | 'chained + local endpoint; missing last argument' ); |
d416846e |
58 | is( $response->header('X-Catalyst-Executed'), |
59 | $expected, 'Executed actions' ); |
60 | is( $response->header('Status'), 500, 'Status OK' ); |
61 | } |
62 | |
63 | # |
64 | # Tests the case when the child action is placed in a subcontroller. |
65 | # |
141459fa |
66 | { |
67 | my @expected = qw[ |
5882c86e |
68 | TestApp::Controller::Action::Chained->begin |
69 | TestApp::Controller::Action::Chained->foo |
70 | TestApp::Controller::Action::Chained::Foo->spoon |
71 | TestApp::Controller::Action::Chained->end |
141459fa |
72 | ]; |
922c58d6 |
73 | |
141459fa |
74 | my $expected = join( ", ", @expected ); |
922c58d6 |
75 | |
5882c86e |
76 | ok( my $response = request('http://localhost/chained/foo/1/spoon'), 'chained + subcontroller endpoint' ); |
141459fa |
77 | is( $response->header('X-Catalyst-Executed'), |
78 | $expected, 'Executed actions' ); |
79 | is( $response->content, '1; ', 'Content OK' ); |
80 | } |
d416846e |
81 | |
82 | # |
5882c86e |
83 | # Tests if the relative specification (e.g.: Chained('bar') ) works |
d416846e |
84 | # as expected. |
85 | # |
141459fa |
86 | { |
87 | my @expected = qw[ |
5882c86e |
88 | TestApp::Controller::Action::Chained->begin |
89 | TestApp::Controller::Action::Chained->bar |
90 | TestApp::Controller::Action::Chained->finale |
91 | TestApp::Controller::Action::Chained->end |
141459fa |
92 | ]; |
922c58d6 |
93 | |
141459fa |
94 | my $expected = join( ", ", @expected ); |
922c58d6 |
95 | |
5882c86e |
96 | ok( my $response = request('http://localhost/chained/bar/1/spoon'), 'chained + relative endpoint' ); |
141459fa |
97 | is( $response->header('X-Catalyst-Executed'), |
98 | $expected, 'Executed actions' ); |
99 | is( $response->content, '; 1, spoon', 'Content OK' ); |
100 | } |
d416846e |
101 | |
102 | # |
103 | # Just a test for multiple arguments. |
104 | # |
922c58d6 |
105 | { |
106 | my @expected = qw[ |
5882c86e |
107 | TestApp::Controller::Action::Chained->begin |
108 | TestApp::Controller::Action::Chained->foo2 |
109 | TestApp::Controller::Action::Chained->endpoint2 |
110 | TestApp::Controller::Action::Chained->end |
922c58d6 |
111 | ]; |
112 | |
113 | my $expected = join( ", ", @expected ); |
114 | |
5882c86e |
115 | ok( my $response = request('http://localhost/chained/foo2/10/20/end2/15/25'), |
116 | 'chained + local (2 args each)' ); |
922c58d6 |
117 | is( $response->header('X-Catalyst-Executed'), |
118 | $expected, 'Executed actions' ); |
119 | is( $response->content, '10, 20; 15, 25', 'Content OK' ); |
120 | } |
d416846e |
121 | |
122 | # |
123 | # The first three-chain test tries to call the action with :Args(1) |
1c34f703 |
124 | # specification. There's also a one action with a :CaptureArgs(1) |
d416846e |
125 | # attribute, that should not be dispatched to. |
126 | # |
922c58d6 |
127 | { |
128 | my @expected = qw[ |
5882c86e |
129 | TestApp::Controller::Action::Chained->begin |
130 | TestApp::Controller::Action::Chained->one_end |
131 | TestApp::Controller::Action::Chained->end |
922c58d6 |
132 | ]; |
133 | |
134 | my $expected = join( ", ", @expected ); |
135 | |
5882c86e |
136 | ok( my $response = request('http://localhost/chained/one/23'), |
922c58d6 |
137 | 'three-chain (only first)' ); |
138 | is( $response->header('X-Catalyst-Executed'), |
139 | $expected, 'Executed actions' ); |
140 | is( $response->content, '; 23', 'Content OK' ); |
141 | } |
d416846e |
142 | |
143 | # |
144 | # This is the second three-chain test, it goes for the action that |
145 | # handles "/one/$cap/two/$arg1/$arg2" paths. Should be the two action |
1c34f703 |
146 | # having :Args(2), not the one having :CaptureArgs(2). |
d416846e |
147 | # |
922c58d6 |
148 | { |
149 | my @expected = qw[ |
5882c86e |
150 | TestApp::Controller::Action::Chained->begin |
151 | TestApp::Controller::Action::Chained->one |
152 | TestApp::Controller::Action::Chained->two_end |
153 | TestApp::Controller::Action::Chained->end |
922c58d6 |
154 | ]; |
155 | |
156 | my $expected = join( ", ", @expected ); |
157 | |
5882c86e |
158 | ok( my $response = request('http://localhost/chained/one/23/two/23/46'), |
922c58d6 |
159 | 'three-chain (up to second)' ); |
160 | is( $response->header('X-Catalyst-Executed'), |
161 | $expected, 'Executed actions' ); |
162 | is( $response->content, '23; 23, 46', 'Content OK' ); |
163 | } |
d416846e |
164 | |
165 | # |
1c34f703 |
166 | # Last of the three-chain tests. Has no concurrent action with :CaptureArgs |
d416846e |
167 | # and is more thought to simply test the chain as a whole and the 'two' |
1c34f703 |
168 | # action specifying :CaptureArgs. |
d416846e |
169 | # |
922c58d6 |
170 | { |
171 | my @expected = qw[ |
5882c86e |
172 | TestApp::Controller::Action::Chained->begin |
173 | TestApp::Controller::Action::Chained->one |
174 | TestApp::Controller::Action::Chained->two |
175 | TestApp::Controller::Action::Chained->three_end |
176 | TestApp::Controller::Action::Chained->end |
922c58d6 |
177 | ]; |
178 | |
179 | my $expected = join( ", ", @expected ); |
180 | |
5882c86e |
181 | ok( my $response = request('http://localhost/chained/one/23/two/23/46/three/1/2/3'), |
922c58d6 |
182 | 'three-chain (all three)' ); |
183 | is( $response->header('X-Catalyst-Executed'), |
184 | $expected, 'Executed actions' ); |
185 | is( $response->content, '23, 23, 46; 1, 2, 3', 'Content OK' ); |
186 | } |
d416846e |
187 | |
188 | # |
189 | # Tests dispatching on number of arguments for :Args. This should be |
190 | # dispatched to the action expecting one argument. |
191 | # |
922c58d6 |
192 | { |
193 | my @expected = qw[ |
5882c86e |
194 | TestApp::Controller::Action::Chained->begin |
195 | TestApp::Controller::Action::Chained->multi1 |
196 | TestApp::Controller::Action::Chained->end |
922c58d6 |
197 | ]; |
198 | |
199 | my $expected = join( ", ", @expected ); |
200 | |
5882c86e |
201 | ok( my $response = request('http://localhost/chained/multi/23'), |
922c58d6 |
202 | 'multi-action (one arg)' ); |
203 | is( $response->header('X-Catalyst-Executed'), |
204 | $expected, 'Executed actions' ); |
205 | is( $response->content, '; 23', 'Content OK' ); |
206 | } |
d416846e |
207 | |
208 | # |
209 | # Belongs to the former test and goes for the action expecting two arguments. |
210 | # |
922c58d6 |
211 | { |
212 | my @expected = qw[ |
5882c86e |
213 | TestApp::Controller::Action::Chained->begin |
214 | TestApp::Controller::Action::Chained->multi2 |
215 | TestApp::Controller::Action::Chained->end |
922c58d6 |
216 | ]; |
217 | |
218 | my $expected = join( ", ", @expected ); |
219 | |
5882c86e |
220 | ok( my $response = request('http://localhost/chained/multi/23/46'), |
922c58d6 |
221 | 'multi-action (two args)' ); |
222 | is( $response->header('X-Catalyst-Executed'), |
223 | $expected, 'Executed actions' ); |
224 | is( $response->content, '; 23, 46', 'Content OK' ); |
225 | } |
d416846e |
226 | |
227 | # |
228 | # Dispatching on argument count again, this time we provide too many |
229 | # arguments, so dispatching should fail. |
230 | # |
231 | { |
232 | my $expected = undef; |
233 | |
5882c86e |
234 | ok( my $response = request('http://localhost/chained/multi/23/46/67'), |
d416846e |
235 | 'multi-action (three args, should lead to error)' ); |
236 | is( $response->header('X-Catalyst-Executed'), |
237 | $expected, 'Executed actions' ); |
238 | is( $response->header('Status'), 500, 'Status OK' ); |
239 | } |
240 | |
241 | # |
242 | # This tests the case when an action says it's the child of an action in |
243 | # a subcontroller. |
244 | # |
245 | { |
246 | my @expected = qw[ |
5882c86e |
247 | TestApp::Controller::Action::Chained->begin |
248 | TestApp::Controller::Action::Chained::Foo->higher_root |
249 | TestApp::Controller::Action::Chained->higher_root |
250 | TestApp::Controller::Action::Chained->end |
d416846e |
251 | ]; |
252 | |
253 | my $expected = join( ", ", @expected ); |
254 | |
5882c86e |
255 | ok( my $response = request('http://localhost/chained/higher_root/23/bar/11'), |
d416846e |
256 | 'root higher than child' ); |
257 | is( $response->header('X-Catalyst-Executed'), |
258 | $expected, 'Executed actions' ); |
259 | is( $response->content, '23; 11', 'Content OK' ); |
260 | } |
261 | |
262 | # |
263 | # Just a more complex version of the former test. It tests if a controller -> |
264 | # subcontroller -> controller dispatch works. |
265 | # |
266 | { |
267 | my @expected = qw[ |
5882c86e |
268 | TestApp::Controller::Action::Chained->begin |
269 | TestApp::Controller::Action::Chained->pcp1 |
270 | TestApp::Controller::Action::Chained::Foo->pcp2 |
271 | TestApp::Controller::Action::Chained->pcp3 |
272 | TestApp::Controller::Action::Chained->end |
d416846e |
273 | ]; |
274 | |
275 | my $expected = join( ", ", @expected ); |
276 | |
5882c86e |
277 | ok( my $response = request('http://localhost/chained/pcp1/1/pcp2/2/pcp3/3'), |
d416846e |
278 | 'parent -> child -> parent' ); |
279 | is( $response->header('X-Catalyst-Executed'), |
280 | $expected, 'Executed actions' ); |
281 | is( $response->content, '1, 2; 3', 'Content OK' ); |
282 | } |
283 | |
284 | # |
285 | # Tests dispatch on capture number. This test is for a one capture action. |
286 | # |
287 | { |
288 | my @expected = qw[ |
5882c86e |
289 | TestApp::Controller::Action::Chained->begin |
290 | TestApp::Controller::Action::Chained->multi_cap1 |
291 | TestApp::Controller::Action::Chained->multi_cap_end1 |
292 | TestApp::Controller::Action::Chained->end |
d416846e |
293 | ]; |
294 | |
295 | my $expected = join( ", ", @expected ); |
296 | |
5882c86e |
297 | ok( my $response = request('http://localhost/chained/multi_cap/1/baz'), |
d416846e |
298 | 'dispatch on capture num 1' ); |
299 | is( $response->header('X-Catalyst-Executed'), |
300 | $expected, 'Executed actions' ); |
301 | is( $response->content, '1; ', 'Content OK' ); |
302 | } |
303 | |
304 | # |
305 | # Belongs to the former test. This one goes for the action expecting two |
306 | # captures. |
307 | # |
308 | { |
309 | my @expected = qw[ |
5882c86e |
310 | TestApp::Controller::Action::Chained->begin |
311 | TestApp::Controller::Action::Chained->multi_cap2 |
312 | TestApp::Controller::Action::Chained->multi_cap_end2 |
313 | TestApp::Controller::Action::Chained->end |
d416846e |
314 | ]; |
315 | |
316 | my $expected = join( ", ", @expected ); |
317 | |
5882c86e |
318 | ok( my $response = request('http://localhost/chained/multi_cap/1/2/baz'), |
d416846e |
319 | 'dispatch on capture num 2' ); |
320 | is( $response->header('X-Catalyst-Executed'), |
321 | $expected, 'Executed actions' ); |
322 | is( $response->content, '1, 2; ', 'Content OK' ); |
323 | } |
324 | |
325 | # |
326 | # Tests the priority of a slurpy arguments action (with :Args) against |
327 | # two actions chained together. The two actions should win. |
328 | # |
329 | { |
330 | my @expected = qw[ |
5882c86e |
331 | TestApp::Controller::Action::Chained->begin |
332 | TestApp::Controller::Action::Chained->priority_a2 |
333 | TestApp::Controller::Action::Chained->priority_a2_end |
334 | TestApp::Controller::Action::Chained->end |
d416846e |
335 | ]; |
336 | |
337 | my $expected = join( ", ", @expected ); |
338 | |
5882c86e |
339 | ok( my $response = request('http://localhost/chained/priority_a/1/end/2'), |
d416846e |
340 | 'priority - slurpy args vs. parent/child' ); |
341 | is( $response->header('X-Catalyst-Executed'), |
342 | $expected, 'Executed actions' ); |
343 | is( $response->content, '1; 2', 'Content OK' ); |
344 | } |
345 | |
346 | # |
347 | # This belongs to the former test but tests if two chained actions have |
348 | # priority over an action with the exact arguments. |
349 | # |
350 | { |
351 | my @expected = qw[ |
5882c86e |
352 | TestApp::Controller::Action::Chained->begin |
353 | TestApp::Controller::Action::Chained->priority_b2 |
354 | TestApp::Controller::Action::Chained->priority_b2_end |
355 | TestApp::Controller::Action::Chained->end |
d416846e |
356 | ]; |
357 | |
358 | my $expected = join( ", ", @expected ); |
359 | |
5882c86e |
360 | ok( my $response = request('http://localhost/chained/priority_b/1/end/2'), |
d416846e |
361 | 'priority - fixed args vs. parent/child' ); |
362 | is( $response->header('X-Catalyst-Executed'), |
363 | $expected, 'Executed actions' ); |
364 | is( $response->content, '1; 2', 'Content OK' ); |
365 | } |
366 | |
367 | # |
b7ce908f |
368 | # This belongs to the former test but tests if two chained actions have |
369 | # priority over an action with one child action not having the Args() attr set. |
370 | # |
371 | { |
372 | my @expected = qw[ |
373 | TestApp::Controller::Action::Chained->begin |
374 | TestApp::Controller::Action::Chained->priority_c1 |
375 | TestApp::Controller::Action::Chained->priority_c2_xyz |
376 | TestApp::Controller::Action::Chained->end |
377 | ]; |
378 | |
379 | my $expected = join( ", ", @expected ); |
380 | |
381 | ok( my $response = request('http://localhost/chained/priority_c/1/xyz/'), |
382 | 'priority - no Args() order mismatch' ); |
383 | is( $response->header('X-Catalyst-Executed'), |
384 | $expected, 'Executed actions' ); |
385 | is( $response->content, '1; ', 'Content OK' ); |
386 | } |
387 | |
388 | # |
d416846e |
389 | # Test dispatching between two controllers that are on the same level and |
390 | # therefor have no parent/child relationship. |
391 | # |
392 | { |
393 | my @expected = qw[ |
5882c86e |
394 | TestApp::Controller::Action::Chained->begin |
395 | TestApp::Controller::Action::Chained::Bar->cross1 |
396 | TestApp::Controller::Action::Chained::Foo->cross2 |
397 | TestApp::Controller::Action::Chained->end |
d416846e |
398 | ]; |
399 | |
400 | my $expected = join( ", ", @expected ); |
401 | |
5882c86e |
402 | ok( my $response = request('http://localhost/chained/cross/1/end/2'), |
d416846e |
403 | 'cross controller w/o par/child relation' ); |
404 | is( $response->header('X-Catalyst-Executed'), |
405 | $expected, 'Executed actions' ); |
406 | is( $response->content, '1; 2', 'Content OK' ); |
407 | } |
b25353e5 |
408 | |
409 | # |
410 | # This is for testing if the arguments got passed to the actions |
411 | # correctly. |
412 | # |
413 | { |
414 | my @expected = qw[ |
5882c86e |
415 | TestApp::Controller::Action::Chained->begin |
416 | TestApp::Controller::Action::Chained::PassedArgs->first |
417 | TestApp::Controller::Action::Chained::PassedArgs->second |
418 | TestApp::Controller::Action::Chained::PassedArgs->third |
419 | TestApp::Controller::Action::Chained::PassedArgs->end |
b25353e5 |
420 | ]; |
421 | |
422 | my $expected = join( ", ", @expected ); |
423 | |
5882c86e |
424 | ok( my $response = request('http://localhost/chained/passedargs/a/1/b/2/c/3'), |
b25353e5 |
425 | 'Correct arguments passed to actions' ); |
426 | is( $response->header('X-Catalyst-Executed'), |
427 | $expected, 'Executed actions' ); |
428 | is( $response->content, '1; 2; 3', 'Content OK' ); |
429 | } |
47f9968d |
430 | |
431 | # |
432 | # The :Args attribute is optional, we check the action not specifying |
433 | # it with these tests. |
434 | # |
435 | { |
436 | my @expected = qw[ |
5882c86e |
437 | TestApp::Controller::Action::Chained->begin |
438 | TestApp::Controller::Action::Chained->opt_args |
439 | TestApp::Controller::Action::Chained->end |
47f9968d |
440 | ]; |
441 | |
442 | my $expected = join( ", ", @expected ); |
443 | |
5882c86e |
444 | ok( my $response = request('http://localhost/chained/opt_args/1/2/3'), |
47f9968d |
445 | 'Optional :Args attribute working' ); |
446 | is( $response->header('X-Catalyst-Executed'), |
447 | $expected, 'Executed actions' ); |
448 | is( $response->content, '; 1, 2, 3', 'Content OK' ); |
449 | } |
9cc84996 |
450 | |
451 | # |
452 | # Tests for optional PathPart attribute. |
453 | # |
454 | { |
455 | my @expected = qw[ |
5882c86e |
456 | TestApp::Controller::Action::Chained->begin |
457 | TestApp::Controller::Action::Chained->opt_pp_start |
458 | TestApp::Controller::Action::Chained->opt_pathpart |
459 | TestApp::Controller::Action::Chained->end |
9cc84996 |
460 | ]; |
461 | |
462 | my $expected = join( ", ", @expected ); |
463 | |
5882c86e |
464 | ok( my $response = request('http://localhost/chained/optpp/1/opt_pathpart/2'), |
9cc84996 |
465 | 'Optional :PathName attribute working' ); |
466 | is( $response->header('X-Catalyst-Executed'), |
467 | $expected, 'Executed actions' ); |
468 | is( $response->content, '1; 2', 'Content OK' ); |
469 | } |
470 | |
471 | # |
472 | # Tests for optional PathPart *and* Args attributes. |
473 | # |
474 | { |
475 | my @expected = qw[ |
5882c86e |
476 | TestApp::Controller::Action::Chained->begin |
477 | TestApp::Controller::Action::Chained->opt_all_start |
478 | TestApp::Controller::Action::Chained->oa |
479 | TestApp::Controller::Action::Chained->end |
9cc84996 |
480 | ]; |
481 | |
482 | my $expected = join( ", ", @expected ); |
483 | |
5882c86e |
484 | ok( my $response = request('http://localhost/chained/optall/1/oa/2/3'), |
9cc84996 |
485 | 'Optional :PathName *and* :Args attributes working' ); |
486 | is( $response->header('X-Catalyst-Executed'), |
487 | $expected, 'Executed actions' ); |
488 | is( $response->content, '1; 2, 3', 'Content OK' ); |
489 | } |
0e853a7f |
490 | |
491 | # |
492 | # Test if :Chained is the same as :Chained('/') |
493 | # |
494 | { |
495 | my @expected = qw[ |
496 | TestApp::Controller::Action::Chained->begin |
497 | TestApp::Controller::Action::Chained->rootdef |
498 | TestApp::Controller::Action::Chained->end |
499 | ]; |
500 | |
501 | my $expected = join( ", ", @expected ); |
502 | |
503 | ok( my $response = request('http://localhost/chained/rootdef/23'), |
504 | ":Chained is the same as :Chained('/')" ); |
505 | is( $response->header('X-Catalyst-Executed'), |
506 | $expected, 'Executed actions' ); |
507 | is( $response->content, '; 23', 'Content OK' ); |
508 | } |
509 | |
510 | # |
f88e7f69 |
511 | # Test if :Chained('.') is working |
0e853a7f |
512 | # |
513 | { |
514 | my @expected = qw[ |
515 | TestApp::Controller::Action::Chained->begin |
516 | TestApp::Controller::Action::Chained->parentchain |
517 | TestApp::Controller::Action::Chained::ParentChain->child |
518 | TestApp::Controller::Action::Chained->end |
519 | ]; |
520 | |
521 | my $expected = join( ", ", @expected ); |
522 | |
523 | ok( my $response = request('http://localhost/chained/parentchain/1/child/2'), |
524 | ":Chained('.') chains to parent controller action" ); |
525 | is( $response->header('X-Catalyst-Executed'), |
526 | $expected, 'Executed actions' ); |
527 | is( $response->content, '1; 2', 'Content OK' ); |
528 | } |
2349aeea |
529 | |
530 | # |
531 | # Test behaviour of auto actions returning '1' for the chain. |
532 | # |
533 | { |
534 | my @expected = qw[ |
535 | TestApp::Controller::Action::Chained->begin |
536 | TestApp::Controller::Action::Chained::Auto->auto |
537 | TestApp::Controller::Action::Chained::Auto::Foo->auto |
538 | TestApp::Controller::Action::Chained::Auto->foo |
539 | TestApp::Controller::Action::Chained::Auto::Foo->fooend |
540 | TestApp::Controller::Action::Chained->end |
541 | ]; |
542 | |
543 | my $expected = join( ", ", @expected ); |
544 | |
545 | ok( my $response = request('http://localhost/chained/autochain1/1/fooend/2'), |
546 | "Behaviour when auto returns 1 correct" ); |
547 | is( $response->header('X-Catalyst-Executed'), |
548 | $expected, 'Executed actions' ); |
549 | is( $response->content, '1; 2', 'Content OK' ); |
550 | } |
551 | |
552 | # |
553 | # Test behaviour of auto actions returning '0' for the chain. |
554 | # |
555 | { |
556 | my @expected = qw[ |
557 | TestApp::Controller::Action::Chained->begin |
558 | TestApp::Controller::Action::Chained::Auto->auto |
559 | TestApp::Controller::Action::Chained::Auto::Bar->auto |
560 | TestApp::Controller::Action::Chained->end |
561 | ]; |
562 | |
563 | my $expected = join( ", ", @expected ); |
564 | |
565 | ok( my $response = request('http://localhost/chained/autochain2/1/barend/2'), |
566 | "Behaviour when auto returns 0 correct" ); |
567 | is( $response->header('X-Catalyst-Executed'), |
568 | $expected, 'Executed actions' ); |
569 | is( $response->content, '1; 2', 'Content OK' ); |
570 | } |
571 | |
572 | # |
573 | # Test what auto actions are run when namespaces are changed |
574 | # horizontally. |
575 | # |
576 | { |
577 | my @expected = qw[ |
578 | TestApp::Controller::Action::Chained->begin |
579 | TestApp::Controller::Action::Chained::Auto->auto |
580 | TestApp::Controller::Action::Chained::Auto::Foo->auto |
581 | TestApp::Controller::Action::Chained::Auto::Bar->crossloose |
582 | TestApp::Controller::Action::Chained::Auto::Foo->crossend |
583 | TestApp::Controller::Action::Chained->end |
584 | ]; |
585 | |
586 | my $expected = join( ", ", @expected ); |
587 | |
588 | ok( my $response = request('http://localhost/chained/auto_cross/1/crossend/2'), |
589 | "Correct auto actions are run on cross controller dispatch" ); |
590 | is( $response->header('X-Catalyst-Executed'), |
591 | $expected, 'Executed actions' ); |
592 | is( $response->content, '1; 2', 'Content OK' ); |
593 | } |
594 | |
595 | # |
596 | # Test forwarding from auto action in chain dispatch. |
597 | # |
598 | { |
599 | my @expected = qw[ |
600 | TestApp::Controller::Action::Chained->begin |
601 | TestApp::Controller::Action::Chained::Auto->auto |
602 | TestApp::Controller::Action::Chained::Auto::Forward->auto |
603 | TestApp::Controller::Action::Chained::Auto->fw3 |
604 | TestApp::Controller::Action::Chained::Auto->fw1 |
605 | TestApp::Controller::Action::Chained::Auto::Forward->forwardend |
606 | TestApp::Controller::Action::Chained->end |
607 | ]; |
608 | |
609 | my $expected = join( ", ", @expected ); |
610 | |
611 | ok( my $response = request('http://localhost/chained/auto_forward/1/forwardend/2'), |
612 | "Forwarding out of auto in chain" ); |
613 | is( $response->header('X-Catalyst-Executed'), |
614 | $expected, 'Executed actions' ); |
615 | is( $response->content, '1; 2', 'Content OK' ); |
616 | } |
617 | |
618 | # |
619 | # Detaching out of the auto action of a chain. |
620 | # |
621 | { |
622 | my @expected = qw[ |
623 | TestApp::Controller::Action::Chained->begin |
624 | TestApp::Controller::Action::Chained::Auto->auto |
625 | TestApp::Controller::Action::Chained::Auto::Detach->auto |
626 | TestApp::Controller::Action::Chained::Auto->fw3 |
627 | TestApp::Controller::Action::Chained->end |
628 | ]; |
629 | |
630 | my $expected = join( ", ", @expected ); |
631 | |
632 | ok( my $response = request('http://localhost/chained/auto_detach/1/detachend/2'), |
633 | "Detaching out of auto in chain" ); |
634 | is( $response->header('X-Catalyst-Executed'), |
635 | $expected, 'Executed actions' ); |
636 | is( $response->content, '1; 2', 'Content OK' ); |
637 | } |
638 | |
639 | # |
640 | # Test forwarding from auto action in chain dispatch. |
641 | # |
642 | { |
643 | my $expected = undef; |
644 | |
645 | ok( my $response = request('http://localhost/chained/loose/23'), |
646 | "Loose end is not callable" ); |
647 | is( $response->header('X-Catalyst-Executed'), |
648 | $expected, 'Executed actions' ); |
649 | is( $response->header('Status'), 500, 'Status OK' ); |
650 | } |
651 | |
652 | # |
653 | # Test forwarding out of a chain. |
654 | # |
655 | { |
656 | my @expected = qw[ |
657 | TestApp::Controller::Action::Chained->begin |
658 | TestApp::Controller::Action::Chained->chain_fw_a |
659 | TestApp::Controller::Action::Chained->fw_dt_target |
660 | TestApp::Controller::Action::Chained->chain_fw_b |
661 | TestApp::Controller::Action::Chained->end |
662 | ]; |
663 | |
664 | my $expected = join( ", ", @expected ); |
665 | |
666 | ok( my $response = request('http://localhost/chained/chain_fw/1/end/2'), |
667 | "Forwarding out a chain" ); |
668 | is( $response->header('X-Catalyst-Executed'), |
669 | $expected, 'Executed actions' ); |
670 | is( $response->content, '1; 2', 'Content OK' ); |
671 | } |
672 | |
673 | # |
674 | # Test detaching out of a chain. |
675 | # |
676 | { |
677 | my @expected = qw[ |
678 | TestApp::Controller::Action::Chained->begin |
679 | TestApp::Controller::Action::Chained->chain_dt_a |
680 | TestApp::Controller::Action::Chained->fw_dt_target |
681 | TestApp::Controller::Action::Chained->end |
682 | ]; |
683 | |
684 | my $expected = join( ", ", @expected ); |
685 | |
686 | ok( my $response = request('http://localhost/chained/chain_dt/1/end/2'), |
687 | "Forwarding out a chain" ); |
688 | is( $response->header('X-Catalyst-Executed'), |
689 | $expected, 'Executed actions' ); |
690 | is( $response->content, '1; 2', 'Content OK' ); |
691 | } |
8a6a6581 |
692 | |
693 | # |
694 | # Test interception of recursive chains. This test was added because at |
695 | # one point during the :Chained development, Catalyst used to hang on |
696 | # recursive chains. |
697 | # |
698 | { |
699 | eval { require 'TestAppChainedRecursive.pm' }; |
05a90578 |
700 | if ($run_number == 1) { |
701 | ok( ! $@, "Interception of recursive chains" ); |
702 | } |
703 | else { pass( "Interception of recursive chains already tested" ) } |
8a6a6581 |
704 | } |
705 | |
706 | # |
707 | # Test failure of absolute path part arguments. |
708 | # |
709 | { |
710 | eval { require 'TestAppChainedAbsolutePathPart.pm' }; |
711 | if ($run_number == 1) { |
712 | like( $@, qr(foo/foo), |
713 | "Usage of absolute path part argument emits error" ); |
714 | } |
715 | else { pass( "Error on absolute path part arguments already tested" ) } |
716 | } |
141459fa |
717 | } |