X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Finflate%2Fdatetime_mssql.t;h=e9c003e84aa648ac0e25d8515d6bad7e3f5cbbc3;hb=68de943862f06cabd397d2e74d12cd9cdc999779;hp=bc85fdc1796b86bd2b7aaec8e07a6a71a4d4153c;hpb=b7ad91622e83dcfcaa0081aabdb636e8e91f7d57;p=dbsrgits%2FDBIx-Class.git diff --git a/t/inflate/datetime_mssql.t b/t/inflate/datetime_mssql.t index bc85fdc..e9c003e 100644 --- a/t/inflate/datetime_mssql.t +++ b/t/inflate/datetime_mssql.t @@ -1,61 +1,89 @@ use strict; -use warnings; +use warnings; use Test::More; use Test::Exception; +use Scope::Guard (); use lib qw(t/lib); use DBICTest; -my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/}; +# 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; + } +} + +my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/}; +my ($dsn2, $user2, $pass2) = @ENV{map { "DBICTEST_MSSQL_${_}" } qw/DSN USER PASS/}; -if (not ($dsn && $user)) { +if (not ($dsn || $dsn2)) { plan skip_all => - 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test' . + 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN} and/or $ENV{DBICTEST_MSSQL_DSN} _USER ' + .'and _PASS to run this test' . "\nWarning: This test drops and creates a table called 'track'"; -} else { - eval "use DateTime; use DateTime::Format::Strptime;"; - if ($@) { - plan skip_all => 'needs DateTime and DateTime::Format::Strptime for testing'; - } - else { - plan tests => 4 * 2; # (tests * dt_types) - } } -my $schema = DBICTest::Schema->clone; +plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_dt') + unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt'); + +my @connect_info = ( + [ $dsn, $user, $pass ], + [ $dsn2, $user2, $pass2 ], +); + +my $schema; + +SKIP: +for my $connect_info (@connect_info) { + my ($dsn, $user, $pass) = @$connect_info; + + next unless $dsn; -$schema->connection($dsn, $user, $pass); -$schema->storage->ensure_connected; + $schema = DBICTest::Schema->connect($dsn, $user, $pass, { + on_connect_call => 'datetime_setup' + }); + + { + my $w; + local $SIG{__WARN__} = sub { $w = shift }; + $schema->storage->ensure_connected; + if ($w =~ /Your DBD::Sybase is too old to support DBIx::Class::InflateColumn::DateTime/) { + skip "Skipping tests on old DBD::Sybase " . DBD::Sybase->VERSION, 1; + } + } + + my $guard = Scope::Guard->new(\&cleanup); # coltype, column, datehash -my @dt_types = ( - ['DATETIME', - 'last_updated_at', - { - year => 2004, - month => 8, - day => 21, - hour => 14, - minute => 36, - second => 48, - nanosecond => 500000000, - }], - ['SMALLDATETIME', # minute precision - 'small_dt', - { - year => 2004, - month => 8, - day => 21, - hour => 14, - minute => 36, - }], -); + my @dt_types = ( + ['DATETIME', + 'last_updated_at', + { + year => 2004, + month => 8, + day => 21, + hour => 14, + minute => 36, + second => 48, + nanosecond => 500000000, + }], + ['SMALLDATETIME', # minute precision + 'small_dt', + { + year => 2004, + month => 8, + day => 21, + hour => 14, + minute => 36, + }], + ); -for my $dt_type (@dt_types) { - my ($type, $col, $sample_dt) = @$dt_type; + for my $dt_type (@dt_types) { + my ($type, $col, $sample_dt) = @$dt_type; - eval { $schema->storage->dbh->do("DROP TABLE track") }; - $schema->storage->dbh->do(<<"SQL"); + eval { $schema->storage->dbh->do("DROP TABLE track") }; + $schema->storage->dbh->do(<<"SQL"); CREATE TABLE track ( trackid INT IDENTITY PRIMARY KEY, cd INT, @@ -63,23 +91,30 @@ CREATE TABLE track ( $col $type, ) SQL - ok(my $dt = DateTime->new($sample_dt)); - - my $row; - ok( $row = $schema->resultset('Track')->create({ - $col => $dt, - cd => 1, - })); - ok( $row = $schema->resultset('Track') - ->search({ trackid => $row->trackid }, { select => [$col] }) - ->first - ); - is( $row->$col, $dt, 'DateTime roundtrip' ); + ok(my $dt = DateTime->new($sample_dt)); + + my $row; + ok( $row = $schema->resultset('Track')->create({ + $col => $dt, + cd => 1, + })); + ok( $row = $schema->resultset('Track') + ->search({ trackid => $row->trackid }, { select => [$col] }) + ->first + ); + is( $row->$col, $dt, "$type roundtrip" ); + + cmp_ok( $row->$col->nanosecond, '==', $sample_dt->{nanosecond}, + 'DateTime fractional portion roundtrip' ) + if exists $sample_dt->{nanosecond}; + } } +done_testing; + # clean up our mess -END { - if (my $dbh = eval { $schema->storage->_dbh }) { +sub cleanup { + if (my $dbh = eval { $schema->storage->dbh }) { $dbh->do('DROP TABLE track'); } }