sketch for httpmethods _ new psgi utils / tests
[catagits/Catalyst-Runtime.git] / t / psgi_utils.t
1 use warnings;
2 use strict;
3
4 # Make it easier to mount PSGI apps under catalyst
5
6 {
7   package MyApp::Controller::User;
8
9   use base 'Catalyst::Controller';
10   use Plack::Request;
11   use Catalyst::Utils;
12
13   my $psgi_app = sub {
14     my $req = Plack::Request->new(shift);
15     return [200,[],[$req->path]];
16   };
17
18   sub local_example :Local {
19     my ($self, $c) = @_;
20     my $env = $self->get_env($c);
21     $c->res->from_psgi_response(
22       $psgi_app->($env));
23   }
24
25   sub local_example_args1 :Local Args(1) {
26     my ($self, $c) = @_;
27     my $env = $self->get_env($c);
28     $c->res->from_psgi_response(
29       $psgi_app->($env));
30   }
31
32   sub path_example :Path('path-example') {
33     my ($self, $c) = @_;
34     my $env = $self->get_env($c);
35     $c->res->from_psgi_response(
36       $psgi_app->($env));
37   }
38
39   sub path_example_args1 :Path('path-example-args1') {
40     my ($self, $c) = @_;
41     my $env = $self->get_env($c);
42     $c->res->from_psgi_response(
43       $psgi_app->($env));
44   }
45
46   sub chained :Chained(/) PathPrefix CaptureArgs(0) { }
47
48     sub from_chain :Chained('chained') PathPart('') CaptureArgs(0) {}
49
50       sub end_chain :Chained('from_chain') PathPath(abc-123) Args(1)
51       {
52         my ($self, $c) = @_;
53         my $env = $self->get_env($c);
54         $c->res->from_psgi_response(
55           $psgi_app->($env));
56       }
57   
58   sub get_env {
59     my ($self, $c) = @_;
60     if($c->req->query_parameters->{path_prefix}) {
61       return $c->Catalyst::Utils::env_at_path_prefix;
62     } elsif($c->req->query_parameters->{env_path}) {
63       return $c->Catalyst::Utils::env_at_action;
64     } elsif($c->req->query_parameters->{path}) {
65       return $c->Catalyst::Utils::env_at_request_uri;
66     } else {
67       return $c->req->env;
68     }
69   }
70
71   $INC{'MyApp/Controller/User.pm'} = __FILE__;
72
73   package MyApp;
74   use Catalyst;
75   MyApp->setup;
76
77 }
78
79 use Test::More;
80 use Catalyst::Test 'MyApp';
81
82 # BEGIN [user/local_example]
83 {
84   my ($res, $c) = ctx_request('/user/local_example');
85   is $c->action, 'user/local_example';
86   is $res->content, '/user/local_example';
87   is_deeply $c->req->args, [];
88 }
89
90 {
91   my ($res, $c) = ctx_request('/user/local_example/111/222');
92   is $c->action, 'user/local_example';
93   is $res->content, '/user/local_example/111/222';
94   is_deeply $c->req->args, [111,222];
95 }
96
97 {
98   my ($res, $c) = ctx_request('/user/local_example?path_prefix=1');
99   is $c->action, 'user/local_example';
100   is $res->content, '/local_example';
101   is_deeply $c->req->args, [];
102 }
103
104 {
105   my ($res, $c) = ctx_request('/user/local_example/111/222?path_prefix=1');
106   is $c->action, 'user/local_example';
107   is $res->content, '/local_example/111/222';
108   is_deeply $c->req->args, [111,222];
109 }
110
111 {
112   my ($res, $c) = ctx_request('/user/local_example?env_path=1');
113   is $c->action, 'user/local_example';
114   is $res->content, '/';
115   is_deeply $c->req->args, [];
116 }
117
118 {
119   my ($res, $c) = ctx_request('/user/local_example/111/222?env_path=1');
120   is $c->action, 'user/local_example';
121   is $res->content, '/111/222';
122   is_deeply $c->req->args, [111,222];
123 }
124
125 {
126   my ($res, $c) = ctx_request('/user/local_example?path=1');
127   is $c->action, 'user/local_example';
128   is $res->content, '/';
129   is_deeply $c->req->args, [];
130 }
131
132 {
133   my ($res, $c) = ctx_request('/user/local_example/111/222?path=1');
134   is $c->action, 'user/local_example';
135   is $res->content, '/';
136   is_deeply $c->req->args, [111,222];
137 }
138
139 # END [user/local_example]
140
141 # BEGIN [/user/local_example_args1/***/]
142
143 {
144   my ($res, $c) = ctx_request('/user/local_example_args1/333');
145   is $c->action, 'user/local_example_args1';
146   is $res->content, '/user/local_example_args1/333';
147   is_deeply $c->req->args, [333];
148 }
149
150 {
151   my ($res, $c) = ctx_request('/user/local_example_args1/333?path_prefix=1');
152   is $c->action, 'user/local_example_args1';
153   is $res->content, '/local_example_args1/333';
154   is_deeply $c->req->args, [333];
155 }
156
157 {
158   my ($res, $c) = ctx_request('/user/local_example_args1/333?env_path=1');
159   is $c->action, 'user/local_example_args1';
160   is $res->content, '/333';
161   is_deeply $c->req->args, [333];
162 }
163
164 {
165   my ($res, $c) = ctx_request('/user/local_example_args1/333?path=1');
166   is $c->action, 'user/local_example_args1';
167   is $res->content, '/';
168   is_deeply $c->req->args, [333];
169 }
170
171 # END [/user/local_example_args1/***/]
172
173 # BEGIN [/user/path-example] 
174
175 {
176   my ($res, $c) = ctx_request('/user/path-example');
177   is $c->action, 'user/path_example';
178   is $res->content, '/user/path-example';
179   is_deeply $c->req->args, [];
180 }
181
182 {
183   my ($res, $c) = ctx_request('/user/path-example?path_prefix=1');
184   is $c->action, 'user/path_example';
185   is $res->content, '/path-example';
186   is_deeply $c->req->args, [];
187 }
188
189 {
190   my ($res, $c) = ctx_request('/user/path-example?env_path=1');
191   is $c->action, 'user/path_example';
192   is $res->content, '/';
193   is_deeply $c->req->args, [];
194 }
195
196 {
197   my ($res, $c) = ctx_request('/user/path-example?path=1');
198   is $c->action, 'user/path_example';
199   is $res->content, '/';
200   is_deeply $c->req->args, [];
201 }
202
203
204 {
205   my ($res, $c) = ctx_request('/user/path-example/111/222');
206   is $c->action, 'user/path_example';
207   is $res->content, '/user/path-example/111/222';
208   is_deeply $c->req->args, [111,222];
209 }
210
211 {
212   my ($res, $c) = ctx_request('/user/path-example/111/222?path_prefix=1');
213   is $c->action, 'user/path_example';
214   is $res->content, '/path-example/111/222';
215   is_deeply $c->req->args, [111,222];
216 }
217
218 {
219   my ($res, $c) = ctx_request('/user/path-example/111/222?env_path=1');
220   is $c->action, 'user/path_example';
221   is $res->content, '/111/222';
222   is_deeply $c->req->args, [111,222];
223 }
224
225 {
226   my ($res, $c) = ctx_request('/user/path-example/111/222?path=1');
227   is $c->action, 'user/path_example';
228   is $res->content, '/';
229   is_deeply $c->req->args, [111,222];
230 }
231
232 {
233   my ($res, $c) = ctx_request('/user/path-example-args1/333');
234   is $c->action, 'user/path_example_args1';
235   is $res->content, '/user/path-example-args1/333';
236   is_deeply $c->req->args, [333];
237 }
238
239 {
240   my ($res, $c) = ctx_request('/user/path-example-args1/333?path_prefix=1');
241   is $c->action, 'user/path_example_args1';
242   is $res->content, '/path-example-args1/333';
243   is_deeply $c->req->args, [333];
244 }
245
246 {
247   my ($res, $c) = ctx_request('/user/path-example-args1/333?env_path=1');
248   is $c->action, 'user/path_example_args1';
249   is $res->content, '/333';
250   is_deeply $c->req->args, [333];
251 }
252
253 {
254   my ($res, $c) = ctx_request('/user/path-example-args1/333?path=1');
255   is $c->action, 'user/path_example_args1';
256   is $res->content, '/';
257   is_deeply $c->req->args, [333];
258 }
259
260 # Chaining test /user/end_chain/*
261 #
262 #
263
264 {
265   my ($res, $c) = ctx_request('/user/end_chain/444');
266   is $c->action, 'user/end_chain';
267   is $res->content, '/user/end_chain/444';
268   is_deeply $c->req->args, [444];
269 }
270
271 {
272   my ($res, $c) = ctx_request('/user/end_chain/444?path_prefix=1');
273   is $c->action, 'user/end_chain';
274   is $res->content, '/end_chain/444';
275   is_deeply $c->req->args, [444];
276 }
277
278 {
279   my ($res, $c) = ctx_request('/user/end_chain/444?env_path=1');
280   is $c->action, 'user/end_chain';
281   is $res->content, '/444';
282   is_deeply $c->req->args, [444];
283 }
284
285 {
286   my ($res, $c) = ctx_request('/user/end_chain/444?path=1');
287   is $c->action, 'user/end_chain';
288   is $res->content, '/';
289   is_deeply $c->req->args, [444];
290 }
291
292
293 done_testing();
294
295 __END__
296
297
298 use Plack::App::URLMap;
299 use HTTP::Request::Common;
300 use HTTP::Message::PSGI;
301
302 my $urlmap = Plack::App::URLMap->new;
303
304 my $app1 = sub {
305   my $env = shift;
306   return [200, [], [
307     "REQUEST_URI: $env->{REQUEST_URI}, FROM: $env->{MAP_TO}, PATH_INFO: $env->{PATH_INFO}, SCRIPT_NAME $env->{SCRIPT_NAME}"]];
308 };
309
310 $urlmap->map("/" => sub { my $env = shift; $env->{MAP_TO} = '/'; $app1->($env)});
311 $urlmap->map("/foo" => sub { my $env = shift; $env->{MAP_TO} = '/foo'; $app1->($env)});
312 $urlmap->map("/bar/baz" => sub { my $env = shift; $env->{MAP_TO} = '/foo/bar'; $app1->($env)});
313
314 my $app = $urlmap->to_app;
315
316 warn $app->(req_to_psgi(GET '/'))->[2]->[0];
317 warn $app->(req_to_psgi(GET '/111'))->[2]->[0];
318 warn $app->(req_to_psgi(GET '/foo'))->[2]->[0];
319 warn $app->(req_to_psgi(GET '/foo/222'))->[2]->[0];
320 warn $app->(req_to_psgi(GET '/bar/baz'))->[2]->[0];
321 warn $app->(req_to_psgi(GET '/bar/baz/333'))->[2]->[0];
322