first pass
[catagits/Catalyst-Runtime.git] / t / query_constraints.t
index 0eba004..81e3e1d 100644 (file)
@@ -41,7 +41,8 @@ BEGIN {
 
   use Moose;
   use MooseX::MethodAttributes;
-  use MyApp::Types qw/Tuple Int Str StrMatch ArrayRef Enum UserId  Heart/;
+  use Types::Standard 'slurpy';
+  use MyApp::Types qw/Dict Tuple Int StrMatch HashRef ArrayRef Enum UserId  Heart/;
 
   extends 'Catalyst::Controller';
 
@@ -51,6 +52,23 @@ BEGIN {
     $c->res->body("page ${\$c->req->query_parameters->{page}}, user ${\$c->req->query_parameters->{user}[1]}");
   }
 
+  sub user_slurps :Local Args(1)
+   Query(page=>Int,user=>Tuple[Enum['a','b'],Int],...) {
+    my ($self, $c, $int) = @_;
+    $c->res->body("page ${\$c->req->query_parameters->{page}}, user ${\$c->req->query_parameters->{user}[1]}");
+  }
+
+  sub string_types :Local Query(q=>'Str',age=>'Int') { pop->res->body('string_type') }
+  sub as_ref :Local Query(Dict[age=>Int,sex=>Enum['f','m','o'], slurpy HashRef[Int]]) { pop->res->body('as_ref') }
+
+  sub utf8 :Local Query(utf8=>Heart) { pop->res->body("heart") }
+
+  sub chain :Chained(/) CaptureArgs(0) Query(age=>Int,...) { }
+
+    sub big :Chained(chain) PathPart('') Args(0) Query(size=>Int,...) { pop->res->body('big') }
+    sub small :Chained(chain) PathPart('') Args(0) Query(size=>UserId,...) { pop->res->body('small') }
+  
   sub default :Default {
     my ($self, $c, $int) = @_;
     $c->res->body('default');
@@ -71,4 +89,89 @@ use Catalyst::Test 'MyApp';
   is $res->content, 'page 10, user 100';
 }
 
+{
+  my $res = request '/user/1?page=10&user=d&user=100';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/user/1?page=string&user=a&user=100';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/user/1?page=10&user=a&user=100&foo=bar';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/user/1?page=10&user=a&user=100&user=bar';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/user_slurps/1?page=10&user=a&user=100&foo=bar';
+  is $res->content, 'page 10, user 100';
+}
+
+{
+  my $res = request '/string_types?q=sssss&age=10';
+  is $res->content, 'string_type';
+}
+
+{
+  my $res = request '/string_types?w=sssss&age=10';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/string_types?q=sssss&age=string';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/as_ref?q=sssss&age=string';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/as_ref?age=10&sex=o&foo=bar&baz=bot';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/as_ref?age=10&sex=o&foo=122&baz=300';
+  is $res->content, 'as_ref';
+}
+
+{
+  my $res = request '/utf8?utf8=♥';
+  is $res->content, 'heart';
+}
+
+{
+  my $res = request '/chain?age=string&size=2';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/chain?age=string&size=string';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/chain?age=50&size=string';
+  is $res->content, 'default';
+}
+
+{
+  my $res = request '/chain?age=10&size=100';
+  is $res->content, 'big';
+}
+
+{
+  my $res = request '/chain?age=10&size=2';
+  is $res->content, 'small';
+}
+
 done_testing;