use strict;
use warnings;
use lib 't/lib';

use Test::More;
use Test::Fatal;
use TestDBH;
use TestEnv;

use Author;
use Thread;
use Reply;
use Notification;

subtest 'find deeply nested' => sub {
    _setup();

    my $author1 = Author->new(name  => 'vti')->create;
    my $author2 = Author->new(name  => 'bar')->create;
    my $thread  = Thread->new(title => 'foo', author_id => $author1->get_column('id'))->create;
    my $reply1 = Reply->new(
        content   => 'foo',
        author_id => $author1->get_column('id'),
        thread_id => $thread->get_column('id')
    )->create;
    my $reply2 = Reply->new(
        content   => 'foo2',
        parent_id => $reply1->get_column('id'),
        author_id => $author2->get_column('id'),
        thread_id => $thread->get_column('id')
    )->create;

    Notification->new(reply_id => $reply1->get_column('id'))->create;
    Notification->new(reply_id => $reply2->get_column('id'))->create;

    my @notifications = Notification->find(
        with => [
            qw/
              reply.author
              reply.thread.author
              reply.parent.author
              /
        ]
    );

    is @notifications, 2;

    is $notifications[0]->related('reply')->get_column('content'), 'foo';
    is $notifications[0]->related('reply')->related('author')->get_column('name'),  'vti';
    is $notifications[0]->related('reply')->related('thread')->get_column('title'), 'foo';
    ok !$notifications[0]->related('reply')->related('parent');

    is $notifications[1]->related('reply')->get_column('content'), 'foo2';
    is $notifications[1]->related('reply')->related('author')->get_column('name'),    'bar';
    is $notifications[1]->related('reply')->related('thread')->get_column('title'),   'foo';
    is $notifications[1]->related('reply')->related('parent')->get_column('content'), 'foo';
    is $notifications[1]->related('reply')->related('parent')->related('author')->get_column('name'), 'vti';
};

done_testing;

sub _setup {
    TestEnv->prepare_table('author');
    TestEnv->prepare_table('thread');
    TestEnv->prepare_table('reply');
    TestEnv->prepare_table('notification');
}
