Convert the tests with multiple DBDs to new optdeps system
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 10_07mssql_common.t
index ccdc8ff..da3b49d 100644 (file)
@@ -2,7 +2,8 @@ use strict;
 use warnings;
 use Test::More;
 use Test::Exception;
-use DBIx::Class::Schema::Loader::Utils 'warnings_exist_silent';
+use DBIx::Class::Schema::Loader::Optional::Dependencies;
+use DBIx::Class::Schema::Loader::Utils qw/warnings_exist_silent sigwarn_silencer/;
 use Try::Tiny;
 use File::Path 'rmtree';
 use DBIx::Class::Schema::Loader 'make_schema_at';
@@ -11,9 +12,9 @@ use Scope::Guard ();
 
 # use this if you keep a copy of DBD::Sybase linked to FreeTDS somewhere else
 BEGIN {
-  if (my $lib_dirs = $ENV{DBICTEST_MSSQL_PERL5LIB}) {
-    unshift @INC, $_ for split /:/, $lib_dirs;
-  }
+    if (my $lib_dirs = $ENV{DBICTEST_MSSQL_PERL5LIB}) {
+        unshift @INC, $_ for split /:/, $lib_dirs;
+    }
 }
 
 use lib qw(t/lib);
@@ -26,74 +27,92 @@ use constant EXTRA_DUMP_DIR => "$tdir/mssql_extra_dump";
 # for extra tests cleanup
 my $schema;
 
-my ($dsns, $common_version);
+my (%dsns, $common_version);
 
