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=21683cf02e5c0ce803d05d25091b41a997fed2fb;hp=76eaa876a016e81e4ad7d319572ea2c580295502;hb=fbd5d4fa65e4e10dd160ae5637e4b94a5b0d54f4;hpb=d200092825d92139d59f660eaa895790442cdf8b diff --git a/t/utf_incoming.t b/t/utf_incoming.t index 76eaa87..21683cf 100644 --- a/t/utf_incoming.t +++ b/t/utf_incoming.t @@ -4,9 +4,10 @@ use strict; use Test::More; use HTTP::Request::Common; use HTTP::Message::PSGI (); -use Encode 2.21 'decode_utf8', 'encode_utf8'; +use Encode 2.21 'decode_utf8', 'encode_utf8', 'encode'; use File::Spec; use JSON::MaybeXS; +use Scalar::Util (); # Test cases for incoming utf8 @@ -32,7 +33,7 @@ use JSON::MaybeXS; sub uri_for :Path('uri_for') { my ($self, $c) = @_; $c->response->content_type('text/html'); - $c->response->body("${\$c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥', {'♥'=>'♥♥'})}"); + $c->response->body("${\$c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥#X♥X', {'♥'=>'♥♥'})}"); } sub heart_with_arg :Path('a♥') Args(1) { @@ -110,8 +111,17 @@ use JSON::MaybeXS; $c->response->body($contents); } + sub write_then_body :Local { + my ($self, $c) = @_; + + $c->res->content_type('text/html'); + $c->res->write("

This is early_write action ♥

"); + $c->res->body("

This is body_write action ♥

"); + } + 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}; Test::More::is $upload->charset, 'UTF-8'; @@ -129,6 +139,26 @@ use JSON::MaybeXS; $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), "

This is stream_body_fh action ♥

\n"; + + my $decoded_text = $upload->decoded_slurp; + Test::More::is $decoded_text, "

This is stream_body_fh action ♥

\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; @@ -187,6 +217,12 @@ use JSON::MaybeXS; $c->res->from_psgi_response( ref($c)->to_app->($env)); } + sub echo_arg :Local { + my ($self, $c) = @_; + $c->response->content_type('text/plain'); + $c->response->body($c->req->body_parameters->{arg}); + } + package MyApp; use Catalyst; @@ -302,12 +338,12 @@ use Catalyst::Test 'MyApp'; { my ($res, $c) = ctx_request "/root/uri_for"; - my $url = $c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥', {'♥'=>'♥♥'}); + my $url = $c->uri_for($c->controller('Root')->action_for('argend'), ['♥'], '♥#X♥X', {'♥'=>'♥♥'}); is $res->code, 200, 'OK'; is decode_utf8($res->content), "$url", 'correct body'; #should do nothing is $res->content, "$url", 'correct body'; - is $res->content_length, 90, 'correct length'; + is $res->content_length, 104, 'correct length'; is $res->content_charset, 'UTF-8'; { @@ -358,6 +394,14 @@ use Catalyst::Test 'MyApp'; } { + my $res = request "/root/write_then_body"; + + is $res->code, 200, 'OK'; + is decode_utf8($res->content), "

This is early_write action ♥

This is body_write action ♥

"; + 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', @@ -368,6 +412,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), "

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 @@ -375,7 +429,7 @@ use Catalyst::Test 'MyApp'; 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)), +{'♥'=>'♥♥'}; + is_deeply decode_json(($res->content)), +{'♥'=>'♥♥'}, 'JSON was decoded correctly'; } { @@ -386,7 +440,7 @@ use Catalyst::Test 'MyApp'; is $enc->decode($res->content), "テスト", 'correct body'; is $res->content_length, 6, 'correct length'; # Bytes over the wire is length($enc->decode($res->content)), 3; - is $res->content_charset, 'SHIFT_JIS'; + is $res->content_charset, 'SHIFT_JIS', 'content charset is SHIFT_JIS as expected'; } { @@ -408,7 +462,7 @@ SKIP: { is $res->code, 200, 'OK'; is decode_utf8($content), "manual_1 ♥", 'correct body'; - is $res->content_charset, 'UTF-8'; + is $res->content_charset, 'UTF-8', 'zlib charset is set correctly'; } { @@ -424,7 +478,55 @@ SKIP: { is $res->code, 200, 'OK'; is decode_utf8($res->content), '

This is path-heart action ♥

', 'correct body'; is $res->content_length, 36, 'correct length'; - is $res->content_charset, 'UTF-8'; + is $res->content_charset, 'UTF-8', 'external PSGI app has expected charset'; +} + +{ + my $utf8 = 'test ♥'; + my $shiftjs = 'test テスト'; + + ok my $req = POST '/root/echo_arg', + Content_Type => 'form-data', + Content => [ + arg0 => 'helloworld', + Encode::encode('UTF-8','♥') => Encode::encode('UTF-8','♥♥'), # Long form POST simple does not auto encode... + Encode::encode('UTF-8','♥♥♥') => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + arg1 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=UTF-8', + 'Content' => Encode::encode('UTF-8', $utf8)], + arg2 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + arg2 => [ + undef, '', + 'Content-Type' =>'text/plain; charset=SHIFT_JIS', + 'Content' => Encode::encode('SHIFT_JIS', $shiftjs)], + ]; + + my ($res, $c) = ctx_request $req; + + is $c->req->body_parameters->{'arg0'}, 'helloworld', 'got helloworld value'; + is $c->req->body_parameters->{'♥'}, '♥♥'; + is $c->req->body_parameters->{'arg1'}, $utf8, 'decoded utf8 param'; + is $c->req->body_parameters->{'arg2'}[0], $shiftjs, 'decoded shiftjs param'; + is $c->req->body_parameters->{'arg2'}[1], $shiftjs, 'decoded shiftjs param'; + is $c->req->body_parameters->{'♥♥♥'}, $shiftjs, 'decoded shiftjs param'; + +} + +{ + my $shiftjs = 'test テスト'; + my $encoded = Encode::encode('UTF-8', $shiftjs); + + ok my $req = GET "/root/echo_arg?a=$encoded"; + my ($res, $c) = ctx_request $req; + + is $c->req->query_parameters->{'a'}, $shiftjs, 'got expected value'; } ## should we use binmode on filehandles to force the encoding...?