c3b7171ee326256e7090a6fb120e3640b8f5ba9a
[catagits/Catalyst-Runtime.git] / t / unicode_plugin_request_decode.t
1 use strict;
2 use warnings;
3 use Test::More tests => 5 * 5;
4 use utf8;
5
6 # setup library path
7 use FindBin qw($Bin);
8 use lib "$Bin/lib";
9
10 use Catalyst::Test 'TestAppUnicode';
11 use Encode;
12 use HTTP::Request::Common;
13 use URI::Escape qw/uri_escape_utf8/;
14 use HTTP::Status 'is_server_error';
15
16 my $encode_str = "\x{e3}\x{81}\x{82}"; # e38182 is japanese 'あ'
17 my $decode_str = Encode::decode('utf-8' => $encode_str);
18 my $escape_str = uri_escape_utf8($decode_str);
19
20 check_parameter(GET "/?foo=$escape_str");
21 check_parameter(POST '/', ['foo' => $encode_str]);
22 check_parameter(POST '/',
23     Content_Type => 'form-data',
24     Content => [
25         'foo' => [
26             "$Bin/unicode_plugin_request_decode.t",
27             $encode_str,
28         ]
29     ],
30 );
31
32 check_argument(GET "/$escape_str");
33 check_capture(GET "/capture/$escape_str");
34
35 # sending non-utf8 data
36 my $non_utf8_data = "%C3%E6%CB%AA";
37 check_fallback(GET "/?q=${non_utf8_data}");
38 check_fallback(GET "/${non_utf8_data}");
39 check_fallback(GET "/capture/${non_utf8_data}");
40 check_fallback(POST '/', ['foo' => $non_utf8_data]);
41
42 sub check_parameter {
43     my ( undef, $c ) = ctx_request(shift);
44     is $c->res->output => '<h1>It works</h1>';
45
46     my $foo = $c->req->param('foo');
47     ok utf8::is_utf8($foo);
48     is $foo => $decode_str;
49
50     my $other_foo = $c->req->method eq 'POST'
51         ? $c->req->upload('foo')
52             ? $c->req->upload('foo')->filename
53             : $c->req->body_parameters->{foo}
54         : $c->req->query_parameters->{foo};
55     ok utf8::is_utf8($other_foo);
56     is $other_foo => $decode_str;
57 }
58
59 sub check_argument {
60     my ( undef, $c ) = ctx_request(shift);
61     is $c->res->output => '<h1>It works</h1>';
62
63     my $foo = $c->req->args->[0];
64     ok utf8::is_utf8($foo);
65     is $foo => $decode_str;
66 }
67
68 sub check_capture {
69     my ( undef, $c ) = ctx_request(shift);
70     is $c->res->output => '<h1>It works</h1>';
71
72     my $foo = $c->req->captures->[0];
73     ok utf8::is_utf8($foo);
74     is $foo => $decode_str;
75 }
76
77 sub check_fallback {
78   my ( $res, $c ) = ctx_request(shift);
79   ok(!is_server_error($res->code)) or diag('Response code is: ' . $res->code);
80 }