X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=t%2Futf_incoming.t;h=516e9d5e60a897d032cc58434f0b48065e4f01a6;hp=fef35538972f118b3a456bc64cd8d66c6d3e1b4f;hb=12982f8623b4a3520146d4f52c5705d2b8a3b5ab;hpb=e8361cf8fc1d23adf4a14a81726477c48a80449e diff --git a/t/utf_incoming.t b/t/utf_incoming.t index fef3553..516e9d5 100644 --- a/t/utf_incoming.t +++ b/t/utf_incoming.t @@ -5,6 +5,7 @@ use Test::More; use HTTP::Request::Common; use Encode 2.21 'decode_utf8', 'encode_utf8'; use File::Spec; +use JSON::MaybeXS; # Test cases for incoming utf8 @@ -106,6 +107,30 @@ use File::Spec; $c->response->body($contents); } + sub file_upload :POST Consumes(Multipart) Local { + my ($self, $c) = @_; + Test::More::is $c->req->body_parameters->{'♥'}, '♥♥'; + Test::More::ok my $upload = $c->req->uploads->{file}; + + my $text = $upload->slurp; + Test::More::is Encode::decode_utf8($text), "

This is stream_body_fh action ♥

\n"; + + $c->response->content_type('text/html'); + $c->response->body($upload->fh); + } + + sub json :POST Consumes(JSON) Local { + my ($self, $c) = @_; + my $post = $c->req->body_data; + + Test::More::is $post->{'♥'}, '♥♥'; + $c->response->content_type('application/json'); + + # Encode JSON also encodes to a UTF-8 encoded, binary string. This is why we don't + # have application/json as one of the things we match, otherwise we get double + # encoding. + $c->response->body(JSON::MaybeXS::encode_json($post)); + } package MyApp; use Catalyst; @@ -202,13 +227,15 @@ use Catalyst::Test 'MyApp'; my ($res, $c) = ctx_request POST "/base/♥/♥/♥/♥?♥=♥♥", [a=>1, b=>'2', '♥'=>'♥♥']; ## Make sure that the urls we generate work the same - my $uri_for = $c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥', {'♥'=>'♥♥'}); + my $uri_for1 = $c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥', {'♥'=>'♥♥'}); + my $uri_for2 = $c->uri_for($c->controller('Root')->action_for('argend'), ['♥', '♥'], {'♥'=>'♥♥'}); my $uri = $c->req->uri; - is "$uri", "$uri_for"; + is "$uri_for1", "$uri_for2"; + is "$uri", "$uri_for1"; { - my ($res, $c) = ctx_request POST "$uri_for", [a=>1, b=>'2', '♥'=>'♥♥']; + my ($res, $c) = ctx_request POST "$uri_for1", [a=>1, b=>'2', '♥'=>'♥♥']; is $c->req->query_parameters->{'♥'}, '♥♥'; is $c->req->body_parameters->{'♥'}, '♥♥'; is $c->req->parameters->{'♥'}[0], '♥♥'; #combined with query and body @@ -225,6 +252,16 @@ use Catalyst::Test 'MyApp'; is $res->content, "$url", 'correct body'; is $res->content_length, 90, 'correct length'; is $res->content_charset, 'UTF-8'; + + { + my $url = $c->uri_for($c->controller->action_for('heart_with_arg'), '♥'); + is "$url", 'http://localhost/root/a%E2%99%A5/%E2%99%A5'; + } + + { + my $url = $c->uri_for($c->controller->action_for('heart_with_arg'), ['♥']); + is "$url", 'http://localhost/root/a%E2%99%A5/%E2%99%A5'; + } } { @@ -263,4 +300,28 @@ use Catalyst::Test 'MyApp'; is $res->content_charset, 'UTF-8'; } +{ + ok my $path = File::Spec->catfile('t', 'utf8.txt'); + ok my $req = POST '/root/file_upload', + Content_Type => 'form-data', + Content => [encode_utf8('♥')=>encode_utf8('♥♥'), file=>["$path", 'attachment.txt', 'Content-Type' =>'text/html; charset=UTF-8', ]]; + + ok my $res = request $req; + is decode_utf8($res->content), "

This is stream_body_fh action ♥

\n"; +} + +{ + ok my $req = POST '/root/json', + Content_Type => 'application/json', + Content => encode_json +{'♥'=>'♥♥'}; # Note: JSON does the UTF* encoding for us + + ok my $res = request $req; + + ## decode_json expect the binary utf8 string and does the decoded bit for us. + is_deeply decode_json(($res->content)), +{'♥'=>'♥♥'}; +} + +## should we use binmode on filehandles to force the encoding...? +## Not sure what else to do with multipart here, if docs are enough... + done_testing;