preserve $c->state
[catagits/Catalyst-Runtime.git] / t / query_constraints.t
CommitLineData
8748abc5 1use warnings;
2use strict;
3use HTTP::Request::Common;
4use utf8;
5
6BEGIN {
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
13BEGIN {
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
85use 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 177done_testing;