lets see if we can silence the error strawberry perl is upchucking
[catagits/Catalyst-Runtime.git] / t / query_constraints.t
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;
44   use Types::Standard 'slurpy';
45   use MyApp::Types qw/Dict Tuple Int StrMatch HashRef ArrayRef Enum UserId  Heart/;
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
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   
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
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
177 done_testing;