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