X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F749sybase_asa.t;h=03c1182051cfcd01d2da79272c2742ee2a0eee61;hb=4216833287bb50577b00bd690f33cea88f38fab1;hp=78efdeb09577690ddcacc1fd2b99abb33d7d900f;hpb=8ebb1b5840c02e3332575ef5f3cc615e2bc16e88;p=dbsrgits%2FDBIx-Class.git diff --git a/t/749sybase_asa.t b/t/749sybase_asa.t index 78efdeb..03c1182 100644 --- a/t/749sybase_asa.t +++ b/t/749sybase_asa.t @@ -3,9 +3,12 @@ use warnings; use Test::More; use Test::Exception; +use Scope::Guard (); use lib qw(t/lib); use DBICTest; +DBICTest::Schema->load_classes('ArtistGUID'); + # tests stolen from 748informix.t my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_ASA_${_}" } qw/DSN USER PASS/}; @@ -21,19 +24,21 @@ my @info = ( [ $dsn2, $user2, $pass2 ], ); -my @handles_to_clean; +my $schema; foreach my $info (@info) { my ($dsn, $user, $pass) = @$info; next unless $dsn; - my $schema = DBICTest::Schema->connect($dsn, $user, $pass); + $schema = DBICTest::Schema->connect($dsn, $user, $pass, { + auto_savepoint => 1 + }); + + my $guard = Scope::Guard->new(\&cleanup); my $dbh = $schema->storage->dbh; - push @handles_to_clean, $dbh; - eval { $dbh->do("DROP TABLE artist") }; $dbh->do(<discard_changes; is($new->artistid, 66, 'Explicit PK assigned'); +# test savepoints + throws_ok { + $schema->txn_do(sub { + eval { + $schema->txn_do(sub { + $ars->create({ name => 'in_savepoint' }); + die "rolling back savepoint"; + }); + }; + ok ((not $ars->search({ name => 'in_savepoint' })->first), + 'savepoint rolled back'); + $ars->create({ name => 'in_outer_txn' }); + die "rolling back outer txn"; + }); + } qr/rolling back outer txn/, + 'correct exception for rollback'; + + ok ((not $ars->search({ name => 'in_outer_txn' })->first), + 'outer txn rolled back'); + # test populate lives_ok (sub { my @pop; @@ -138,13 +163,62 @@ EOF ok($rs->find($id)->$type eq $binstr{$size}, "verified inserted $size $type" ); } } + + my @uuid_types = qw/uniqueidentifier uniqueidentifierstr/; + +# test uniqueidentifiers + for my $uuid_type (@uuid_types) { + local $schema->source('ArtistGUID')->column_info('artistid')->{data_type} + = $uuid_type; + + local $schema->source('ArtistGUID')->column_info('a_guid')->{data_type} + = $uuid_type; + + $schema->storage->dbh_do (sub { + my ($storage, $dbh) = @_; + eval { $dbh->do("DROP TABLE artist") }; + $dbh->do(<<"SQL"); +CREATE TABLE artist ( + artistid $uuid_type NOT NULL, + name VARCHAR(100), + rank INT NOT NULL DEFAULT '13', + charfield CHAR(10) NULL, + a_guid $uuid_type, + primary key(artistid) +) +SQL + }); + + my $row; + lives_ok { + $row = $schema->resultset('ArtistGUID')->create({ name => 'mtfnpy' }) + } 'created a row with a GUID'; + + ok( + eval { $row->artistid }, + 'row has GUID PK col populated', + ); + diag $@ if $@; + + ok( + eval { $row->a_guid }, + 'row has a GUID col with auto_nextval populated', + ); + diag $@ if $@; + + my $row_from_db = $schema->resultset('ArtistGUID') + ->search({ name => 'mtfnpy' })->first; + + is $row_from_db->artistid, $row->artistid, + 'PK GUID round trip'; + + is $row_from_db->a_guid, $row->a_guid, + 'NON-PK GUID round trip'; + } } done_testing; -# clean up our mess -END { - foreach my $dbh (@handles_to_clean) { - eval { $dbh->do("DROP TABLE $_") } for qw/artist bindtype_test/; - } +sub cleanup { + eval { $schema->storage->dbh->do("DROP TABLE $_") } for qw/artist bindtype_test/; }