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 )