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

use lib qw(t/lib);
use ZapziTestDatabase;

use App::Zapzi;
use App::Zapzi::Articles qw(get_article get_articles add_article move_article
                            delete_article articles_summary export_article);

test_can();

my ($test_dir, $app) = ZapziTestDatabase::get_test_app();

test_get();
test_add();
test_move();
test_export();
test_delete();
test_summary();

done_testing();

sub test_can
{
    can_ok( 'App::Zapzi::Articles', qw(get_article get_articles add_article
                                       move_article delete_article
                                       articles_summary export_article) );
}

sub test_get
{
    my $first = get_article(1);
    ok( $first, 'Can read Inbox first article' );
    is( $first->id, 1, 'Inbox first article ID is 1' );

    my $now = DateTime->now(time_zone => 'local');
    is( $first->created->delta_days($now)->days, 0,
        'Date inflated in articles OK' );

    my $false_article = get_article(0);
    ok( ! $false_article, 'Can detect articles that do not exist' );
}

sub test_add
{
    my $art = add_article(title => 'Foo',
                          folder => 'Inbox',
                          source => '/path/to/foo',
                          text => 'This is the text for the Foo article');
    my $foo = get_article($art->id);
    ok( $foo, 'Can add articles' );

    my $inbox = get_articles('Inbox');
    is( $inbox->count, 2, 'Two articles in Inbox as expected' );

    eval { add_article(); };
    like( $@, qr/Must provide/, 'Detects missing args to add_article' );

    eval { add_article(title => 'Foo2', source => 'src',
                       folder => 'Does not exist'); };
    like( $@, qr/does not exist/,
          'Detects non-existent folder to add_article' );
}

sub test_export
{
    my $art = export_article(1);
    like( $art, qr/<html><head>/, 'Export article OK' );

    $art = export_article(0);
    is( $art, undef, 'Detects missing args to export_article' );
}

sub test_move
{
    my $art = add_article(title => 'Baz',
                          folder => 'Inbox',
                          source => '/path/to/baz',
                          text => 'This is the text for the Baz article');
    my $baz = get_article($art->id);
    ok( move_article($baz->id, 'Archive'), 'Move article' );
    my $baz2 = get_article($art->id);
    is( $baz2->folder->name, 'Archive', 'Can move articles OK');

    eval { move_article(); };
    like( $@, qr/does not exist/, 'Detects missing args to move_article' );
}

sub test_delete
{
    my $art = add_article(title => 'Bar',
                          folder => 'Inbox',
                          source => '/path/to/bat',
                          text =>
                          'This is the text for the Bar article');
    my $bar = get_article($art->id);
    my $bar_id = $bar->id;
    ok( delete_article($bar_id), 'Can delete articles' );

    my $bar2 = get_article($bar_id);
    ok( ! $bar2, 'Can delete articles OK' );

    ok( delete_article(0), 'Will skip delete for articles that do not exist' );
}

sub test_summary
{
    my $summary = articles_summary('Inbox');

    ok( $summary, 'Can get articles summary' );
    is( scalar(@$summary), 2, 'Two articles found in summary');
    my @foo = grep { $_->{title} eq 'Foo' } @$summary;
    is( scalar(@foo), 1, 'One foo article found in summary' );

    eval { articles_summary('No such folder'); };
    like( $@, qr/does not exist/, 'Can detect non-existent folders' );
}