-for (qw/MSSQL MSSQL_ODBC MSSQL_ADO/) {
-  next unless $ENV{"DBICTEST_${_}_DSN"};
+my %env2optdep = (
+    MSSQL => 'test_rdbms_mssql_sybase',
+    MSSQL_ODBC => 'test_rdbms_mssql_odbc',
+    MSSQL_ADO => 'test_rdbms_mssql_ado',
+);
 
-  $dsns->{$_}{dsn} = $ENV{"DBICTEST_${_}_DSN"};
-  $dsns->{$_}{user} = $ENV{"DBICTEST_${_}_USER"};
-  $dsns->{$_}{password} = $ENV{"DBICTEST_${_}_PASS"};
+plan skip_all => 'requirements not satisfied:  ' . (join '  OR  ', map
+    { "[ @{[ DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for( $_ ) ]} ]" }
+    values %env2optdep
+) unless scalar grep
+    { DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for( $_ ) }
+    values %env2optdep
+;
+
+for my $type (keys %env2optdep) {
+    my %conninfo;
+    @conninfo{qw(dsn user password)} = map { $ENV{"DBICTEST_${type}_$_"} } qw(DSN USER PASS);
+    next unless $conninfo{dsn};
+
+    my $dep_group = $env2optdep{$type};
+    if (!DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for($dep_group)) {
+        diag "Testing with DBICTEST_${type}_DSN needs " . DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for($dep_group);
+        next;
+    }
 
-  require DBI;
-  my $dbh = DBI->connect (@{$dsns->{$_}}{qw/dsn user password/}, { RaiseError => 1, PrintError => 0} );
-  my $srv_ver = eval {
-    $dbh->get_info(18)
-      ||
-    $dbh->selectrow_hashref('master.dbo.xp_msver ProductVersion')->{Character_Value}
-  } || 0;
+    $dsns{$type} = \%conninfo;
 
-  my ($maj_srv_ver) = $srv_ver =~ /^(\d+)/;
+    require DBI;
+    my $dbh = DBI->connect (@{$dsns{$type}}{qw/dsn user password/}, { RaiseError => 1, PrintError => 0} );
+    my $srv_ver = eval {
+        $dbh->get_info(18)
+            ||
+        $dbh->selectrow_hashref('master.dbo.xp_msver ProductVersion')->{Character_Value}
+    } || 0;
 
-  if (! defined $common_version or $common_version > $maj_srv_ver ) {
-    $common_version = $maj_srv_ver;
-  }
-}
+    my ($maj_srv_ver) = $srv_ver =~ /^(\d+)/;
 
-plan skip_all => 'You need to set the DBICTEST_MSSQL_DSN, _USER and _PASS and/or the DBICTEST_MSSQL_ODBC_DSN, _USER and _PASS environment variables'
-  unless $dsns;
+    if (! defined $common_version or $common_version > $maj_srv_ver ) {
+        $common_version = $maj_srv_ver;
+    }
+}
 
 my $mssql_2008_new_data_types = {
-  date     => { data_type => 'date' },
-  time     => { data_type => 'time' },
-  'time(0)'=> { data_type => 'time', size => 0 },
-  'time(1)'=> { data_type => 'time', size => 1 },
-  'time(2)'=> { data_type => 'time', size => 2 },
-  'time(3)'=> { data_type => 'time', size => 3 },
-  'time(4)'=> { data_type => 'time', size => 4 },
-  'time(5)'=> { data_type => 'time', size => 5 },
-  'time(6)'=> { data_type => 'time', size => 6 },
-  'time(7)'=> { data_type => 'time' },
-  datetimeoffset => { data_type => 'datetimeoffset' },
-  'datetimeoffset(0)' => { data_type => 'datetimeoffset', size => 0 },
-  'datetimeoffset(1)' => { data_type => 'datetimeoffset', size => 1 },
-  'datetimeoffset(2)' => { data_type => 'datetimeoffset', size => 2 },
-  'datetimeoffset(3)' => { data_type => 'datetimeoffset', size => 3 },
-  'datetimeoffset(4)' => { data_type => 'datetimeoffset', size => 4 },
-  'datetimeoffset(5)' => { data_type => 'datetimeoffset', size => 5 },
-  'datetimeoffset(6)' => { data_type => 'datetimeoffset', size => 6 },
-  'datetimeoffset(7)' => { data_type => 'datetimeoffset' },
-  datetime2      => { data_type => 'datetime2' },
-  'datetime2(0)' => { data_type => 'datetime2', size => 0 },
-  'datetime2(1)' => { data_type => 'datetime2', size => 1 },
-  'datetime2(2)' => { data_type => 'datetime2', size => 2 },
-  'datetime2(3)' => { data_type => 'datetime2', size => 3 },
-  'datetime2(4)' => { data_type => 'datetime2', size => 4 },
-  'datetime2(5)' => { data_type => 'datetime2', size => 5 },
-  'datetime2(6)' => { data_type => 'datetime2', size => 6 },
-  'datetime2(7)' => { data_type => 'datetime2' },
-
-  hierarchyid      => { data_type => 'hierarchyid' },
+    date     => { data_type => 'date' },
+    time     => { data_type => 'time' },
+    'time(0)'=> { data_type => 'time', size => 0 },
+    'time(1)'=> { data_type => 'time', size => 1 },
+    'time(2)'=> { data_type => 'time', size => 2 },
+    'time(3)'=> { data_type => 'time', size => 3 },
+    'time(4)'=> { data_type => 'time', size => 4 },
+    'time(5)'=> { data_type => 'time', size => 5 },
+    'time(6)'=> { data_type => 'time', size => 6 },
+    'time(7)'=> { data_type => 'time' },
+    datetimeoffset => { data_type => 'datetimeoffset' },
+    'datetimeoffset(0)' => { data_type => 'datetimeoffset', size => 0 },
+    'datetimeoffset(1)' => { data_type => 'datetimeoffset', size => 1 },
+    'datetimeoffset(2)' => { data_type => 'datetimeoffset', size => 2 },
+    'datetimeoffset(3)' => { data_type => 'datetimeoffset', size => 3 },
+    'datetimeoffset(4)' => { data_type => 'datetimeoffset', size => 4 },
+    'datetimeoffset(5)' => { data_type => 'datetimeoffset', size => 5 },
+    'datetimeoffset(6)' => { data_type => 'datetimeoffset', size => 6 },
+    'datetimeoffset(7)' => { data_type => 'datetimeoffset' },
+    datetime2      => { data_type => 'datetime2' },
+    'datetime2(0)' => { data_type => 'datetime2', size => 0 },
+    'datetime2(1)' => { data_type => 'datetime2', size => 1 },
+    'datetime2(2)' => { data_type => 'datetime2', size => 2 },
+    'datetime2(3)' => { data_type => 'datetime2', size => 3 },
+    'datetime2(4)' => { data_type => 'datetime2', size => 4 },
+    'datetime2(5)' => { data_type => 'datetime2', size => 5 },
+    'datetime2(6)' => { data_type => 'datetime2', size => 6 },
+    'datetime2(7)' => { data_type => 'datetime2' },
+
+    hierarchyid      => { data_type => 'hierarchyid' },
 };
 
 my $tester = dbixcsl_common_tests->new(
     vendor      => 'mssql',
     auto_inc_pk => 'INTEGER IDENTITY NOT NULL PRIMARY KEY',
     default_function_def => 'DATETIME DEFAULT getdate()',
-    connect_info => [values %$dsns],
+    connect_info => [ map { $dsns{$_} } sort keys %dsns ],
     preserve_case_mode_is_exclusive => 1,
     quote_char => [ qw/[ ]/ ],
     basic_date_datatype => ($common_version >= 10) ? 'DATE' : 'SMALLDATETIME',
+    default_on_clause => 'NO ACTION',
     data_types => {
         # http://msdn.microsoft.com/en-us/library/ms187752.aspx
 
@@ -200,6 +219,20 @@ my $tester = dbixcsl_common_tests->new(
                     [Five_Id] INT REFERENCES [MSSQL_Loader_Test5] ([Id])
                 )
             },
+            # 8 through 12 are used for the multi-schema tests and 13 through 16 are used for multi-db tests
+            q{
+                create table mssql_loader_test17 (
+                    id int identity primary key
+                )
+            },
+            q{
+                create table mssql_loader_test18 (
+                    id int identity primary key,
+                    seventeen_id int,
+                    foreign key (seventeen_id) references mssql_loader_test17(id)
+                        on delete set default on update set null
+                )
+            },
         ],
         pre_drop_ddl => [
             'CREATE TABLE mssql_loader_test3 (id INT IDENTITY NOT NULL PRIMARY KEY)',
@@ -210,8 +243,10 @@ my $tester = dbixcsl_common_tests->new(
             'mssql_loader_test3',
             'MSSQL_Loader_Test6',
             'MSSQL_Loader_Test5',
+            'mssql_loader_test17',
+            'mssql_loader_test18',
         ],
-        count  => 10 + 30 * 2 + 26 * 2, # extra + multi-schema + mutli-db
+        count  => 14 + 30 * 2 + 26 * 2, # extra + multi-schema + mutli-db
         run    => sub {
             my ($monikers, $classes, $self);
             ($schema, $monikers, $classes, $self) = @_;
@@ -286,6 +321,19 @@ my $tester = dbixcsl_common_tests->new(
             } qr/Can't find source/,
                 'no source registered for bad view';
 
+            # test on delete/update fk clause introspection
+            ok ((my $rel_info = $schema->source('MssqlLoaderTest18')->relationship_info('seventeen')),
+                'got rel info');
+
+            is $rel_info->{attrs}{on_delete}, 'SET DEFAULT',
+                'ON DELETE clause introspected correctly';
+
+            is $rel_info->{attrs}{on_update}, 'SET NULL',
+                'ON UPDATE clause introspected correctly';
+
+            is $rel_info->{attrs}{is_deferrable}, 1,
+                'is_deferrable defaults to 1';
+
             SKIP: {
                 my $dbh = $schema->storage->dbh;
 
@@ -362,7 +410,6 @@ EOF
                             {
                                 naming => 'current',
                                 db_schema => $db_schema,
-                                moniker_parts => [qw/schema name/],
                                 dump_directory => EXTRA_DUMP_DIR,
                                 quiet => 1,
                             },
@@ -381,7 +428,7 @@ EOF
                     } 'connected test schema';
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslDashTestMssqlLoaderTest8');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest8');
                     } 'got source for table in schema name with dash';
 
                     is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
