added a test file that puts Web::Dispatch's coverage at 100%
Christian Walde [Wed, 2 Nov 2011 16:56:07 +0000 (17:56 +0100)]
t/dispatch_misc.t [new file with mode: 0644]

diff --git a/t/dispatch_misc.t b/t/dispatch_misc.t
new file mode 100644 (file)
index 0000000..094c76a
--- /dev/null
@@ -0,0 +1,157 @@
+use strict;
+use warnings FATAL => 'all';
+no warnings::illegalproto;
+
+use Test::More;
+
+use HTTP::Request::Common qw(GET POST);
+use Web::Dispatch;
+use HTTP::Response;
+
+my @dispatch;
+
+{
+    use Web::Simple 'MiscTest';
+
+    package MiscTest;
+    sub dispatch_request { @dispatch }
+}
+
+my $app = MiscTest->new;
+sub run_request { $app->run_test_request( @_ ); }
+
+app_is_non_plack();
+plack_app_return();
+broken_route_def();
+array_with_sub();
+array_with_no_sub();
+middleware_as_only_route();
+route_returns_middleware_plus_extra();
+route_returns_undef();
+
+done_testing();
+
+sub app_is_non_plack {
+
+    my $r = HTTP::Response->new( 999 );
+
+    my $d = Web::Dispatch->new( app => $r );
+    eval { $d->call };
+
+    like $@, qr/No idea how we got here with HTTP::Response/,
+      "Web::Dispatch dies when run with an app() that is a non-PSGI object";
+    undef $@;
+}
+
+sub plack_app_return {
+    {
+
+        package FauxPlackApp;
+        sub new { bless {}, $_[0] }
+
+        sub to_app {
+            return sub {
+                [ 999, [], [""] ];
+            };
+        }
+    }
+
+    @dispatch = (
+        sub (/) {
+            FauxPlackApp->new;
+        }
+    );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 999,
+      "when a route returns a thing that look like a Plack app, the web app redispatches to that thing";
+}
+
+sub broken_route_def {
+
+    @dispatch = ( '/' => "" );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 500, "a route definition by hash that doesn't pair a sub with a route dies";
+    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, [], [""] ];
+                },
+            ];
+        }
+    );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 999,
+      "if a route returns an arrayref with a single sub in it, then WD redispatches to that sub";
+}
+
+sub array_with_no_sub {
+    @dispatch = (
+        sub (/) {
+            ["moo"];
+        }
+    );
+
+    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 scalar that is not a sub, then WD returns that array out of the PSGI app (and causes HTTP::Message::PSGI to choke)";
+    undef $@;
+}
+
+sub middleware_as_only_route {
+    @dispatch = ( bless {}, "Plack::Middleware" );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 500, "a route definition consisting of only a middleware causes a bail";
+    like $get->content, qr[Multiple results but first one is a middleware \(Plack::Middleware=],
+      "the error message mentions the middleware class";
+}
+
+sub route_returns_middleware_plus_extra {
+    @dispatch = (
+        sub (/) {
+            return ( bless( {}, "Plack::Middleware" ), "" );
+        }
+    );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 500, "a route returning a middleware and at least one other variable causes a bail";
+    like $get->content,
+      qr[Multiple results but first one is a middleware \(Plack::Middleware=],
+      "the error message mentions the middleware class";
+}
+
+sub route_returns_undef {
+    @dispatch = (
+        sub (/) {
+            (
+                sub(/) {
+                    undef;
+                },
+                sub(/) {
+                    [ 900, [], [""] ];
+                }
+            );
+        },
+        sub () {
+            [ 400, [], [""] ];
+        }
+    );
+
+    my $get = run_request( GET => 'http://localhost/' );
+
+    cmp_ok $get->code, '==', 900, "a route that returns undef causes WD to ignore it and resume dispatching";
+}