Add all storage instances to the test suite leaktracing pool
[dbsrgits/DBIx-Class.git] / t / inflate / datetime_mssql.t
CommitLineData
5a77aa8b 1use strict;
dd572bad 2use warnings;
5a77aa8b 3
4use Test::More;
fb95dc4d 5use Scope::Guard ();
3d98c75e 6use Try::Tiny;
199fbc45 7use DBIx::Class::Optional::Dependencies ();
5a77aa8b 8use lib qw(t/lib);
9use DBICTest;
10
199fbc45 11my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
12my ($dsn2, $user2, $pass2) = @ENV{map { "DBICTEST_MSSQL_${_}" } qw/DSN USER PASS/};
13my ($dsn3, $user3, $pass3) = @ENV{map { "DBICTEST_MSSQL_ADO_${_}" } qw/DSN USER PASS/};
14
15plan skip_all => 'Test needs ' .
16 (join ' and ', map { $_ ? $_ : () }
17 DBIx::Class::Optional::Dependencies->req_missing_for('test_dt'),
18 (join ' or ', map { $_ ? $_ : () }
19 DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_odbc'),
20 DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_sybase'),
21 DBIx::Class::Optional::Dependencies->req_missing_for('test_rdbms_mssql_ado')))
22 unless
23 DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt') && (
24 $dsn && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_odbc')
25 or
26 $dsn2 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_sybase')
27 or
28 $dsn3 && DBIx::Class::Optional::Dependencies->req_ok_for('test_rdbms_mssql_ado'))
29 or (not $dsn || $dsn2 || $dsn3);
3d98c75e 30
fb95dc4d 31# use this if you keep a copy of DBD::Sybase linked to FreeTDS somewhere else
32BEGIN {
33 if (my $lib_dirs = $ENV{DBICTEST_MSSQL_PERL5LIB}) {
34 unshift @INC, $_ for split /:/, $lib_dirs;
35 }
36}
5a77aa8b 37
56dca25f 38if (not ($dsn || $dsn2 || $dsn3)) {
5a77aa8b 39 plan skip_all =>
56dca25f 40 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN} and/or $ENV{DBICTEST_MSSQL_DSN} and/or '
41 .'$ENV{DBICTEST_MSSQL_ADO_DSN} _USER and _PASS to run this test' .
42 "\nWarning: This test drops and creates tables called 'event_small_dt' and"
43 ." 'track'.";
5a77aa8b 44}
45
199fbc45 46DBICTest::Schema->load_classes('EventSmallDT');
68de9438 47
fb95dc4d 48my @connect_info = (
49 [ $dsn, $user, $pass ],
50 [ $dsn2, $user2, $pass2 ],
56dca25f 51 [ $dsn3, $user3, $pass3 ],
fb95dc4d 52);
53
54my $schema;
55
dd572bad 56SKIP:
fb95dc4d 57for my $connect_info (@connect_info) {
58 my ($dsn, $user, $pass) = @$connect_info;
59
60 next unless $dsn;
5a77aa8b 61
fb95dc4d 62 $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
63 on_connect_call => 'datetime_setup'
64 });
65
dd572bad 66 {
67 my $w;
68 local $SIG{__WARN__} = sub { $w = shift };
69 $schema->storage->ensure_connected;
70 if ($w =~ /Your DBD::Sybase is too old to support DBIx::Class::InflateColumn::DateTime/) {
71 skip "Skipping tests on old DBD::Sybase " . DBD::Sybase->VERSION, 1;
72 }
73 }
74
65d35121 75 my $guard = Scope::Guard->new(sub{ cleanup($schema) });
5a77aa8b 76
56dca25f 77 # $^W because DBD::ADO is a piece of crap
78 try { local $^W = 0; $schema->storage->dbh->do("DROP TABLE track") };
3d98c75e 79 $schema->storage->dbh->do(<<"SQL");
80CREATE TABLE track (
81 trackid INT IDENTITY PRIMARY KEY,
82 cd INT,
83 position INT,
84 last_updated_at DATETIME,
85)
86SQL
56dca25f 87 try { local $^W = 0; $schema->storage->dbh->do("DROP TABLE event_small_dt") };
3d98c75e 88 $schema->storage->dbh->do(<<"SQL");
89CREATE TABLE event_small_dt (
90 id INT IDENTITY PRIMARY KEY,
91 small_dt SMALLDATETIME,
92)
93SQL
94
95# coltype, column, source, pk, create_extra, datehash
fb95dc4d 96 my @dt_types = (
97 ['DATETIME',
98 'last_updated_at',
3d98c75e 99 'Track',
100 'trackid',
101 { cd => 1 },
fb95dc4d 102 {
103 year => 2004,
104 month => 8,
105 day => 21,
106 hour => 14,
107 minute => 36,
108 second => 48,
109 nanosecond => 500000000,
110 }],
111 ['SMALLDATETIME', # minute precision
112 'small_dt',
3d98c75e 113 'EventSmallDT',
114 'id',
115 {},
fb95dc4d 116 {
117 year => 2004,
118 month => 8,
119 day => 21,
120 hour => 14,
121 minute => 36,
122 }],
123 );
5a77aa8b 124
fb95dc4d 125 for my $dt_type (@dt_types) {
3d98c75e 126 my ($type, $col, $source, $pk, $create_extra, $sample_dt) = @$dt_type;
5a77aa8b 127
56dca25f 128 delete $sample_dt->{nanosecond} if $dsn =~ /:ADO:/;
129
fb95dc4d 130 ok(my $dt = DateTime->new($sample_dt));
131
132 my $row;
3d98c75e 133 ok( $row = $schema->resultset($source)->create({
fb95dc4d 134 $col => $dt,
3d98c75e 135 %$create_extra,
fb95dc4d 136 }));
3d98c75e 137 ok( $row = $schema->resultset($source)
138 ->search({ $pk => $row->$pk }, { select => [$col] })
fb95dc4d 139 ->first
140 );
141 is( $row->$col, $dt, "$type roundtrip" );
0f72fb47 142
143 cmp_ok( $row->$col->nanosecond, '==', $sample_dt->{nanosecond},
fb95dc4d 144 'DateTime fractional portion roundtrip' )
145 if exists $sample_dt->{nanosecond};
146 }
5a77aa8b 147}
148
fb95dc4d 149done_testing;
150
5a77aa8b 151# clean up our mess
fb95dc4d 152sub cleanup {
65d35121 153 my $schema = shift;
fb95dc4d 154 if (my $dbh = eval { $schema->storage->dbh }) {
5a77aa8b 155 $dbh->do('DROP TABLE track');
3d98c75e 156 $dbh->do('DROP TABLE event_small_dt');
5a77aa8b 157 }
158}