# vim: set ts=2 sts=2 sw=2 expandtab smarttab:
use strict;
use warnings;
use Test::More 0.96;

eval 'require DBI'
  or plan skip_all => 'DBI required for these tests';

use DBIx::TableLoader;

# These tests are fragile as the databases/drivers could change things.
# This script was only to make sure the code in the module was correct...
# In reality the ones we want often aren't mapped anyway.

my @types = (
  DBI::SQL_LONGVARCHAR(),
  DBI::SQL_VARCHAR(),
  # pick something that appears to be mapped in the drivers
  DBI::SQL_BOOLEAN(),
  DBI::SQL_INTEGER(),
);

my @tests = (
  [SQLite => 1.62, 'dbname=:memory:',          [undef,  'TEXT',    undef,  'INTEGER']],
  [Pg     => 0,    'host=localhost;port=5432', [undef,  'text',    'bool', 'int4']],
  [PgPP   => 0,    'host=localhost;port=5432', [undef,  undef,     undef,  undef]],
  [mysql  => 0,    'host=127.0.0.1;port=3306', ['text', 'varchar', undef,  'integer']],
);

foreach my $test ( @tests ){
  my ($dbd, $ver, $dsn, $exp) = @$test;

  my %e = (
    dsn => "TEST_DBI_\U${dbd}_DSN",
    userpass => "TEST_DBI_\U${dbd}_USERPASS"
  );

  subtest $dbd => sub {
    eval "require DBD::$dbd; DBD::${dbd}->VERSION($ver)"; ## no critic
    plan skip_all => "DBD::$dbd $ver required for testing data type"
      if $@;

    $dsn = $ENV{$e{dsn}}
      if $ENV{$e{dsn}};

    my ($user, $pass) = split(/:/, $ENV{$e{userpass}} || '');

    my %attr = (RaiseError => 0, PrintWarn => 0, PrintError => 0);
    my $dbh = DBI->connect("dbi:$dbd:$dsn", $user, $pass, \%attr)
      or plan skip_all => "DBI connection failed for $dbd.  " .
        "Set $e{dsn} and/or $e{userpass} to test with $dbd";
    my $loader = new_ok('DBIx::TableLoader', [dbh => $dbh, columns => ['test']]);

    foreach my $i ( 0 .. $#types ){
      is($loader->_data_type_from_driver($types[$i]), $$exp[$i], 'db data type');
    }
  };
}

done_testing;
