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

# Tests for undo feature. We do a couple of undo-able
# functions, then we undo them.

use strict;
use warnings;
use Test::More tests => 7;

use WebService::RTMAgent;
use File::Copy;
copy("t/config","/tmp/config") or die "Could not copy config file to /tmp\n";
$WebService::RTMAgent::config_file = "/tmp/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");

ok($ua->tasks_add("name=\"A new task\""), "Adding a task");
ok($WebService::RTMAgent::config->{undo}->[0]->{op} eq "rtm.tasks.add", "Stored undo info");

ok($ua->tasks_add("name=\"A new task\""), "Adding another task");
ok($WebService::RTMAgent::config->{undo}->[1]->{op} eq "rtm.tasks.add", "Stored undo info");

use Data::Dumper;
my $undoable = $ua->get_undoable;
ok($undoable->[1]->{op} eq "rtm.tasks.add", "get_undoable returns list");

# The actual undo doesn't need to be tested, it's just a
# normal request using what's in the list.

ok($ua->clear_undo(1), "Remove an undoable");
ok(scalar @{$ua->get_undoable} == 1, "remove worked");