X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fdispatch_misc.t;h=2924a9d5b3ef921ca7455b5b40947413d69d8668;hb=e5250d96fc8320272ab2ddc39b445649f980815f;hp=0c11f2c117d4eb2e4a2e34ad3868c17b56cbaa0b;hpb=1a0ea82a1487934f4d8a4bbc67138a148eb74b13;p=catagits%2FWeb-Simple.git diff --git a/t/dispatch_misc.t b/t/dispatch_misc.t index 0c11f2c..2924a9d 100644 --- a/t/dispatch_misc.t +++ b/t/dispatch_misc.t @@ -7,6 +7,7 @@ use Test::More; use HTTP::Request::Common qw(GET POST); use Web::Dispatch; use HTTP::Response; +use Web::Dispatch::Predicates 'match_true'; my @dispatch; @@ -21,13 +22,14 @@ my $app = MiscTest->new; sub run_request { $app->run_test_request( @_ ); } app_is_non_plack(); +app_is_object(); plack_app_return(); broken_route_def(); -array_with_sub(); -array_with_no_sub(); +invalid_psgi_responses(); middleware_as_only_route(); route_returns_middleware_plus_extra(); route_returns_undef(); +matcher_nonsub_pair(); done_testing(); @@ -35,7 +37,7 @@ sub app_is_non_plack { my $r = HTTP::Response->new( 999 ); - my $d = Web::Dispatch->new( app => $r ); + my $d = Web::Dispatch->new( dispatch_app => $r ); eval { $d->call }; like $@, qr/No idea how we got here with HTTP::Response/, @@ -43,6 +45,20 @@ sub app_is_non_plack { undef $@; } +sub app_is_object { + { + + package ObjectApp; + use Moo; + sub to_app { [ 999, [], ["ok"] ] } + } + + my $d = Web::Dispatch->new( dispatch_object => ObjectApp->new ); + my $res = $d->call; + + cmp_ok $res->[0], '==', 999, "Web::Dispatch can dispatch properly, given only an object with to_app method"; +} + sub plack_app_return { { @@ -78,35 +94,26 @@ sub broken_route_def { like $get->content, qr[No idea how we got here with /], "the error message points out the broken definition"; } -sub array_with_sub { - @dispatch = ( - sub (/) { - [ - sub { - [ 999, [], [""] ]; - }, - ]; - } - ); - - eval { run_request( GET => 'http://localhost/' ) }; - - like $@, qr/Can't call method "request" on an undefined value .*MockHTTP/, -"if a route returns an arrayref with a single sub in it, then that sub is returned as a response by WD, causing HTTP::Message::PSGI to choke"; -} +sub invalid_psgi_responses { + undef $@; -sub array_with_no_sub { - @dispatch = ( - sub (/) { - ["moo"]; - } + my @responses = ( + [ [ sub { } ], "an arrayref with a single sub in it" ], + [ ["moo"], "an arrayref with a scalar that is not a sub" ], + [ bless( {}, "FauxObject" ), "an object without to_app method" ], ); - eval { run_request( GET => 'http://localhost/' ) }; + for my $response ( @responses ) { + @dispatch = ( sub (/) { $response->[0] } ); - like $@, qr/Can't call method "request" on an undefined value .*MockHTTP/, -"if a route returns an arrayref with a scalar that is not a sub, then WD returns that array out of the PSGI app (and causes HTTP::Message::PSGI to choke)"; - undef $@; + eval { run_request( GET => 'http://localhost/' ) }; + + like $@, qr/Can't call method "request" on an undefined value .*MockHTTP/, + sprintf( + "if a route returns %s, then that is returned as a response by WD, causing HTTP::Message::PSGI to choke", + $response->[1] ); + undef $@; + } } sub middleware_as_only_route { @@ -155,3 +162,13 @@ sub route_returns_undef { cmp_ok $get->code, '==', 900, "a route that returns undef causes WD to ignore it and resume dispatching"; } + +sub matcher_nonsub_pair { + @dispatch = ( match_true() => 5 ); + + my $get = run_request( GET => 'http://localhost/' ); + + cmp_ok $get->code, '==', 500, "a route definition that pairs a WD::Matcher a non-sub dies"; + like $get->content, qr[No idea how we got here with Web::Dispatch::M], + "the error message points out the broken definition"; +}