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

use strict;
use warnings;
use Test::More qw(no_plan);
use Test::Exception;
use Test::Warn;
use blib;
use lib "t/tlib";
use CGI::JSONRPC;
use CGI::JSONRPC::Dispatcher::Test;

my $request = {
  id => 1,
  method => "test_good",
  params => [ 'CGI.JSONRPC.Dispatcher.Test', 2 ],
};
   
my $rpc = CGI::JSONRPC->new;
is($rpc->run_data_request($request), '{"id":1,"result":[[1," so there ",2]]}', "Good request is dispatched");
$request->{method} = "test_protected";

my $rv;
my $error = "CGI::JSONRPC::Dispatcher::Test::test_protected may not be dispatched";

warning_like
  { $rv = $rpc->run_data_request($request) }
  qr/\Q$error\E/, "Fatal errors are warned";

like($rv, qr/\Q"error":"$error\E/, "Protected method is not dispatched");

$request->{method} = "test_missing";

$error = qq{Can't locate object method "test_missing" via package "CGI::JSONRPC::Dispatcher::Test};

warning_like
  { $rv = $rpc->run_data_request($request) }
  qr/\Q$error\E/, "Missing method warns with an error";

$error =~ s{"}{\\"}g;

like($rv, qr/\Q"error":"$error\E/, "Error will be returned to the browser");
unlike($rv, qr/line \d+/, "Line number is *not* returned to the browser");