@@ -394,7 +441,7 @@ EOF
                         'column in schema name with dash';
 
                     lives_and {
-                        ok $rs = $test_schema->resultset('DbicslDashTestMssqlLoaderTest8');
+                        ok $rs = $test_schema->resultset('MssqlLoaderTest8');
                     } 'got resultset for table in schema name with dash';
 
                     lives_and {
@@ -428,7 +475,7 @@ EOF
                         'correct unique constraint in schema name with dash');
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslDotTestMssqlLoaderTest10');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest10');
                     } 'got source for table in schema name with dot';
 
                     is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
@@ -441,7 +488,7 @@ EOF
                         'column in schema name with dot introspected correctly';
 
                     lives_and {
-                        ok $rs = $test_schema->resultset('DbicslDotTestMssqlLoaderTest10');
+                        ok $rs = $test_schema->resultset('MssqlLoaderTest10');
                     } 'got resultset for table in schema name with dot';
 
                     lives_and {
@@ -461,7 +508,7 @@ EOF
                         'relationship in schema name with dot';
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslDotTestMssqlLoaderTest11');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest11');
                     } 'got source for table in schema name with dot';
 
                     %uniqs = try { $rsrc->unique_constraints };
@@ -475,28 +522,33 @@ EOF
                         'correct unique constraint in schema name with dot');
 
                     lives_and {
-                        ok $test_schema->source('DbicslDotTestMssqlLoaderTest10')
+                        ok $test_schema->source('MssqlLoaderTest10')
                             ->has_relationship('mssql_loader_test8');
                     } 'cross-schema relationship in multi-db_schema';
 
                     lives_and {
-                        ok $test_schema->source('DbicslDashTestMssqlLoaderTest8')
+                        ok $test_schema->source('MssqlLoaderTest8')
                             ->has_relationship('mssql_loader_test10s');
                     } 'cross-schema relationship in multi-db_schema';
 
                     lives_and {
-                        ok $test_schema->source('DbicslDashTestMssqlLoaderTest12')
+                        ok $test_schema->source('MssqlLoaderTest12')
                             ->has_relationship('mssql_loader_test11');
                     } 'cross-schema relationship in multi-db_schema';
 
                     lives_and {
-                        ok $test_schema->source('DbicslDotTestMssqlLoaderTest11')
+                        ok $test_schema->source('MssqlLoaderTest11')
                             ->has_relationship('mssql_loader_test12s');
                     } 'cross-schema relationship in multi-db_schema';
                 }
             }
 
             SKIP: {
+                # for ADO
+                local $SIG{__WARN__} = sigwarn_silencer(
+                    qr/Changed database context/
+                );
+
                 my $dbh = $schema->storage->dbh;
 
                 try {
@@ -504,6 +556,7 @@ EOF
                     $dbh->do('CREATE DATABASE dbicsl_test1');
                 }
                 catch {
+                    diag "no CREATE DATABASE privileges: '$_'";
                     skip "no CREATE DATABASE privileges", 26 * 2;
                 };
 
@@ -559,13 +612,12 @@ EOF
                         local $SIG{__WARN__} = sub {
                             push @warns, $_[0] unless $_[0] =~ /\bcollides\b/;
                         };
-     
+
                         make_schema_at(
                             'MSSQLMultiDatabase',
                             {
                                 naming => 'current',
                                 db_schema => $db_schema,
-                                moniker_parts => [qw/database name/],
                                 dump_directory => EXTRA_DUMP_DIR,
                                 quiet => 1,
                             },
@@ -586,7 +638,7 @@ EOF
                     my ($rsrc, $rs, $row, $rel_info, %uniqs);
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslTest1MssqlLoaderTest13');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest13');
                     } 'got source for table in database one';
 
                     is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
