X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Finflate%2Fdatetime_mssql.t;h=44984a320e8c71fcb3e3f95a0e56695dcaf1a1a2;hb=dd572bad5137c60cfeca4fcac04428d327bef21d;hp=5d4c5a57de7fb2c53961bdc7e4482243d42ea258;hpb=5a77aa8ba52c50bdc4291ca22433f9c315234ad2;p=dbsrgits%2FDBIx-Class.git diff --git a/t/inflate/datetime_mssql.t b/t/inflate/datetime_mssql.t index 5d4c5a5..44984a3 100644 --- a/t/inflate/datetime_mssql.t +++ b/t/inflate/datetime_mssql.t @@ -1,80 +1,122 @@ 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; - -$schema->connection($dsn, $user, $pass); -$schema->storage->ensure_connected; - -my @dt_types = ( - ['DATETIME', { - year => 2004, - month => 8, - day => 21, - hour => 14, - minute => 36, - second => 48, - nanosecond => 500000000, - }], - ['SMALLDATETIME', { # minute precision - year => 2004, - month => 8, - day => 21, - hour => 14, - minute => 36, - }], +my @connect_info = ( + [ $dsn, $user, $pass ], + [ $dsn2, $user2, $pass2 ], ); -for my $dt_type (@dt_types) { - my ($type, $sample_dt) = @$dt_type; +my $schema; + +SKIP: +for my $connect_info (@connect_info) { + my ($dsn, $user, $pass) = @$connect_info; + + next unless $dsn; + + $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, + }], + ); - eval { $schema->storage->dbh->do("DROP TABLE track") }; - $schema->storage->dbh->do(<<"SQL"); + 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"); CREATE TABLE track ( trackid INT IDENTITY PRIMARY KEY, cd INT, position INT, - last_updated_on $type, + $col $type, ) SQL - ok(my $dt = DateTime->new($sample_dt)); - - my $row; - ok( $row = $schema->resultset('Track')->create({ - last_updated_on => $dt, - cd => 1, - })); - ok( $row = $schema->resultset('Track') - ->search({ trackid => $row->trackid }, { select => ['last_updated_on'] }) - ->first - ); - is( $row->updated_date, $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'); } }