1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
use strict;
use warnings;
use Test::More import => ['!pass'];
use Plack::Test;
use HTTP::Request::Common;
{
package DummyObj;
use Moo;
has foo => (is => 'ro', default => 'bar');
sub TO_JSON {
{foo => shift->foo};
}
1;
}
{
package Test::App::SendAs;
use Dancer2;
set engines => {
serializer => {
JSON => {
allow_blessed => 1,
convert_blessed => 1,
}
}
};
set logger => 'Capture';
set serializer => 'YAML';
set template => 'TemplateToolkit';
get '/html' => sub {
send_as html => '<html></html>'
};
get '/plain' => sub {
send_as plain => 'some plain text with <html></html>';
};
get '/json/**' => sub {
send_as JSON => splat;
};
get '/json-object' => sub {
send_as JSON => { data => DummyObj->new() };
};
get '/json-utf8/**' => sub {
send_as JSON => splat, { content_type => 'application/json', charset => 'utf-8' };
};
get '/yaml/**' => sub {
my @params = splat;
\@params;
};
get '/sendas/:type?' => sub {
send_as route_parameters->{'type'} => 'test string';
};
}
my $test = Plack::Test->create( Test::App::SendAs->to_app );
subtest "default serializer" => sub {
my $res = $test->request( GET '/yaml/is/useful' );
is $res->code, '200';
is $res->content_type, 'text/x-yaml';
my $expected = <<'YAML';
---
-
- is
- useful
YAML
is $res->content, $expected;
};
subtest "send_as json" => sub {
my $res = $test->request( GET '/json/is/wonderful' );
is $res->code, '200';
is $res->content_type, 'application/json';
is $res->content, '["is","wonderful"]';
};
subtest "send_as json object" => sub {
my $res = $test->request( GET '/json-object' );
is $res->code, '200';
is $res->content_type, 'application/json';
is $res->content, '{"data":{"foo":"bar"}}';
};
subtest "send_as json custom content-type" => sub {
my $res = $test->request( GET '/json-utf8/is/wonderful' );
is $res->code, '200';
is $res->content_type, 'application/json';
is $res->content_type_charset, 'UTF-8';
is $res->content, '["is","wonderful"]';
};
subtest "send_as html" => sub {
my $res = $test->request( GET '/html' );
is $res->code, '200';
is $res->content_type, 'text/html';
is $res->content_type_charset, 'UTF-8';
is $res->content, '<html></html>';
};
subtest "send_as plain" => sub {
my $res = $test->request( GET '/plain' );
is $res->code, '200';
is $res->content_type, 'text/plain';
is $res->content_type_charset, 'UTF-8';
is $res->content, 'some plain text with <html></html>';
};
subtest "send_as error cases" => sub {
my $logger = Test::App::SendAs::app->logger_engine;
{
my $res = $test->request( GET '/sendas/' );
is $res->code, '500', "send_as dies with no defined type";
my $logs = $logger->trapper->read;
like $logs->[0]->{message},
qr!Route exception: Can not send_as using an undefined type!,
".. throws route exception";
}
{
my $res = $test->request( GET '/sendas/jSoN' );
is $res->code, '500',
"send_as dies with incorrectly cased serializer name";
my $logs = $logger->trapper->read;
like $logs->[0]->{message},
qr!Route exception: Unable to load serializer class for jSoN!,
".. throws route exception";
}
{
my $res = $test->request( GET '/sendas/SomeSerializerThatDoesNotExist' );
is $res->code, '500',
"send_as dies when called with non-existant serializer";
my $logs = $logger->trapper->read;
like $logs->[0]->{message},
qr!Route exception: Unable to load serializer class for SomeSerializerThatDoesNotExist!,
".. throws route exception";
}
};
done_testing();
|