The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use t::Utils;
use Mock::Tests::Basic;
use Data::Model::Driver::DBI;
use Test::More;

BEGIN {
    plan skip_all => "Set TEST_MYSQL environment variable to run this test"
        unless $ENV{TEST_MYSQL};
    plan tests => 31;
};

BEGIN {
    my $dbfile = temp_filename;
    our $DRIVER = Data::Model::Driver::DBI->new(
        dsn => 'dbi:mysql:database=test',
    );
    use_ok('Mock::Basic');
    use_ok('Mock::Index');
    use_ok('Mock::ColumnSugar');
    use_ok('Mock::ColumnSugar2');
    use_ok('Mock::SchemaOptions');
}


my $mock = Mock::Basic->new;

my @user = $mock->get_schema('user')->sql->as_sql;
is scalar(@user), 1;
is($user[0], "CREATE TABLE user (
    id              CHAR(255)      ,
    name            CHAR(255)      ,
    PRIMARY KEY (id)
)");

my @bookmark = $mock->get_schema('bookmark')->sql->as_sql;
is scalar(@bookmark), 1;
is($bookmark[0], "CREATE TABLE bookmark (
    id              INT             AUTO_INCREMENT,
    url             CHAR(255)      ,
    PRIMARY KEY (id),
    UNIQUE url (url)
)");

my @bookmark_user = $mock->get_schema('bookmark_user')->sql->as_sql;
is scalar(@bookmark_user), 1;
is($bookmark_user[0], "CREATE TABLE bookmark_user (
    bookmark_id     CHAR(100)      ,
    user_id         CHAR(100)      ,
    PRIMARY KEY (bookmark_id, user_id),
    INDEX user_id (user_id)
)");



$mock = Mock::Index->new;

my @multi_keys = $mock->get_schema('multi_keys')->sql->as_sql;
is scalar(@multi_keys), 1;
is($multi_keys[0], "CREATE TABLE multi_keys (
    key1            CHAR(255)      ,
    key2            CHAR(255)      ,
    key3            CHAR(255)      ,
    PRIMARY KEY (key1, key2, key3)
)");

my @multi_unique = $mock->get_schema('multi_unique')->sql->as_sql;
is scalar(@multi_unique), 1;
is($multi_unique[0], "CREATE TABLE multi_unique (
    c_key           INT             AUTO_INCREMENT,
    unq1            CHAR(255)      ,
    unq2            CHAR(255)      ,
    unq3            CHAR(255)      ,
    PRIMARY KEY (c_key),
    UNIQUE unq (unq1, unq2, unq3)
)");

my @multi_index = $mock->get_schema('multi_index')->sql->as_sql;
is scalar(@multi_index), 1;
is($multi_index[0], "CREATE TABLE multi_index (
    c_key           INT             AUTO_INCREMENT,
    idx1            CHAR(255)      ,
    idx2            CHAR(255)      ,
    idx3            CHAR(255)      ,
    PRIMARY KEY (c_key),
    INDEX idx (idx1, idx2, idx3)
)");


$mock = Mock::ColumnSugar->new;

my @author = $mock->get_schema('author')->sql->as_sql;
is scalar(@author), 1;
is($author[0], "CREATE TABLE author (
    id              INT             UNSIGNED NOT NULL AUTO_INCREMENT,
    name            VARCHAR(128)    NOT NULL,
    PRIMARY KEY (id)
)");

my @book = $mock->get_schema('book')->sql->as_sql;
is scalar(@book), 1;
is($book[0], "CREATE TABLE book (
    id              INT             UNSIGNED NOT NULL AUTO_INCREMENT,
    author_id       INT             UNSIGNED NOT NULL,
    sub_author_id   INT             UNSIGNED,
    title           VARCHAR(255)    NOT NULL,
    description     TEXT            NOT NULL DEFAULT 'not yet writing',
    recommend       TEXT           ,
    PRIMARY KEY (id),
    INDEX author_id (author_id)
)");


$mock = Mock::ColumnSugar2->new;
my @author2 = $mock->get_schema('author')->sql->as_sql;
is scalar(@author2), 1;
is($author2[0], "CREATE TABLE author (
    id              CHAR(32)        NOT NULL,
    name            VARCHAR(128)    NOT NULL,
    PRIMARY KEY (id)
)");


$mock = Mock::SchemaOptions->new;
my @unq = $mock->get_schema('unq')->sql->as_sql;
is scalar(@unq), 1;
is($unq[0], "CREATE TABLE unq (
    id1             CHAR(255)      ,
    id2             CHAR(255)      ,
    UNIQUE unq_1 (id1, id2),
    UNIQUE unq_2 (id2, id1)
) TYPE=InnoDB");

my @unq2 = $mock->get_schema('unq2')->sql->as_sql;
is scalar(@unq2), 1;
is($unq2[0], "CREATE TABLE unq2 (
    id1             CHAR(255)      ,
    id2             CHAR(255)      ,
    UNIQUE unq_2 (id2, id1),
    UNIQUE unq_1 (id1, id2)
) TYPE=InnoDB");

my @in_bin = $mock->get_schema('in_bin')->sql->as_sql;
is scalar(@in_bin), 1;
is($in_bin[0], "CREATE TABLE in_bin (
    name            BINARY(64)     
)");

my @in_bin_option = $mock->get_schema('in_bin_option')->sql->as_sql;
is scalar(@in_bin_option), 1;
is($in_bin_option[0], "CREATE TABLE in_bin_option (
    name            VARCHAR(64)     BINARY
)");