AnyEvent-WebService-Tracks
view release on metacpan or search on metacpan
t/04-todo.t view on Meta::CPAN
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/lib";
use List::MoreUtils qw(all);
use Scalar::Util qw(looks_like_number);
use Storable qw(dclone);
use Test::AnyEvent::WebService::Tracks;
use Test::Exception;
use UNIVERSAL ();
my @orig_todos = ('Walk the dog', 'Finish TPS report', 'Take out the trash',
'Install Tracks');
my @todos = @orig_todos;
plan tests => 83 * @todos + 124;
my $tracks = get_tracks;
my $ctx;
run_tests_in_loop {
my ( $cond ) = @_;
$tracks->contexts(sub {
my ( $contexts ) = @_;
unless(@$contexts) {
$cond->send;
return;
}
my $run;
$run = sub {
my $ctx = shift @$contexts;
$ctx->destroy(sub {
if(@$contexts) {
$run->();
} else {
$cond->send;
}
});
};
$run->();
});
};
run_tests_in_loop {
my ( $cond ) = @_;
$tracks->create_context(name => 'Test Context', sub {
( $ctx ) = @_;
ok($ctx);
$cond->send;
});
};
run_tests_in_loop {
my ( $cond ) = @_;
my $run;
$run = sub {
my $desc = shift @todos;
$tracks->create_todo($desc, $ctx, sub {
my ( $todo ) = @_;
ok($todo);
isa_ok($todo, 'AnyEvent::WebService::Tracks::Todo');
is($todo->description, $desc);
ok(! defined($todo->due));
ok(! defined($todo->notes));
ok(! defined($todo->show_from));
ok($todo->is_active);
ok(! $todo->is_project_hidden);
ok(! $todo->is_complete);
ok(! $todo->is_deferred);
ok(looks_like_number $todo->id);
ok(! $todo->completed_at);
ok(! $todo->recurring_todo_id);
isa_ok($todo->created_at, 'DateTime');
isa_ok($todo->updated_at, 'DateTime');
dies_ok {
$todo->completed_at(DateTime->now);
};
dies_ok {
$todo->created_at(DateTime->now);
};
dies_ok {
$todo->updated_at(DateTime->now);
};
dies_ok {
$todo->id(0);
};
dies_ok {
$todo->recurring_todo_id(0);
};
lives_ok {
$todo->description('Test description');
};
lives_ok {
$todo->due(DateTime->now);
};
lives_ok {
$todo->notes('Test notes');
};
lives_ok {
$todo->show_from(DateTime->now);
};
$todo->context(sub {
my ( $c ) = @_;
is($c->id, $ctx->id);
$todo->project(sub {
my ( $p, $e ) = @_;
ok(! defined($p));
ok(! defined($e));
if(@todos) {
$run->();
} else {
$cond->send;
}
});
});
});
};
$run->();
};
run_tests_in_loop {
my ( $cond ) = @_;
$tracks->todos(sub {
my ( $todos ) = @_;
is(scalar(@$todos), scalar(@orig_todos));
ok(all { UNIVERSAL::isa($_, 'AnyEvent::WebService::Tracks::Todo') } @$todos);
my $run;
$run = sub {
my $todo = shift @$todos;
$todo->destroy(sub {
my ( $ok ) = @_;
ok($ok);
if(@$todos) {
$run->();
} else {
$cond->send;
}
});
};
$run->();
});
};
@todos = @orig_todos;
run_tests_in_loop {
my ( $cond ) = @_;
my $run;
$run = sub {
my $desc = shift @todos;
$tracks->create_todo(description => $desc, context => $ctx, sub {
my ( $todo ) = @_;
ok($todo);
isa_ok($todo, 'AnyEvent::WebService::Tracks::Todo');
is($todo->description, $desc);
ok(! defined($todo->due));
ok(! defined($todo->notes));
ok(! defined($todo->show_from));
ok($todo->is_active);
ok(! $todo->is_project_hidden);
ok(! $todo->is_complete);
ok(! $todo->is_deferred);
ok(looks_like_number $todo->id);
ok(! $todo->completed_at);
ok(! $todo->recurring_todo_id);
isa_ok($todo->created_at, 'DateTime');
isa_ok($todo->updated_at, 'DateTime');
dies_ok {
$todo->completed_at(DateTime->now);
};
dies_ok {
$todo->created_at(DateTime->now);
};
dies_ok {
$todo->updated_at(DateTime->now);
};
dies_ok {
$todo->id(0);
};
dies_ok {
$todo->recurring_todo_id(0);
};
lives_ok {
$todo->description('Test description');
};
lives_ok {
$todo->due(DateTime->now);
};
lives_ok {
$todo->notes('Test notes');
};
lives_ok {
$todo->show_from(DateTime->now);
};
$todo->context(sub {
my ( $c ) = @_;
is($c->id, $ctx->id);
$todo->project(sub {
my ( $p, $e ) = @_;
ok(! defined($p));
ok(! defined($e));
if(@todos) {
$run->();
} else {
$cond->send;
}
});
});
});
};
$run->();
};
run_tests_in_loop {
my ( $cond ) = @_;
$tracks->todos(sub {
my ( $todos ) = @_;
my $run;
$run = sub {
my $todo = shift @$todos;
$todo->destroy(sub {
my ( $ok ) = @_;
ok($ok);
if(@$todos) {
$run->();
} else {
$cond->send;
}
});
};
$run->();
});
};
@todos = @orig_todos;
run_tests_in_loop {
my ( $cond ) = @_;
my $i = 1;
my $run;
$run = sub {
my $desc = shift @todos;
my $notes = "notes$i";
$tracks->create_todo(description => $desc, notes => $notes, context => $ctx, sub {
my ( $todo ) = @_;
ok($todo);
isa_ok($todo, 'AnyEvent::WebService::Tracks::Todo');
is($todo->description, $desc);
is($todo->notes, $notes);
ok(! defined($todo->due));
ok(! defined($todo->show_from));
ok($todo->is_active);
ok(! $todo->is_project_hidden);
ok(! $todo->is_complete);
ok(! $todo->is_deferred);
ok(looks_like_number $todo->id);
ok(! $todo->completed_at);
ok(! $todo->recurring_todo_id);
isa_ok($todo->created_at, 'DateTime');
isa_ok($todo->updated_at, 'DateTime');
dies_ok {
$todo->completed_at(DateTime->now);
};
dies_ok {
$todo->created_at(DateTime->now);
};
dies_ok {
$todo->updated_at(DateTime->now);
};
dies_ok {
$todo->id(0);
};
dies_ok {
$todo->recurring_todo_id(0);
};
lives_ok {
$todo->description('Test description');
};
lives_ok {
$todo->due(DateTime->now);
};
lives_ok {
$todo->notes('Test notes');
};
lives_ok {
$todo->show_from(DateTime->now);
};
$todo->context(sub {
my ( $c ) = @_;
is($c->id, $ctx->id);
$todo->project(sub {
my ( $p, $e ) = @_;
ok(! defined($p));
ok(! defined($e));
if(@todos) {
$run->();
} else {
$cond->send;
}
});
});
});
};
$run->();
};
run_tests_in_loop {
my ( $cond ) = @_;
( run in 0.909 second using v1.01-cache-2.11-cpan-0b5f733616e )