The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use lib 't/lib';

use Test::More;
use Test::Exception;
use Test::Fixture::DBI;
use Test::Fixture::DBI::Connector::mysql;

my $connector = 'Test::Fixture::DBI::Connector::mysql';
my ( $dbh, $mysqld ) = $connector->dbh;

sub setup_test {
    my $dbh = shift;
    $dbh->do('DROP DATABASE test');
    $dbh->do('CREATE DATABASE test');
    $dbh->do('USE test');
}

subtest 'default' => sub {
    setup_test($dbh);

    my $database = construct_database(
        dbh      => $dbh,
        database => 't/mysql/schema.yaml',
        schema   => [qw/people/],
    );

    lives_ok(
        sub {
            construct_fixture(
                dbh     => $dbh,
                fixture => [
                    +{
                        name   => 'zigorou',
                        schema => 'people',
                        data   => +{
                            id         => 1,
                            nickname   => 'zigorou',
                            status     => 0,
                            created_on => '2010-06-28 12:30:30',
                            updated_on => '2010-06-28 12:35:00',
                        },
                    },
                    +{
                        name   => 'hidek',
                        schema => 'people',
                        data   => +{
                            id         => 2,
                            nickname   => 'hidek',
                            status     => 1,
                            created_on => '2010-06-28 12:30:30',
                            updated_on => '2010-06-28 12:35:00',
                        },
                    },
                    +{
                        name   => 'xaicron',
                        schema => 'people',
                        data   => +{
                            id         => 3,
                            nickname   => 'xaicron',
                            status     => 2,
                            created_on => '2010-06-28 12:30:30',
                            updated_on => '2010-06-28 12:35:00',
                        },
                    },
                ],
            );
        },
        'construct_fixture() will be success'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'zigorou', status => 0, },
            +{ id => 2, nickname => 'hidek',   status => 1, },
            +{ id => 3, nickname => 'xaicron', status => 2, },
        ],
        'fixture data test'
    );

    lives_ok(
        sub {
            construct_fixture(
                dbh     => $dbh,
                fixture => [
                    +{
                        name   => 'arisawa',
                        schema => 'people',
                        data   => +{
                            id         => 1,
                            nickname   => 'arisawa',
                            status     => 0,
                            created_on => '2010-06-28 12:30:30',
                            updated_on => '2010-06-28 12:35:00',
                        },
                    },
                ],
            );
        },
        'construct_fixture() will be success (re-insert)'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'arisawa', status => 0, },
        ],
        'fixture data test (re-insert)'
    );

    done_testing;
};

subtest 'from yaml' => sub {
    setup_test($dbh);

    my $database = construct_database(
        dbh      => $dbh,
        database => 't/mysql/schema.yaml',
        schema   => [qw/people/],
    );

    lives_ok(
        sub {
            construct_fixture(
                dbh     => $dbh,
                fixture => 't/people_fixture_001.yaml',
            );
        },
        'construct_fixture() will be success'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'zigorou', status => 0, },
            +{ id => 2, nickname => 'hidek',   status => 1, },
            +{ id => 3, nickname => 'xaicron', status => 2, },
        ],
        'fixture data test'
    );

    lives_ok(
        sub {
            construct_fixture(
                dbh     => $dbh,
                fixture => 't/people_fixture_002.yaml',
            );
        },
        'construct_fixture() will be success (re-insert)'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'arisawa', status => 0, },
        ],
        'fixture data test (re-insert)'
    );

    done_testing;
};

