Commit | Line | Data |
8748abc5 |
1 | use warnings; |
2 | use strict; |
3 | use HTTP::Request::Common; |
4 | use utf8; |
5 | |
6 | BEGIN { |
7 | use Test::More; |
8 | eval "use Type::Tiny 1.000005; 1" || do { |
9 | plan skip_all => "Trouble loading Type::Tiny and friends => $@"; |
10 | }; |
11 | } |
12 | |
13 | BEGIN { |
14 | package MyApp::Types; |
15 | $INC{'MyApp/Types.pm'} = __FILE__; |
16 | |
17 | use strict; |
18 | use warnings; |
19 | |
20 | use Type::Utils -all; |
21 | use Types::Standard -types; |
22 | use Type::Library |
23 | -base, |
24 | -declare => qw( UserId Heart ); |
25 | |
26 | extends "Types::Standard"; |
27 | |
28 | declare UserId, |
29 | as Int, |
30 | where { $_ < 5 }; |
31 | |
32 | declare Heart, |
33 | as Str, |
34 | where { $_ eq '♥' }; |
35 | |
36 | } |
37 | |
38 | { |
39 | package MyApp::Controller::Root; |
40 | $INC{'MyApp/Controller/Root.pm'} = __FILE__; |
41 | |
42 | use Moose; |
43 | use MooseX::MethodAttributes; |
25ca36c2 |
44 | use Types::Standard 'slurpy'; |
45 | use MyApp::Types qw/Dict Tuple Int StrMatch HashRef ArrayRef Enum UserId Heart/; |
8748abc5 |
46 | |
47 | extends 'Catalyst::Controller'; |
48 | |
49 | sub user :Local Args(1) |
50 | Query(page=>Int,user=>Tuple[Enum['a','b'],Int]) { |
51 | my ($self, $c, $int) = @_; |
52 | $c->res->body("page ${\$c->req->query_parameters->{page}}, user ${\$c->req->query_parameters->{user}[1]}"); |
53 | } |
54 | |
25ca36c2 |
55 | sub user_slurps :Local Args(1) |
56 | Query(page=>Int,user=>Tuple[Enum['a','b'],Int],...) { |
57 | my ($self, $c, $int) = @_; |
58 | $c->res->body("page ${\$c->req->query_parameters->{page}}, user ${\$c->req->query_parameters->{user}[1]}"); |
59 | } |
60 | |
61 | sub string_types :Local Query(q=>'Str',age=>'Int') { pop->res->body('string_type') } |
62 | |
63 | sub as_ref :Local Query(Dict[age=>Int,sex=>Enum['f','m','o'], slurpy HashRef[Int]]) { pop->res->body('as_ref') } |
64 | |
65 | sub utf8 :Local Query(utf8=>Heart) { pop->res->body("heart") } |
66 | |
67 | sub chain :Chained(/) CaptureArgs(0) Query(age=>Int,...) { } |
68 | |
69 | sub big :Chained(chain) PathPart('') Args(0) Query(size=>Int,...) { pop->res->body('big') } |
70 | sub small :Chained(chain) PathPart('') Args(0) Query(size=>UserId,...) { pop->res->body('small') } |
71 | |
8748abc5 |
72 | sub default :Default { |
73 | my ($self, $c, $int) = @_; |
74 | $c->res->body('default'); |
75 | } |
76 | |
77 | MyApp::Controller::Root->config(namespace=>''); |
78 | |
79 | package MyApp; |
80 | use Catalyst; |
81 | |
82 | MyApp->setup; |
83 | } |
84 | |
85 | use Catalyst::Test 'MyApp'; |
86 | |
87 | { |
88 | my $res = request '/user/1?page=10&user=a&user=100'; |
89 | is $res->content, 'page 10, user 100'; |
90 | } |
91 | |
25ca36c2 |
92 | { |
93 | my $res = request '/user/1?page=10&user=d&user=100'; |
94 | is $res->content, 'default'; |
95 | } |
96 | |
97 | { |
98 | my $res = request '/user/1?page=string&user=a&user=100'; |
99 | is $res->content, 'default'; |
100 | } |
101 | |
102 | { |
103 | my $res = request '/user/1?page=10&user=a&user=100&foo=bar'; |
104 | is $res->content, 'default'; |
105 | } |
106 | |
107 | { |
108 | my $res = request '/user/1?page=10&user=a&user=100&user=bar'; |
109 | is $res->content, 'default'; |
110 | } |
111 | |
112 | { |
113 | my $res = request '/user_slurps/1?page=10&user=a&user=100&foo=bar'; |
114 | is $res->content, 'page 10, user 100'; |
115 | } |
116 | |
117 | { |
118 | my $res = request '/string_types?q=sssss&age=10'; |
119 | is $res->content, 'string_type'; |
120 | } |
121 | |
122 | { |
123 | my $res = request '/string_types?w=sssss&age=10'; |
124 | is $res->content, 'default'; |
125 | } |
126 | |
127 | { |
128 | my $res = request '/string_types?q=sssss&age=string'; |
129 | is $res->content, 'default'; |
130 | } |
131 | |
132 | { |
133 | my $res = request '/as_ref?q=sssss&age=string'; |
134 | is $res->content, 'default'; |
135 | } |
136 | |
137 | { |
138 | my $res = request '/as_ref?age=10&sex=o&foo=bar&baz=bot'; |
139 | is $res->content, 'default'; |
140 | } |
141 | |
142 | { |
143 | my $res = request '/as_ref?age=10&sex=o&foo=122&baz=300'; |
144 | is $res->content, 'as_ref'; |
145 | } |
146 | |
147 | { |
148 | my $res = request '/utf8?utf8=♥'; |
149 | is $res->content, 'heart'; |
150 | } |
151 | |
152 | { |
153 | my $res = request '/chain?age=string&size=2'; |
154 | is $res->content, 'default'; |
155 | } |
156 | |
157 | { |
158 | my $res = request '/chain?age=string&size=string'; |
159 | is $res->content, 'default'; |
160 | } |
161 | |
162 | { |
163 | my $res = request '/chain?age=50&size=string'; |
164 | is $res->content, 'default'; |
165 | } |
166 | |
167 | { |
168 | my $res = request '/chain?age=10&size=100'; |
169 | is $res->content, 'big'; |
170 | } |
171 | |
172 | { |
173 | my $res = request '/chain?age=10&size=2'; |
174 | is $res->content, 'small'; |
175 | } |
176 | |
8748abc5 |
177 | done_testing; |