The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

use Test::More tests => 7;

use_ok('URI',1.56);
require_ok('JSON::RPC::LWP');

my $rpc = new_ok 'JSON::RPC::LWP';

use FindBin;
use File::Spec;

# file:// transport does't handle POST requests
$rpc->prefer_get(1);

my $error_file = File::Spec->catfile($FindBin::Bin,'error.json');
my $fine_file  = File::Spec->catfile($FindBin::Bin,'fine.json');
my $empty_file = File::Spec->catfile($FindBin::Bin,'empty.json');

my $error_text =
qq[{"jsonrpc":"2.0","error":{"data":null,"message":"error","code":101},"id":1}\n];
my $fine_text = qq[{"jsonrpc":"2.0","id":2,"result":"fine"}\n];

SKIP: {
  note 'Checking ->call with an error response';
  open my $fh, '>', $error_file
    or skip "error creating $error_file", 1;

  print {$fh} $error_text
    or skip "error printing to $error_file", 1;

  close $fh
    or skip "error closing $error_file", 1;

  my $error = $rpc->call("file://${FindBin::Bin}/error.json",'test');
  ok $error->has_error, 'test for returned errors from ->call';
}
SKIP: {
  note 'Checking ->call with a regular response';
  open my $fh, '>', $fine_file
    or skip "error creating $fine_file", 1;

  print {$fh} $fine_text
    or skip "error printing to $fine_file", 1;

  close $fh
    or skip "error closing $fine_file", 1;

  my $fine = $rpc->call("file://${FindBin::Bin}/fine.json",'test');
  ok $fine->has_result, 'test for normal return value from ->call';
}
SKIP: {
  note 'Checking ->notify with a normal response';
  open my $fh, '>', $empty_file
    or skip "error creating $empty_file", 1;

  print {$fh} ''
    or skip "error printing to $empty_file", 1;

  close $fh
    or skip "error closing $empty_file", 1;

  my $blank = $rpc->notify("file://${FindBin::Bin}/empty.json",'test');
  ok $blank->is_success, 'test for normal return value from ->notify';
}
SKIP: {
  note 'Checking ->notify with an error response';

  my $blank = $rpc->notify("file://${FindBin::Bin}/nonexistent",'test');
  ok $blank->is_error, 'test for error return value from ->notify';
}