The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Plack::Test;
use HTTP::Request::Common;
use JSON::MaybeXS;

{
    package App;
    use Dancer2;
    set serializer => 'JSON';

    post '/' => sub {
        my $post_params = params('body');

        # should work even with empty post body
        my $foo = $post_params->{'foo'};
        return { foo => $foo };
    };
}

my $test = Plack::Test->create( App->to_app );
my %headers;

subtest 'Basic response failing' => sub {
    TODO: {
        local $TODO = '500 when deserializing bad input';
        my $res = $test->request( POST '/', { foo => 'bar' }, %headers );
        is( $res->code, 500, '[POST /] Failed when sending regular params' );
    }
};

subtest 'Basic response' => sub {
    my $res = $test->request(
        POST '/',
        %headers,
        Content => encode_json { foo => 'bar' }
    );

    is( $res->code, 200, '[POST /] Correct response code' );

    my $response_data = decode_json( $res->decoded_content );
    is($response_data->{foo}, 'bar', "[POST /] Correct response data");
};

subtest 'Empty POST' => sub {
    my $res = $test->request( POST '/', {}, %headers );
    is(
        $res->code,
        200,
        '[POST /] Correct response code with empty post body',
    );
};

done_testing();