test POST splat
[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     sub (POST + %* + %biff=) {
24       $_[1]->{bar} ||= 'EMPTY';
25       [ 200,
26         [ "Content-type" => "text/plain" ],
27         [ join(' ',@{$_[1]}{qw(biff bong)}) ]
28       ]
29     },
30   }
31 }
32
33 use HTTP::Request::Common qw(GET POST);
34
35 my $app = PostTest->new;
36 sub run_request { $app->run_test_request(@_); }
37
38 my $get = run_request(GET 'http://localhost/');
39
40 cmp_ok($get->code, '==', 404, '404 on GET');
41
42 my $no_body = run_request(POST 'http://localhost/');
43
44 cmp_ok($no_body->code, '==', 404, '404 with empty body');
45
46 my $no_foo = run_request(POST 'http://localhost/' => [ bar => 'BAR' ]);
47
48 cmp_ok($no_foo->code, '==', 404, '404 with no foo param');
49
50 my $no_bar = run_request(POST 'http://localhost/' => [ foo => 'FOO' ]);
51
52 cmp_ok($no_bar->code, '==', 200, '200 with only foo param');
53
54 is($no_bar->content, 'FOO EMPTY', 'bar defaulted');
55
56 my $both = run_request(
57   POST 'http://localhost/' => [ foo => 'FOO', bar => 'BAR' ]
58 );
59
60 cmp_ok($both->code, '==', 200, '200 with both params');
61
62 is($both->content, 'FOO BAR', 'both params returned');
63
64 my $upload = run_request(
65   POST 'http://localhost'
66     => Content_Type => 'form-data'
67     => Content => [
68       foo => 'FOO',
69       bar => 'BAR'
70     ]
71 );
72
73 cmp_ok($upload->code, '==', 200, '200 with multipart');
74
75 is($upload->content, 'FOO BAR', 'both params returned');
76
77 my $upload_splat = run_request(
78   POST 'http://localhost'
79     => Content_Type => 'form-data'
80     => Content => [
81       biff => 'frew',
82       bong => 'fru'
83     ]
84 );
85
86 cmp_ok($upload_splat->code, '==', 200, '200 with multipart');
87
88 is($upload_splat->content, 'frew fru', 'both params returned');
89
90 my $upload_wrongtype = run_request(
91   POST 'http://localhost'
92     => [ baz => 'fleem' ]
93 );
94
95 is(
96   $upload_wrongtype->content,
97   'field baz exists with value fleem but body was not multipart/form-data',
98   'error points out wrong body type'
99 );
100
101 my $upload_notupload = run_request(
102   POST 'http://localhost'
103     => Content_Type => 'form-data'
104     => Content => [ baz => 'fleem' ]
105 );
106
107 is(
108   $upload_notupload->content,
109   'field baz exists with value fleem but was not an upload',
110   'error points out field was not an upload'
111 );
112
113 my $upload_isupload = run_request(
114   POST 'http://localhost'
115     => Content_Type => 'form-data'
116     => Content => [
117       baz => [
118         undef, 'TESTFILE',
119         Content => 'test content', 'Content-Type' => 'text/plain'
120       ],
121     ]
122 );
123
124 is(
125   $upload_isupload->content,
126   'TESTFILE',
127   'Actual upload returns filename ok'
128 );