AnyEvent-WebService-Tracks

 view release on metacpan or  search on metacpan

t/04-todo.t  view on Meta::CPAN


    $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 ) = @_;

    dies_ok {
        $tracks->create_todo(description => 'Foobar', sub {
            fail("I should never get called!");
        });
    };

    $cond->send;
};

run_tests_in_loop {
    my ( $cond ) = @_;

    dies_ok {
        $tracks->create_todo(description => 'Foobar', notes => 'Foobar', sub {
            fail("I should never be called!");
        });
    };
    $cond->send;
};

run_tests_in_loop {
    my ( $cond ) = @_;

    $tracks->create_project('Test Project', sub {
        my ( $project ) = @_;

        ok($project);

        dies_ok {
            $tracks->create_todo(
                description => 'Foobar',

t/04-todo.t  view on Meta::CPAN

        'completed', # active -> completed
        'deferred',  # completed -> deferred
        'active',    # deferred -> active
    );

    $tracks->todos(sub {
        my ( $todos ) = @_;

        my ( $one ) = @$todos;

        my $run;

        $run = sub {
            my $change = shift @state_changes;

            if($change eq 'deferred') {
                $one->defer(1);
            } elsif($change eq 'active') {
                $one->activate;
            } else {
                $one->complete;
            }

            $one->update(sub {
                my ( $t ) = @_;

                ok($t);

                if($change eq 'deferred') {
                    ok(! $t->is_active);
                    ok($t->is_deferred);
                    ok(! $t->is_complete);
                    ok($t->show_from);
                } elsif($change eq 'active') {
                    ok($t->is_active);
                    ok(! $t->is_deferred);
                    ok(! $t->is_complete);
                    ok(! $t->show_from);
                } else {
                    ok(! $t->is_active);
                    ok(! $t->is_deferred);
                    ok($t->is_complete);
                    ok(! $t->show_from);
                }

                if(@state_changes) {
                    $run->();
                } else {
                    $cond->send;
                }
            });
        };

        $run->();
    });
};

run_tests_in_loop {
    my ( $cond ) = @_;

    my $now      = DateTime->now;
    my $other    = $now->clone->add(days => 7, hours => 3, minutes => 1);
    my $duration = DateTime::Duration->new(days => 7, hours => 3, minutes => 1);
    my @defer    = (
        1         => $now->clone->add(days => 1),
        $other    => $other,
        $duration => $other,
    );

    $tracks->create_todo(
        description => 'Deferred Task',
        context     => $ctx,
        show_from   => $now->clone->add(days => 1),
    sub {
        my ( $todo ) = @_;

        ok($todo);
        ok($todo->is_deferred);
        ok($todo->show_from);
        my $expected = $now->clone->add(days => 1);
        if($expected->hour || $expected->minute || $expected->second) {
            $expected->set_hour(0);
            $expected->set_minute(0);
            $expected->set_second(0);
        };
        is($todo->show_from, $expected);

        my $run;

        $run = sub {
            my $arg      = shift @defer;
            my $expected = shift @defer;

            $todo->defer($arg);

            $todo->update(sub {
                my ( $t ) = @_;

                ok($t);
                ok($todo->is_deferred);
                ok($todo->show_from);
                if($expected->hour || $expected->minute || $expected->second) {
                    $expected->set_hour(0);
                    $expected->set_minute(0);
                    $expected->set_second(0);
                };
                is($todo->show_from, $expected);

                if(@defer) {
                    $run->();
                } else {
                    $cond->send;
                }
            });
        };

        $run->();
    });
};

run_tests_in_loop {
    my ( $cond ) = @_;

    my $time = DateTime->now;
    $time->set_hour(17);
    $time->set_minute(0);
    $time->set_second(0);

    $tracks->create_todo(
        description => 'Another Deferred Task',
        context     => $ctx,
        show_from   => $time->clone->add(days => 1),
    sub {
        my ( $todo ) = @_;

        ok($todo);

        my $expected = $time->clone->add(days => 1);
        if($expected->hour || $expected->minute || $expected->second) {
            $expected->set_hour(0);
            $expected->set_minute(0);
            $expected->set_second(0);
        };
        is($todo->show_from, $expected);
        $cond->send;
    });
};

run_tests_in_loop {
    my ( $cond ) = @_;

    my $time = DateTime->now;
    $time->set_hour(20);
    $time->set_minute(0);
    $time->set_second(0);

    $tracks->create_todo(
        description => 'Yet Another Deferred Task',
        context     => $ctx,
        show_from   => $time->clone->add(days => 1),
    sub {
        my ( $todo ) = @_;

        ok($todo);

        my $expected = $time->clone->add(days => 1);
        if($expected->hour || $expected->minute || $expected->second) {
            $expected->set_hour(0);
            $expected->set_minute(0);
            $expected->set_second(0);
        };
        is($todo->show_from, $expected);
        $cond->send;
    });
};

run_tests_in_loop {
    my ( $cond ) = @_;

    $tracks->todos(sub {
        my ( $todos ) = @_;

        my ( $one ) = @$todos;
        my $copy = dclone($one);

        $one->update(sub {
            my ( $t ) = @_;

            is_deeply($t, $copy);
            $cond->send;
        });
    });
};



( run in 1.070 second using v1.01-cache-2.11-cpan-39bf76dae61 )