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

use lib 't/lib';

use TestDBH;
use TestEnv;
use Author;
use Thread;
use Reply;
use Notification;

describe 'one to many' => sub {

    before each => sub {
        TestEnv->prepare_table('author');
        TestEnv->prepare_table('thread');
        TestEnv->prepare_table('reply');
        TestEnv->prepare_table('notification');
    };

    it '123' => sub {
        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';

        #use Data::Dumper; warn Dumper($notifications[1]->to_hash);
    };

};

runtests unless caller;