Added failing tests for invalid UTF-8
[catagits/Catalyst-Runtime.git] / t / utf_incoming.t
index 5f12ecb..8b88a0e 100644 (file)
@@ -7,6 +7,7 @@ use HTTP::Message::PSGI ();
 use Encode 2.21 'decode_utf8', 'encode_utf8', 'encode';
 use File::Spec;
 use JSON::MaybeXS;
+use Data::Dumper;
 use Scalar::Util ();
 
 # Test cases for incoming utf8 
@@ -139,6 +140,26 @@ use Scalar::Util ();
     $c->response->body($decoded_text);
   }
 
+  sub file_upload_utf8_param :POST  Consumes(Multipart) Local {
+    my ($self, $c) = @_;
+
+    Test::More::is $c->req->body_parameters->{'♥'}, '♥♥';
+    Test::More::ok my $upload = $c->req->uploads->{'♥'};
+    Test::More::is $upload->charset, 'UTF-8';
+
+    my $text = $upload->slurp;
+    Test::More::is Encode::decode_utf8($text), "<p>This is stream_body_fh action ♥</p>\n";
+
+    my $decoded_text = $upload->decoded_slurp;
+    Test::More::is $decoded_text, "<p>This is stream_body_fh action ♥</p>\n";
+
+    Test::More::is $upload->filename, '♥ttachment.txt';
+    Test::More::is $upload->raw_basename, '♥ttachment.txt';
+
+    $c->response->content_type('text/html');
+    $c->response->body($decoded_text);
+  }
+
   sub json :POST Consumes(JSON) Local {
     my ($self, $c) = @_;
     my $post = $c->req->body_data;
@@ -203,6 +224,13 @@ use Scalar::Util ();
     $c->response->body($c->req->body_parameters->{arg});
   }
 
+  sub echo_param :Local {
+    my ($self, $c) = @_;
+    $c->response->content_type('text/plain');
+    $c->response->body($c->req->query_parameters->{arg});
+  }
+
+
   package MyApp;
   use Catalyst;
 
@@ -392,6 +420,16 @@ use Catalyst::Test 'MyApp';
 }
 
 {
+  ok my $path = File::Spec->catfile('t', 'utf8.txt');
+  ok my $req = POST '/root/file_upload_utf8_param',
+    Content_Type => 'form-data',
+    Content =>  [encode_utf8('♥')=>encode_utf8('♥♥'), encode_utf8('♥')=>["$path", encode_utf8('♥ttachment.txt'), 'Content-Type' =>'text/html; charset=UTF-8', ]];
+
+  ok my $res = request $req;
+  is decode_utf8($res->content), "<p>This is stream_body_fh action ♥</p>\n";
+}
+
+{
   ok my $req = POST '/root/json',
      Content_Type => 'application/json',
      Content => encode_json +{'♥'=>'♥♥'}; # Note: JSON does the UTF* encoding for us
@@ -499,6 +537,31 @@ SKIP: {
   is $c->req->query_parameters->{'a'}, $shiftjs, 'got expected value';
 }
 
+{
+    my $invalid = '%e2';
+    # in url
+    {
+        my $req = GET "/$invalid";
+        my $res = request $req;
+        is ($res->code, '400', "Invalid url param is 400");
+    }
+    # in body
+    {
+        my $req = POST "/root/echo_arg", Content => "arg0=$invalid";
+        my $res = request $req;
+        is ($res->code, '400', "Invalid post param is 400");
+    }
+    # in query
+    {
+        # failing since 5.90080
+        my $req = GET "/root/echo_param?arg=$invalid";
+        my $res = request $req;
+        is ($res->code, '400', "Invalid get param is 400") or diag Dumper($res->decoded_content);
+    }
+
+}
+
+
 ## should we use binmode on filehandles to force the encoding...?
 ## Not sure what else to do with multipart here, if docs are enough...