subtest 'multiple fixture' => sub {
    setup_test($dbh);

    my $database = construct_database(
        dbh      => $dbh,
        database => 't/mysql/schema.yaml',
        schema   => [qw/people friend/],
    );

    lives_ok(
        sub {
            construct_fixture(
                dbh => $dbh,
                fixture => [
                    +{
                        'name' => 'zigorou',
                        'data' => {
                            'nickname' => 'zigorou',
                            'status' => '0',
                            'created_on' => '2010-06-28 12:30:30',
                            'id' => '1',
                            'updated_on' => '2010-06-28 12:35:00'
                        },
                        'schema' => 'people'
                    },
                    +{
                        'name' => 'hidek',
                        'data' => {
                            'nickname' => 'hidek',
                            'status' => '1',
                            'created_on' => '2010-06-28 12:30:30',
                            'id' => '2',
                            'updated_on' => '2010-06-28 12:35:00'
                        },
                        'schema' => 'people'
                    },
                    +{
                        'name' => 'xaicron',
                        'data' => {
                            'nickname' => 'xaicron',
                            'status' => '2',
                            'created_on' => '2010-06-28 12:30:30',
                            'id' => '3',
                            'updated_on' => '2010-06-28 12:35:00'
                        },
                        'schema' => 'people'
                    },
                    +{
                        'name' => 'friend_1',
                        'data' => {
                            'created_on' => '2010-06-28 13:30:30',
                            'status' => '0',
                            'friend_id' => '1',
                            'id' => '1',
                            'updated_on' => '2010-06-28 13:35:00'
                        },
                        'schema' => 'friend'
                    },
                    +{
                        'name' => 'friend_2',
                        'data' => {
                            'created_on' => '2010-06-28 14:30:30',
                            'status' => '1',
                            'friend_id' => '2',
                            'id' => '2',
                            'updated_on' => '2010-06-28 14:35:00'
                        },
                        'schema' => 'friend'
                    },
                    +{
                        'name' => 'friend_3',
                        'data' => {
                            'created_on' => '2010-06-28 15:30:30',
                            'status' => '2',
                            'friend_id' => '3',
                            'id' => '3',
                            'updated_on' => '2010-06-28 15:35:00'
                        },
                        'schema' => 'friend'
                    }
                ],
            );
        },
        'construct_fixture() will be success'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'zigorou', status => 0, },
            +{ id => 2, nickname => 'hidek',   status => 1, },
            +{ id => 3, nickname => 'xaicron', status => 2, },
        ],
        'fixture people test'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, friend_id, status FROM friend ORDER BY friend_id ASC',
            +{ Slice => +{} },
        ),
        [
            +{ id => 1, friend_id => 1, status => 0, },
            +{ id => 2, friend_id => 2, status => 1, },
            +{ id => 3, friend_id => 3, status => 2, },
        ],
        'fixture friend test'
    );

    done_testing;
};

subtest 'multiple fixture from yaml' => sub {
    setup_test($dbh);

    my $database = construct_database(
        dbh      => $dbh,
        database => 't/mysql/schema.yaml',
        schema   => [qw/people friend/],
    );
    
    lives_ok(
        sub {
            construct_fixture(
                dbh     => $dbh,
                fixture => [
                    't/people_fixture_001.yaml',
                    't/friend_fixture.yaml',
                ],
            );
        },
        'construct_fixture() will be success'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, nickname, status FROM people ORDER BY id ASC',
            +{ Slice => +{} }
        ),
        [
            +{ id => 1, nickname => 'zigorou', status => 0, },
            +{ id => 2, nickname => 'hidek',   status => 1, },
            +{ id => 3, nickname => 'xaicron', status => 2, },
        ],
        'fixture people test'
    );

    is_deeply(
        $dbh->selectall_arrayref(
            'SELECT id, friend_id, status FROM friend ORDER BY friend_id ASC',
            +{ Slice => +{} },
        ),
        [
            +{ id => 1, friend_id => 1, status => 0, },
            +{ id => 2, friend_id => 2, status => 1, },
            +{ id => 3, friend_id => 3, status => 2, },
        ],
        'fixture friend test'
    );
    done_testing;
};

$dbh->disconnect;

done_testing;

# Local Variables:
# mode: perl
# perl-indent-level: 4
# indent-tabs-mode: nil
# coding: utf-8-unix
# End:
#
# vim: expandtab shiftwidth=4: