optional PathPart and PathPart+Args tests for ChildOf
[catagits/Catalyst-Runtime.git] / t / lib / TestApp / Controller / Action / ChildOf.pm
1 package TestApp::Controller::Action::ChildOf;
2
3 use strict;
4 use warnings;
5
6 use base qw/Catalyst::Controller/;
7
8 sub begin :Private { }
9
10 #
11 #   TODO
12 #   :ChildOf('') defaulting to controller namespace
13 #   :ChildOf('..') defaulting to action in controller above
14 #   :ChildOf == ChildOf('/')
15 #
16
17 #
18 #   Simple parent/child action test
19 #
20 sub foo  :PathPart('childof/foo')  :Captures(1) :ChildOf('/') { }
21 sub endpoint  :PathPart('end')  :ChildOf('/action/childof/foo')  :Args(1) { }
22
23 #
24 #   Parent/child test with two args each
25 #
26 sub foo2 :PathPart('childof/foo2') :Captures(2) :ChildOf('/') { }
27 sub endpoint2 :PathPart('end2') :ChildOf('/action/childof/foo2') :Args(2) { }
28
29 #
30 #   Relative specification of parent action
31 #
32 sub bar :PathPart('childof/bar') :ChildOf('/') :Captures(0) { }
33 sub finale :PathPart('') :ChildOf('bar') :Args { }
34
35 #
36 #   three chain with concurrent endpoints
37 #
38 sub one   :PathPart('childof/one') :ChildOf('/')                   :Captures(1) { }
39 sub two   :PathPart('two')         :ChildOf('/action/childof/one') :Captures(2) { }
40 sub three_end :PathPart('three')       :ChildOf('two') :Args(3) { }
41 sub one_end   :PathPart('childof/one') :ChildOf('/')   :Args(1) { }
42 sub two_end   :PathPart('two')         :ChildOf('one') :Args(2) { }
43
44 #
45 #   Dispatch on number of arguments
46 #
47 sub multi1 :PathPart('childof/multi') :ChildOf('/') :Args(1) { }
48 sub multi2 :PathPart('childof/multi') :ChildOf('/') :Args(2) { }
49
50 #
51 #   Roots in an action defined in a higher controller
52 #
53 sub higher_root :PathPart('bar') :ChildOf('/action/childof/foo/higher_root') :Args(1) { }
54
55 #
56 #   Controller -> subcontroller -> controller
57 #
58 sub pcp1 :PathPart('childof/pcp1')  :ChildOf('/')                        :Captures(1) { }
59 sub pcp3 :ChildOf('/action/childof/foo/pcp2') :Args(1)     { }
60
61 #
62 #   Dispatch on capture number
63 #
64 sub multi_cap1 :PathPart('childof/multi_cap') :ChildOf('/') :Captures(1) { }
65 sub multi_cap2 :PathPart('childof/multi_cap') :ChildOf('/') :Captures(2) { }
66 sub multi_cap_end1 :PathPart('baz') :ChildOf('multi_cap1') :Args(0) { }
67 sub multi_cap_end2 :PathPart('baz') :ChildOf('multi_cap2') :Args(0) { }
68
69 #
70 #   Priority: Slurpy args vs. chained actions
71 #
72 sub priority_a1 :PathPart('childof/priority_a') :ChildOf('/') :Args { }
73 sub priority_a2 :PathPart('childof/priority_a') :ChildOf('/') :Captures(1) { }
74 sub priority_a2_end :PathPart('end') :ChildOf('priority_a2') :Args(1) { }
75
76 #
77 #   Priority: Fixed args vs. chained actions
78 #
79 sub priority_b1 :PathPart('childof/priority_b') :ChildOf('/') :Args(3) { }
80 sub priority_b2 :PathPart('childof/priority_b') :ChildOf('/') :Captures(1) { }
81 sub priority_b2_end :PathPart('end') :ChildOf('priority_b2') :Args(1) { }
82
83 #
84 #   Optional specification of :Args in endpoint
85 #
86 sub opt_args :PathPart('childof/opt_args') :ChildOf('/') { }
87
88 #
89 #   Optional PathPart test -> /childof/optpp/*/opt_pathpart/*
90 #
91 sub opt_pp_start :ChildOf('/') :PathPart('childof/optpp') :Captures(1) { }
92 sub opt_pathpart :ChildOf('opt_pp_start') :Args(1) { }
93
94 #
95 #   Optional Args *and* PathPart -> /childof/optall/*/oa/...
96 #
97 sub opt_all_start :ChildOf('/') :PathPart('childof/optall') :Captures(1) { }
98 sub oa :ChildOf('opt_all_start') { }
99
100 sub end :Private {
101   my ($self, $c) = @_;
102   my $out = join('; ', map { join(', ', @$_) }
103                          ($c->req->captures, $c->req->args));
104   $c->res->body($out);
105 }
106
107 1;