DBIx-Class-Schema-Loader

 view release on metacpan or  search on metacpan

t/10_06sybase_common.t  view on Meta::CPAN

        # Timestamp column
        timestamp      => { data_type => 'timestamp', inflate_datetime => 0 },

        # String Types
        'char'         => { data_type => 'char', size => 1 },
        'char(2)'      => { data_type => 'char', size => 2 },
        'nchar'        => { data_type => 'nchar', size => 1 },
        'nchar(2)'     => { data_type => 'nchar', size => 2 },
        'unichar(2)'   => { data_type => 'unichar', size => 2 },
        'varchar(2)'   => { data_type => 'varchar', size => 2 },
        'nvarchar(2)'  => { data_type => 'nvarchar', size => 2 },
        'univarchar(2)' => { data_type => 'univarchar', size => 2 },

        # Binary Types
        'binary'       => { data_type => 'binary', size => 1 },
        'binary(2)'    => { data_type => 'binary', size => 2 },
        'varbinary(2)' => { data_type => 'varbinary', size => 2 },
    },
    # test that named constraints aren't picked up as tables (I can't reproduce this on my machine)
    failtrigger_warnings => [ qr/^Bad table or view 'sybase_loader_test2_ref_slt1'/ ],
    extra => {
        create => [
            q{
                CREATE TABLE sybase_loader_test1 (
                    id int identity primary key
                )
            },
            q{
                CREATE TABLE sybase_loader_test2 (
                    id int identity primary key,
                    sybase_loader_test1_id int,
                    CONSTRAINT sybase_loader_test2_ref_slt1 FOREIGN KEY (sybase_loader_test1_id) REFERENCES sybase_loader_test1 (id)
                )
            },
        ],
        drop => [ qw/sybase_loader_test1 sybase_loader_test2/ ],
        count => 30 * 4,
        run => sub {
            $schema = shift;

            SKIP: {
                my $dbh = $schema->storage->dbh;

                try {
                    $dbh->do('USE master');
                }
                catch {
                    skip "these tests require the sysadmin role", 30 * 4;
                };

                try {
                    $dbh->do('CREATE DATABASE [dbicsl_test1]');
                    $dbh->do('CREATE DATABASE [dbicsl_test2]');
                }
                catch {
                    skip "cannot create databases: $_", 30 * 4;
                };

                try {
                    local $SIG{__WARN__} = sigwarn_silencer(
                        qr/^Password correctly set\.$|^Account unlocked\.$|^New login created\.$|^New user added\.$/
                    );

                    $dbh->do("sp_addlogin dbicsl_user1, dbicsl, [dbicsl_test1]");
                    $dbh->do("sp_addlogin dbicsl_user2, dbicsl, [dbicsl_test2]");

                    $dbh->do("USE [dbicsl_test1]");
                    $dbh->do("sp_adduser dbicsl_user1");
                    $dbh->do("sp_adduser dbicsl_user2");
                    $dbh->do("GRANT ALL TO dbicsl_user1");
                    $dbh->do("GRANT ALL TO dbicsl_user2");

                    $dbh->do("USE [dbicsl_test2]");
                    $dbh->do("sp_adduser dbicsl_user2");
                    $dbh->do("sp_adduser dbicsl_user1");
                    $dbh->do("GRANT ALL TO dbicsl_user2");
                    $dbh->do("GRANT ALL TO dbicsl_user1");
                }
                catch {
                    skip "cannot add logins: $_", 30 * 4;
                };

                my ($dbh1, $dbh2);
                {
                    local $SIG{__WARN__} = sigwarn_silencer(
                        qr/can't change context/
                    );
                    $dbh1 = DBI->connect($dsn, 'dbicsl_user1', 'dbicsl', {
                        RaiseError => 1,
                        PrintError => 0,
                    });
                    $dbh1->do('USE [dbicsl_test1]');

                    $dbh2 = DBI->connect($dsn, 'dbicsl_user2', 'dbicsl', {
                        RaiseError => 1,
                        PrintError => 0,
                    });
                    $dbh2->do('USE [dbicsl_test2]');
                }

                $dbh1->do(<<"EOF");
                    CREATE TABLE sybase_loader_test4 (
                        id INT IDENTITY PRIMARY KEY,
                        value VARCHAR(100) NULL
                    )
EOF
                $dbh1->do('GRANT ALL ON sybase_loader_test4 TO dbicsl_user2');
                $dbh1->do(<<"EOF");
                    CREATE TABLE sybase_loader_test5 (
                        id INT IDENTITY PRIMARY KEY,
                        value VARCHAR(100) NULL,
                        four_id INTEGER,
                        CONSTRAINT loader_test5_uniq UNIQUE (four_id),
                        FOREIGN KEY (four_id) REFERENCES sybase_loader_test4 (id)
                    )
EOF
                $dbh2->do(<<"EOF");
                    CREATE TABLE sybase_loader_test5 (
                        pk INT IDENTITY PRIMARY KEY,
                        value VARCHAR(100) NULL,
                        four_id INTEGER,

t/10_06sybase_common.t  view on Meta::CPAN

                                ->has_relationship('sybase_loader_test7');
                        } 'cross-database relationship in multi database schema';

                        lives_and {
                            ok $test_schema->source('SybaseLoaderTest7')
                                ->has_relationship('sybase_loader_test8s');
                        } 'cross-database relationship in multi database schema';
                    }
                }
            }
        },
    },
)->run_tests();

END {
    if (not $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) {
        rmtree EXTRA_DUMP_DIR;

        if ($databases_created) {
            my $dbh = $schema->storage->dbh;

            $dbh->do('USE master');

            local $dbh->{FetchHashKeyName} = 'NAME_lc';

            my $sth = $dbh->prepare('sp_who');
            $sth->execute;

            while (my $row = $sth->fetchrow_hashref) {
                if ($row->{dbname} =~ /^dbicsl_test[12]\z/) {
                    $dbh->do("kill $row->{spid}");
                }
            }

            foreach my $table ('[dbicsl_test1].dbicsl_user1.sybase_loader_test8',
                               '[dbicsl_test2].dbicsl_user2.sybase_loader_test7',
                               '[dbicsl_test2].dbicsl_user2.sybase_loader_test6',
                               '[dbicsl_test2].dbicsl_user2.sybase_loader_test5',
                               '[dbicsl_test1].dbicsl_user1.sybase_loader_test5',
                               '[dbicsl_test1].dbicsl_user1.sybase_loader_test4') {
                try {
                    $dbh->do("DROP TABLE $table");
                }
                catch {
                    diag "Error dropping table $table: $_";
                };
            }

            foreach my $db (qw/dbicsl_test1 dbicsl_test2/) {
                try {
                    $dbh->do("DROP DATABASE [$db]");
                }
                catch {
                    diag "Error dropping test database $db: $_";
                };
            }

            foreach my $login (qw/dbicsl_user1 dbicsl_user2/) {
                try {
                    local $SIG{__WARN__} = sigwarn_silencer(
                        qr/^Account locked\.$|^Login dropped\.$/
                    );

                    $dbh->do("sp_droplogin $login");
                }
                catch {
                    diag "Error dropping login $login: $_"
                        unless /Incorrect syntax/;
                };
            }
        }
    }
}
# vim:et sts=4 sw=4 tw=0:



( run in 1.869 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )