24d608628bed7cd9daf12af5487c16338a5fe59e
[catagits/Web-Simple.git] / t / post.t
1 use strict;
2 use warnings FATAL => 'all';
3
4 use Test::More qw(no_plan);
5
6 {
7   use Web::Simple 'PostTest';
8   package PostTest;
9   sub dispatch_request {
10     sub (%:foo=&:bar~) {
11       $_[1]->{bar} ||= 'EMPTY';
12       [ 200,
13         [ "Content-type" => "text/plain" ],
14         [ join(' ',@{$_[1]}{qw(foo bar)}) ]
15       ]
16     },
17     sub (*baz=) {
18       [ 200,
19         [ "Content-type" => "text/plain" ],
20         [ $_[1]->reason || $_[1]->filename ],
21       ]
22     },
23   }
24 }
25
26 use Plack::Test;
27 use HTTP::Request::Common qw(GET POST);
28
29 my $app = PostTest->new;
30
31 sub run_request {
32   my $request = shift;
33   my $response = test_psgi($app->to_psgi_app, sub { shift->($request) });
34   return $response;
35 }
36
37 my $get = run_request(GET 'http://localhost/');
38
39 cmp_ok($get->code, '==', 404, '404 on GET');
40
41 my $no_body = run_request(POST 'http://localhost/');
42
43 cmp_ok($no_body->code, '==', 404, '404 with empty body');
44
45 my $no_foo = run_request(POST 'http://localhost/' => [ bar => 'BAR' ]);
46
47 cmp_ok($no_foo->code, '==', 404, '404 with no foo param');
48
49 my $no_bar = run_request(POST 'http://localhost/' => [ foo => 'FOO' ]);
50
51 cmp_ok($no_bar->code, '==', 200, '200 with only foo param');
52
53 is($no_bar->content, 'FOO EMPTY', 'bar defaulted');
54
55 my $both = run_request(
56   POST 'http://localhost/' => [ foo => 'FOO', bar => 'BAR' ]
57 );
58
59 cmp_ok($both->code, '==', 200, '200 with both params');
60
61 is($both->content, 'FOO BAR', 'both params returned');
62
63 my $upload = run_request(
64   POST 'http://localhost'
65     => Content_Type => 'form-data'
66     => Content => [
67       foo => 'FOO',
68       bar => 'BAR'
69     ]
70 );
71
72 cmp_ok($upload->code, '==', 200, '200 with multipart');
73
74 is($upload->content, 'FOO BAR', 'both params returned');
75
76 my $upload_wrongtype = run_request(
77   POST 'http://localhost'
78     => [ baz => 'fleem' ]
79 );
80
81 is(
82   $upload_wrongtype->content,
83   'field baz exists with value fleem but body was not multipart/form-data',
84   'error points out wrong body type'
85 );
86
87 my $upload_notupload = run_request(
88   POST 'http://localhost'
89     => Content_Type => 'form-data'
90     => Content => [ baz => 'fleem' ]
91 );
92
93 is(
94   $upload_notupload->content,
95   'field baz exists with value fleem but was not an upload',
96   'error points out field was not an upload'
97 );
98
99 my $upload_isupload = run_request(
100   POST 'http://localhost'
101     => Content_Type => 'form-data'
102     => Content => [
103       baz => [
104         undef, 'TESTFILE',
105         Content => 'test content', 'Content-Type' => 'text/plain'
106       ],
107     ]
108 );
109
110 is(
111   $upload_isupload->content,
112   'TESTFILE',
113   'Actual upload returns filename ok'
114 );