use warnings;
use strict;
+use HTTP::Request::Common;
+use utf8;
BEGIN {
use Test::More;
- eval "use Types::Standard; 1;" || do {
- plan skip_all => "Trouble loading Types::Standard => $@";
+ eval "use Type::Tiny 1.000005; 1" || do {
+ plan skip_all => "Trouble loading Type::Tiny and friends => $@";
};
+}
+BEGIN {
package MyApp::Types;
$INC{'MyApp/Types.pm'} = __FILE__;
use Types::Standard -types;
use Type::Library
-base,
- -declare => qw( UserId User ContextLike );
+ -declare => qw( UserId Heart User ContextLike );
extends "Types::Standard";
as Int,
where { $_ < 5 };
+ declare Heart,
+ as Str,
+ where { $_ eq '♥' };
+
# Tests using this are skipped pending deeper thought
coerce User,
from ContextLike,
use Moose;
use MooseX::MethodAttributes;
- use MyApp::Types qw/Tuple Int Str StrMatch ArrayRef UserId User/;
+ use MyApp::Types qw/Tuple Int Str StrMatch ArrayRef UserId User Heart/;
extends 'Catalyst::Controller';
$c->res->body("name: $user->{name}, age: $user->{age}");
}
+ sub stringy_enum :Local Args('Int',Int) {
+ my ($self, $c) = @_;
+ $c->res->body('enum');
+ }
+
sub an_int :Local Args(Int) {
my ($self, $c, $int) = @_;
$c->res->body('an_int');
sub chain_base :Chained(/) CaptureArgs(1) { }
- sub any_priority_chain :Chained(chain_base) PathPart('') Args(1) { $_[1]->res->body('any_priority_chain') }
+ sub any_priority_chain :GET Chained(chain_base) PathPart('') Args(1) { $_[1]->res->body('any_priority_chain') }
sub int_priority_chain :Chained(chain_base) PathPart('') Args(Int) { $_[1]->res->body('int_priority_chain') }
sub int_priority_link3 :Chained(link_tuple) PathPart('') Args(Int) { $_[1]->res->body('int_priority_link3') }
+ sub link2_int :Chained(link_tuple) PathPart('') CaptureArgs(UserId) { }
+
+ sub finally2 :GET Chained(link2_int) PathPart('') Args { $_[1]->res->body('finally2') }
+ sub finally :GET Chained(link2_int) PathPart('') Args(Int) { $_[1]->res->body('finally') }
+
+ sub chain_base2 :Chained(/) CaptureArgs(1) { }
+
+ sub chained_zero_again : Chained(chain_base2) PathPart('') Args(0) { $_[1]->res->body('chained_zero_again') }
+ sub chained_zero_post2 : Chained(chain_base2) PathPart('') Args(0) { $_[1]->res->body('chained_zero_post2') }
+ sub chained_zero2 : Chained(chain_base2) PathPart('') Args(0) { $_[1]->res->body('chained_zero2') }
+
+ sub chained_zero_post3 : Chained(chain_base2) PathPart('') Args(1) { $_[1]->res->body('chained_zero_post3') }
+ sub chained_zero3 : Chained(chain_base2) PathPart('') Args(1) { $_[1]->res->body('chained_zero3') }
+
+
+ sub heart :Local Args(Heart) { }
+
+ sub utf8_base :Chained(/) CaptureArgs(Heart) { }
+ sub utf8_end :Chained(utf8_base) PathPart('') Args(Heart) { }
sub default :Default {
my ($self, $c, $int) = @_;
is $res->content, 'default';
}
-#{
+{
+ my $res = request '/chain_base/1/2/3/3/3/6';
+ is $res->content, 'finally';
+}
+
+{
+ my $res = request '/chain_base/1/2/3/3/3/a';
+ is $res->content, 'finally2';
+}
+
+{
+ my $res = request '/chain_base/1/2/3/3/3/6/7/8/9';
+ is $res->content, 'finally2';
+}
+
+
+{
+ my $res = request PUT '/chain_base2/capture/1';
+ is $res->content, 'chained_zero3', "request PUT '/chain_base2/capture/1'";
+}
+
+{
+ my $res = request '/chain_base2/capture/1';
+ is $res->content, 'chained_zero3', "request '/chain_base2/capture/1'";
+}
+
+{
+ my $res = request POST '/chain_base2/capture/1';
+ is $res->content, 'chained_zero3', "request POST '/chain_base2/capture/1'";
+}
+
+{
+ my $res = request PUT '/chain_base2/capture';
+ is $res->content, 'chained_zero2', "request PUT '/chain_base2/capture'";
+}
+
+{
+ my $res = request '/chain_base2/capture';
+ is $res->content, 'chained_zero2', "request '/chain_base2/capture'";
+}
+
+{
+ my $res = request POST '/chain_base2/capture';
+ is $res->content, 'chained_zero2', "request POST '/chain_base2/capture'";
+}
+
+{
+ my $res = request '/stringy_enum/1/2';
+ is $res->content, 'enum', "request '/stringy_enum/a'";
+}
+
+{
+ my $res = request '/stringy_enum/b/2';
+ is $res->content, 'default', "request '/stringy_enum/a'";
+}
+
+{
+ my $res = request '/stringy_enum/1/a';
+ is $res->content, 'default', "request '/stringy_enum/a'";
+}
+
+=over
+
+| /chain_base/*/*/*/*/*/* | /chain_base (1)
+| | -> /link_tuple (Tuple[Int,Int,Int])
+| | -> /link2_int (UserId)
+| | => GET /finally (Int)
+
+=cut
+
+{
# URI testing
- #my ($res, $c) = ctx_request '/';
+ my ($res, $c) = ctx_request '/';
+
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('user'), 2) };
+ is $url, 'http://localhost/user/2';
+ }
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('user'), [2]) };
+ is $url, 'http://localhost/user/2';
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('user'), [20]) };
+ }
+
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('finally'), [1,2,3,4,4],6) };
+ is $url, 'http://localhost/chain_base/1/2/3/4/4/6';
+ }
-#}
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('finally'), [1,2,3,4,4,6]) };
+ is $url, 'http://localhost/chain_base/1/2/3/4/4/6';
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('finally'), [1,2,3,4,5,6]) };
+ }
+
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('finally'), ['a',2,3,4,4,6]) };
+ is $url, 'http://localhost/chain_base/a/2/3/4/4/6';
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('finally'), ['a','1',3,4,4,'a']) };
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('finally'), ['a','a',3,4,4,'6']) };
+ }
+
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('heart'), ['♥']) };
+ is $url, 'http://localhost/heart/%E2%99%A5';
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('heart'), ['1']) };
+ }
+
+ {
+ ok my $url = eval { $c->uri_for($c->controller('Root')->action_for('utf8_end'), ['♥','♥']) };
+ is $url, 'http://localhost/utf8_base/%E2%99%A5/%E2%99%A5';
+ }
+
+ {
+ ok my $url = ! eval { $c->uri_for($c->controller('Root')->action_for('utf8_end'), ['2','1']) };
+ }
+
+}
done_testing;