useful errors on misused middleware in route definitions
[catagits/Web-Simple.git] / t / dispatch_misc.t
CommitLineData
35075f9d 1use strict;
2use warnings FATAL => 'all';
3no warnings::illegalproto;
4
5use Test::More;
6
7use HTTP::Request::Common qw(GET POST);
8use Web::Dispatch;
9use HTTP::Response;
10
11my @dispatch;
12
13{
14 use Web::Simple 'MiscTest';
15
16 package MiscTest;
17 sub dispatch_request { @dispatch }
18}
19
20my $app = MiscTest->new;
21sub run_request { $app->run_test_request( @_ ); }
22
23app_is_non_plack();
24plack_app_return();
25broken_route_def();
26array_with_sub();
27array_with_no_sub();
28middleware_as_only_route();
42f9eb1f 29plain_middleware_with_route();
35075f9d 30route_returns_middleware_plus_extra();
31route_returns_undef();
32
33done_testing();
34
35sub app_is_non_plack {
36
37 my $r = HTTP::Response->new( 999 );
38
39 my $d = Web::Dispatch->new( app => $r );
40 eval { $d->call };
41
42 like $@, qr/No idea how we got here with HTTP::Response/,
43 "Web::Dispatch dies when run with an app() that is a non-PSGI object";
44 undef $@;
45}
46
47sub plack_app_return {
48 {
49
50 package FauxPlackApp;
51 sub new { bless {}, $_[0] }
52
53 sub to_app {
54 return sub {
55 [ 999, [], [""] ];
56 };
57 }
58 }
59
60 @dispatch = (
61 sub (/) {
62 FauxPlackApp->new;
63 }
64 );
65
66 my $get = run_request( GET => 'http://localhost/' );
67
68 cmp_ok $get->code, '==', 999,
69 "when a route returns a thing that look like a Plack app, the web app redispatches to that thing";
70}
71
72sub broken_route_def {
73
74 @dispatch = ( '/' => "" );
75
76 my $get = run_request( GET => 'http://localhost/' );
77
78 cmp_ok $get->code, '==', 500, "a route definition by hash that doesn't pair a sub with a route dies";
79 like $get->content, qr[No idea how we got here with /], "the error message points out the broken definition";
80}
81
82sub array_with_sub {
83 @dispatch = (
84 sub (/) {
85 [
86 sub {
87 [ 999, [], [""] ];
88 },
89 ];
90 }
91 );
92
1a0ea82a 93 eval { run_request( GET => 'http://localhost/' ) };
35075f9d 94
1a0ea82a 95 like $@, qr/Can't call method "request" on an undefined value .*MockHTTP/,
96"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";
35075f9d 97}
98
99sub array_with_no_sub {
100 @dispatch = (
101 sub (/) {
102 ["moo"];
103 }
104 );
105
106 eval { run_request( GET => 'http://localhost/' ) };
107
108 like $@, qr/Can't call method "request" on an undefined value .*MockHTTP/,
109"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)";
110 undef $@;
111}
112
113sub middleware_as_only_route {
114 @dispatch = ( bless {}, "Plack::Middleware" );
115
116 my $get = run_request( GET => 'http://localhost/' );
117
118 cmp_ok $get->code, '==', 500, "a route definition consisting of only a middleware causes a bail";
42f9eb1f 119 like $get->content, qr[Middleware needs a route definition and has to be wrapped in a sub.],
120 "the error message explains the need for a route def and a code ref";
121}
122
123sub plain_middleware_with_route {
124 @dispatch = ( '' => bless {}, "Plack::Middleware" );
125
126 my $get = run_request( GET => 'http://localhost/' );
127
128 cmp_ok $get->code, '==', 500, "a route definition consisting of a string and a plain middleware causes a bail";
129 like $get->content, qr[Middleware needs to be wrapped in a sub.],
35075f9d 130 "the error message mentions the middleware class";
131}
132
133sub route_returns_middleware_plus_extra {
134 @dispatch = (
135 sub (/) {
136 return ( bless( {}, "Plack::Middleware" ), "" );
137 }
138 );
139
140 my $get = run_request( GET => 'http://localhost/' );
141
142 cmp_ok $get->code, '==', 500, "a route returning a middleware and at least one other variable causes a bail";
143 like $get->content,
144 qr[Multiple results but first one is a middleware \(Plack::Middleware=],
145 "the error message mentions the middleware class";
146}
147
148sub route_returns_undef {
149 @dispatch = (
150 sub (/) {
151 (
152 sub(/) {
153 undef;
154 },
155 sub(/) {
156 [ 900, [], [""] ];
157 }
158 );
159 },
160 sub () {
161 [ 400, [], [""] ];
162 }
163 );
164
165 my $get = run_request( GET => 'http://localhost/' );
166
167 cmp_ok $get->code, '==', 900, "a route that returns undef causes WD to ignore it and resume dispatching";
168}