The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

BEGIN {
    use FindBin;
    use lib "$FindBin::Bin/lib";
    
    chdir 't' if -d 't';
    use lib qw[../lib inc];

    require 'local_request.pl';
}

use Test::More  'no_plan';
use Catalyst::Test 'TestApp';

use JSON;
use HTTP::Request;
use Data::Dumper;

### Change config to show errors
TestApp->server->jsonrpc->config->show_errors(1);

my %RpcArgs     = ( 1 => "b" );
#my %RpcRv       = ( auto => 1, begin => 1, end => 1, input => \%RpcArgs );
my %RpcRv       = ( auto => 1, begin => 1, end => 1 );
my $EntryPoint  = 'http://localhost/rpc';
my $Prefix      = 'rpc.errors.';
my %Methods     = (
    # method name       # rv
    'privateonly'   => {'Error' => 'Invalid JSONRPC request: No such method',
                        'stash' => 'privateonly',
                        },
    'localonly'     => {'Error' => 'Invalid JSONRPC request: No such method',
                        'stash' => 'privateonly',
                        },
    ### Check if call does not fallback on another method
    'remoteonly.ne' => {'Error' => 'Invalid JSONRPC request: No such method',
                        'stash' => 'privateonly',
                        },
);


### Some defaults
sub shoot {
    my ($meth, $content) = @_;
    if (!$content) {
        my $call = {version=>'1.1', method=>$meth, params=>\%RpcArgs, id=>1};
        $content = JSON::to_json($call);
    }

    my $req = HTTP::Request->new( POST => $EntryPoint );
    $req->header( 'Content-Length'  => length($content) );
    $req->header( 'Content-Type'    => 'application/json' );
    $req->content( $content );
    my $res = request( $req );
}

while ( my($meth,$data) = each %Methods ) {

    my $res = shoot($meth);

    ok( $res,                   "Got response on '$meth'" );
    ok( $res->is_success,       "   Response successfull 2XX" );
    is( $res->code, 200,        "   Reponse code 200" );
    my $rv = JSON::from_json( $res->content );

    #is_deeply( $data, $rv,     "   Return value as expected" );
    is($rv->{error}->{message}, 'Invalid JSONRPC request: No such method', 'Got faultString "No such method"');
}

### This content is NOT VALID json check
{
    my $res = shoot((keys %Methods)[0], 'bLegH');
    my $data = JSON::from_json( $res->content );

    if (UNIVERSAL::isa($data, 'HASH') && $data->{error}) {
        like($data->{error}->{message}, qr/Invalid JSONRPC request.*malformed JSON string/s,'Got error "malformed JSON string"');
    }
}