@@ -599,7 +651,7 @@ EOF
                         'column in database one';
 
                     lives_and {
-                        ok $rs = $test_schema->resultset('DbicslTest1MssqlLoaderTest13');
+                        ok $rs = $test_schema->resultset('MssqlLoaderTest13');
                     } 'got resultset for table in database one';
 
                     lives_and {
@@ -633,7 +685,7 @@ EOF
                         'correct unique constraint in database one');
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslTest2MssqlLoaderTest15');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest15');
                     } 'got source for table in database two';
 
                     is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
@@ -646,7 +698,7 @@ EOF
                         'column in database two introspected correctly';
 
                     lives_and {
-                        ok $rs = $test_schema->resultset('DbicslTest2MssqlLoaderTest15');
+                        ok $rs = $test_schema->resultset('MssqlLoaderTest15');
                     } 'got resultset for table in database two';
 
                     lives_and {
@@ -666,7 +718,7 @@ EOF
                         'relationship in database two';
 
                     lives_and {
-                        ok $rsrc = $test_schema->source('DbicslTest2MssqlLoaderTest16');
+                        ok $rsrc = $test_schema->source('MssqlLoaderTest16');
                     } 'got source for table in database two';
 
                     %uniqs = try { $rsrc->unique_constraints };
@@ -722,6 +774,11 @@ sub cleanup_schemas {
 sub cleanup_databases {
     return if $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP};
 
+    # for ADO
+    local $SIG{__WARN__} = sigwarn_silencer(
+        qr/Changed database context/
+    );
+
     my $dbh = $schema->storage->dbh;
 
     $dbh->do('USE dbicsl_test1');