File: send_as.t

package info (click to toggle)
libdancer2-perl 0.400001%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 2,580 kB
  • sloc: perl: 8,461; makefile: 9
file content (161 lines) | stat: -rw-r--r-- 3,971 bytes parent folder | download | duplicates (4)
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();