a test! an actual test!
[catagits/Web-Simple.git] / t / json.t
diff --git a/t/json.t b/t/json.t
new file mode 100644 (file)
index 0000000..54e21c6
--- /dev/null
+++ b/t/json.t
@@ -0,0 +1,128 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More qw(no_plan);
+
+{
+  use Web::Simple 'PostTest';
+  package PostTest;
+  sub dispatch_request {
+    sub (%:foo=&:bar~) {
+      $_[1]->{bar} ||= 'EMPTY';
+      [ 200,
+        [ "Content-type" => "text/plain" ],
+        [ join(' ',@{$_[1]}{qw(foo bar)}) ]
+      ]
+    },
+    sub (*baz=) {
+      [ 200,
+        [ "Content-type" => "text/plain" ],
+        [ $_[1]->reason || $_[1]->filename ],
+      ]
+    },
+    sub (POST + %* + %biff=) {
+      $_[1]->{bar} ||= 'EMPTY';
+      [ 200,
+        [ "Content-type" => "text/plain" ],
+        [ join(' ',@{$_[1]}{qw(biff bong)}) ]
+      ]
+    },
+  }
+}
+
+use HTTP::Request::Common qw(GET POST);
+
+my $app = PostTest->new;
+sub run_request { $app->run_test_request(@_); }
+
+my $get = run_request(GET 'http://localhost/');
+
+cmp_ok($get->code, '==', 404, '404 on GET');
+
+my $no_body = run_request(POST 'http://localhost/');
+
+cmp_ok($no_body->code, '==', 404, '404 with empty body');
+
+my $no_foo = run_request(POST 'http://localhost/' => [ bar => 'BAR' ]);
+
+cmp_ok($no_foo->code, '==', 404, '404 with no foo param');
+
+my $no_bar = run_request(POST 'http://localhost/' => [ foo => 'FOO' ]);
+
+cmp_ok($no_bar->code, '==', 200, '200 with only foo param');
+
+is($no_bar->content, 'FOO EMPTY', 'bar defaulted');
+
+my $both = run_request(
+  POST 'http://localhost/' => [ foo => 'FOO', bar => 'BAR' ]
+);
+
+cmp_ok($both->code, '==', 200, '200 with both params');
+
+is($both->content, 'FOO BAR', 'both params returned');
+
+my $upload = run_request(
+  POST 'http://localhost'
+    => Content_Type => 'form-data'
+    => Content => [
+      foo => 'FOO',
+      bar => 'BAR'
+    ]
+);
+
+cmp_ok($upload->code, '==', 200, '200 with multipart');
+
+is($upload->content, 'FOO BAR', 'both params returned');
+
+my $upload_splat = run_request(
+  POST 'http://localhost'
+    => Content_Type => 'form-data'
+    => Content => [
+      biff => 'frew',
+      bong => 'fru'
+    ]
+);
+
+cmp_ok($upload_splat->code, '==', 200, '200 with multipart');
+
+is($upload_splat->content, 'frew fru', 'both params returned');
+
+my $upload_wrongtype = run_request(
+  POST 'http://localhost'
+    => [ baz => 'fleem' ]
+);
+
+is(
+  $upload_wrongtype->content,
+  'field baz exists with value fleem but body was not multipart/form-data',
+  'error points out wrong body type'
+);
+
+my $upload_notupload = run_request(
+  POST 'http://localhost'
+    => Content_Type => 'form-data'
+    => Content => [ baz => 'fleem' ]
+);
+
+is(
+  $upload_notupload->content,
+  'field baz exists with value fleem but was not an upload',
+  'error points out field was not an upload'
+);
+
+my $upload_isupload = run_request(
+  POST 'http://localhost'
+    => Content_Type => 'form-data'
+    => Content => [
+      baz => [
+        undef, 'TESTFILE',
+        Content => 'test content', 'Content-Type' => 'text/plain'
+      ],
+    ]
+);
+
+is(
+  $upload_isupload->content,
+  'TESTFILE',
+  'Actual upload returns filename ok'
+);