Convert the tests with multiple DBDs to new optdeps system
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 10_11msaccess_common.t
index 49e3483..e0c85bc 100644 (file)
@@ -1,16 +1,35 @@
 use strict;
 use warnings;
 use Test::More;
+use DBIx::Class::Optional::Dependencies;
+use DBIx::Class::Schema::Loader::DBI::ODBC::ACCESS ();
 use lib qw(t/lib);
 use dbixcsl_common_tests;
 
-my $odbc_dsn      = $ENV{DBICTEST_MSACCESS_ODBC_DSN} || '';
-my $odbc_user     = $ENV{DBICTEST_MSACCESS_ODBC_USER} || '';
-my $odbc_password = $ENV{DBICTEST_MSACCESS_ODBC_PASS} || '';
+my %env2optdep = map { $_ => lc "test_rdbms_$_" } qw(MSACCESS_ODBC MSACCESS_ADO);
 
-my $ado_dsn       = $ENV{DBICTEST_MSACCESS_ADO_DSN} || '';
-my $ado_user      = $ENV{DBICTEST_MSACCESS_ADO_USER} || '';
-my $ado_password  = $ENV{DBICTEST_MSACCESS_ADO_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
+;
+
+my %dsns;
+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;
+    }
+
+    $dsns{$type} = \%conninfo;
+}
 
 my %ado_extra_types = (
     'tinyint'     => { data_type => 'tinyint', original => { data_type => 'byte' } },
@@ -37,17 +56,7 @@ my $tester = dbixcsl_common_tests->new(
     vendor      => 'Access',
     auto_inc_pk => 'AUTOINCREMENT PRIMARY KEY',
     quote_char  => [qw/[ ]/],
-    connect_info => [ ($odbc_dsn ? {
-            dsn         => $odbc_dsn,
-            user        => $odbc_user,
-            password    => $odbc_password,
-        } : ()),
-        ($ado_dsn ? {
-            dsn         => $ado_dsn,
-            user        => $ado_user,
-            password    => $ado_password,
-        } : ()),
-    ],
+    connect_info => [ map { $dsns{$_} } sort keys %dsns ],
     data_types  => {
         # http://msdn.microsoft.com/en-us/library/bb208866(v=office.12).aspx
         #
@@ -105,15 +114,34 @@ my $tester = dbixcsl_common_tests->new(
         'image'       => { data_type => 'image', original => { data_type => 'longbinary' } },
         'longbinary'  => { data_type => 'image', original => { data_type => 'longbinary' } },
 
-        ($ado_dsn && (not $odbc_dsn) ? %ado_extra_types : ())
+        %ado_extra_types,
+    },
+    data_types_ddl_cb => sub {
+        my $ddl = shift;
+        {
+            package DBIXCSL_Test::DummySchema;
+            use base 'DBIx::Class::Schema';
+        }
+        my @connect_info = @{$dsns{MSACCESS_ODBC} || $dsns{MSACCESS_ADO}};
+
+        my $schema = DBIXCSL_Test::DummySchema->connect(@connect_info);
+
+        my $loader = DBIx::Class::Schema::Loader::DBI::ODBC::ACCESS->new(
+            schema => $schema,
+            naming => 'current',
+        );
+
+        my $conn = $loader->_ado_connection;
+
+        require Win32::OLE;
+        my $comm = Win32::OLE->new('ADODB.Command');
+
+        $comm->{ActiveConnection} = $conn;
+        $comm->{CommandText}      = $ddl;
+        $comm->Execute;
     },
 );
 
-if (not ($odbc_dsn || $ado_dsn)) {
-    $tester->skip_tests('You need to set the DBICTEST_MSACCESS_ODBC_DSN, and optionally _USER and _PASS and/or the DBICTEST_MSACCESS_ADO_DSN, and optionally _USER and _PASS environment variables');
-}
-else {
-    $tester->run_tests();
-}
+$tester->run_tests();
 
 # vim:et sts=4 sw=4 tw=0: