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 tests => 12;

use WebService::RTMAgent;
$WebService::RTMAgent::config_file = "t/config";

# Overload RTMAgent::request so as to not do any actual requests
# Instead, we use request.* files that contains the tested
# requests, and return the expected responses found in
# response.* files.
package RTMTestAgent;
use base 'WebService::RTMAgent';
use HTTP::Response;
use HTTP::Status;
# Load all the requests and expected responses.
my %responses;
foreach my $req_file (glob 't/request.*') {
    local $/; undef $/;
    open my $f, $req_file or die "Unable to open $req_file: $!\n";
    my $req = <$f>;
    my $res_file = $req_file;
    $res_file =~ s/request/response/;
    open $f, $res_file or die "Unable to open $res_file:$!\n";
    my $res = <$f>;
    $responses{$req} = $res;
}
sub request {
    my ($self, $req) = @_;
    my $req_str = $req->as_string;
    die "No such request:\n####\n$req_str####\n" unless exists $responses{$req_str};
    return HTTP::Response->parse($responses{$req_str});
}

package main;

my $ua = new RTMTestAgent;
$ua->api_key("key");
$ua->api_secret("secret");

my $sign = $ua->sign("key=val","cle=valeur","foo=bar");
ok($sign eq "c87afd21be10c9833aa077e248a3d607", "Signing requests");

ok($ua->init, "initialising");

my $lists = $ua->lists_getList;
ok(defined $lists, "request without parameters");

ok(exists $lists->{lists}, " -- checking structure 1");
ok(exists $lists->{lists}->[0]->{list}, " -- checking structure 2");
ok(exists $lists->{lists}->[0]->{list}->[0]->{name}, " -- checking structure 3");
ok($lists->{lists}->[0]->{list}->[0]->{name} eq 'Inbox', " -- checking structure 4");

my $tasks = $ua->tasks_getList("list_id=123");
ok(defined $tasks, "request with parameters");
ok($tasks->{tasks}->[0]->{list}->[0]->{taskseries}->[0]->{id} == 7417459, " -- task id is correct");

# This must kill us
eval {
    $ua->tasks_unknownMethod("param=0");
};
ok($@ =~ "rtm.tasks.unknownMethod does not exist\n", "Carp message");

# Call method with invalid parameters, with verbose (for
# better coverage :-) ).
$ua->verbose('netin netout');
$ua->rtm_tasks_add("nam=adding"); # Also tests method can start with 'rtm'
ok($ua->error eq "4000: Task name provided is invalid.\n", "Error setting");
$ua->verbose('');

# Failing request
eval {
    $ua->tasks_add("name=failing");
};
ok($@ =~ "403 Forbidden", "HTTP request failed");