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