The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More import => ['!pass'];
use strict;
use warnings;

use Dancer;
use Dancer::ModuleLoader;

use Encode;

plan tests => 16;

set environment => 'production';

my $res = Dancer::Response->new(headers => [ 'Content-Type' => 'text/html' ], content_type => 'text/html');
my $psgi_res = Dancer::Handler->render_response($res);
is(@$psgi_res, 3);
is($psgi_res->[0], 200, 'default status');
is_deeply($psgi_res->[1], [ 'Content-Length', 0, 'Content-Type' => 'text/html' ], 'default headers');
is_deeply($psgi_res->[2], [''], 'default content');

ok $res->content_type('text/plain');
ok $res->content('123');

is_deeply(Dancer::Handler->render_response($res),
    [
        200,
        [ 'Content-Length', 0, 'Content-Type', 'text/plain' ],
        [ '123' ],
    ],
);

setting charset => 'utf-8';

is_deeply(Dancer::Handler->render_response($res),
    [
        200,
        [ 'Content-Length', 0, 'Content-Type', 'text/plain; charset=utf-8' ],
        [ '123' ],
    ],
);

ok $res->content("\x{0429}");   # cyrillic shcha -- way beyond latin1

is_deeply(Dancer::Handler->render_response(Dancer::Serializer->process_response($res)),
    [
        200,
        [ 'Content-Length', 0, 'Content-Type', 'text/plain; charset=utf-8' ],
        [ Encode::encode('utf-8', "\x{0429}") ],
    ],
);

SKIP: {
    skip "JSON is needed for this test" , 3
        unless Dancer::ModuleLoader->load('JSON');

    setting serializer => 'JSON';
    ok $res->content_type('application/json');
    ok $res->content({ key => 'value'});

    is_deeply(Dancer::Handler->render_response(Dancer::Serializer->process_response($res)),
        [
            200,
            [ 'Content-Length', 0, 'Content-Type', 'application/json; charset=utf-8' ],
            [ JSON::to_json({ key => 'value' }) ],
        ],
    );
}

SKIP: {
    skip "XML::Simple is needed for this test" , 3
        unless Dancer::ModuleLoader->load('XML::Simple');

    skip "XML::Parser or XML::SAX are needed to run this test", 3
        unless Dancer::ModuleLoader->load('XML::Parser') or
               Dancer::ModuleLoader->load('XML::SAX');

    setting serializer => 'XML';
    ok $res->content_type('text/xml');
    ok $res->content({ key => "\x{0429}" });

    is_deeply(Dancer::Handler->render_response(Dancer::Serializer->process_response($res)),
        [
            200,
            [ 'Content-Length', 0, 'Content-Type', 'text/xml; charset=utf-8' ],
            [ Encode::encode('utf-8', XML::Simple::XMLout( { key => "\x{0429}"
                    }, RootName => 'data' )) ],
        ],
    );
}