X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F10_08sqlanywhere_common.t;h=6f1f58e8f37ae3c6f5075d5961de882b601ce363;hb=4ef0f7f724d1600517ca82ece7fc4e1999efbe00;hp=f52bc4edeee7fc4a16d42f1d6205eba62423ae30;hpb=c4a69b87bd3d3fdda08f05d363311a6e9d3fc0f7;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/t/10_08sqlanywhere_common.t b/t/10_08sqlanywhere_common.t index f52bc4e..6f1f58e 100644 --- a/t/10_08sqlanywhere_common.t +++ b/t/10_08sqlanywhere_common.t @@ -4,6 +4,7 @@ use Test::More; use Test::Exception; use Try::Tiny; use File::Path 'rmtree'; +use DBIx::Class::Optional::Dependencies; use DBIx::Class::Schema::Loader 'make_schema_at'; use Scope::Guard (); @@ -19,31 +20,34 @@ use constant EXTRA_DUMP_DIR => "$tdir/sqlanywhere_extra_dump"; # # Setting them to zero is preferred. -my $dbd_sqlanywhere_dsn = $ENV{DBICTEST_SQLANYWHERE_DSN} || ''; -my $dbd_sqlanywhere_user = $ENV{DBICTEST_SQLANYWHERE_USER} || ''; -my $dbd_sqlanywhere_password = $ENV{DBICTEST_SQLANYWHERE_PASS} || ''; +my %dsns; +for (qw(SQLANYWHERE SQLANYWHERE_ODBC)) { + next unless $ENV{"DBICTEST_${_}_DSN"}; -my $odbc_dsn = $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN} || ''; -my $odbc_user = $ENV{DBICTEST_SQLANYWHERE_ODBC_USER} || ''; -my $odbc_password = $ENV{DBICTEST_SQLANYWHERE_ODBC_PASS} || ''; + my $dep_group = lc "rdbms_$_"; + if (!DBIx::Class::Optional::Dependencies->req_ok_for($dep_group)) { + diag 'You need to install ' . DBIx::Class::Optional::Dependencies->req_missing_for($dep_group) + . " to test with $_"; + next; + } + + $dsns{$_}{dsn} = $ENV{"DBICTEST_${_}_DSN"}; + $dsns{$_}{user} = $ENV{"DBICTEST_${_}_USER"}; + $dsns{$_}{password} = $ENV{"DBICTEST_${_}_PASS"}; +}; + +plan skip_all => 'You need to set the DBICTEST_SQLANYWHERE_DSN, _USER and _PASS and/or the DBICTEST_SQLANYWHERE_ODBC_DSN, _USER and _PASS environment variables' + unless %dsns; my ($schema, $schemas_created); # for cleanup in END for extra tests my $tester = dbixcsl_common_tests->new( vendor => 'SQLAnywhere', auto_inc_pk => 'INTEGER IDENTITY NOT NULL PRIMARY KEY', - connect_info => [ ($dbd_sqlanywhere_dsn ? { - dsn => $dbd_sqlanywhere_dsn, - user => $dbd_sqlanywhere_user, - password => $dbd_sqlanywhere_password, - } : ()), - ($odbc_dsn ? { - dsn => $odbc_dsn, - user => $odbc_user, - password => $odbc_password, - } : ()), - ], + connect_info => [ map { $dsns{$_} } sort keys %dsns ], loader_options => { preserve_case => 1 }, + default_is_deferrable => 1, + default_on_clause => 'RESTRICT', data_types => { # http://infocenter.sybase.com/help/topic/com.sybase.help.sqlanywhere.11.0.1/dbreference_en11/rf-datatypes.html # @@ -144,12 +148,42 @@ my $tester = dbixcsl_common_tests->new( 'ntext' => { data_type => 'ntext' }, }, extra => { - count => 28 * 2, + create => [ + # 4 through 8 are used for the multi-schema tests + q{ + create table sqlanywhere_loader_test9 ( + id int identity not null primary key + ) + }, + q{ + create table sqlanywhere_loader_test10 ( + id int identity not null primary key, + nine_id int, + foreign key (nine_id) references sqlanywhere_loader_test9(id) + on delete cascade on update set null + ) + }, + ], + drop => [ qw/sqlanywhere_loader_test9 sqlanywhere_loader_test10/ ], + count => 4 + 30 * 2, run => sub { SKIP: { $schema = $_[0]; my $self = $_[3]; + # test on delete/update fk clause introspection + ok ((my $rel_info = $schema->source('SqlanywhereLoaderTest10')->relationship_info('nine')), + 'got rel info'); + + is $rel_info->{attrs}{on_delete}, 'CASCADE', + 'ON DELETE clause introspected correctly'; + + is $rel_info->{attrs}{on_update}, 'SET NULL', + 'ON UPDATE clause introspected correctly'; + + is $rel_info->{attrs}{is_deferrable}, 1, + 'is_deferrable defaults to 1'; + my $connect_info = [@$self{qw/dsn user password/}]; my $dbh = $schema->storage->dbh; @@ -159,7 +193,7 @@ my $tester = dbixcsl_common_tests->new( } catch { $schemas_created = 0; - skip "no CREATE USER privileges", 28 * 2; + skip "no CREATE USER privileges", 30 * 2; }; $dbh->do(<<"EOF"); @@ -172,12 +206,22 @@ EOF CREATE TABLE dbicsl_test1.sqlanywhere_loader_test5 ( id INT IDENTITY NOT NULL PRIMARY KEY, value VARCHAR(100), - four_id INTEGER NOT NULL UNIQUE, + four_id INTEGER NOT NULL, + CONSTRAINT loader_test5_uniq UNIQUE (four_id), FOREIGN KEY (four_id) REFERENCES dbicsl_test1.sqlanywhere_loader_test4 (id) ) EOF $dbh->do("CREATE USER dbicsl_test2 identified by 'dbicsl'"); $dbh->do(<<"EOF"); + CREATE TABLE dbicsl_test2.sqlanywhere_loader_test5 ( + pk INT IDENTITY NOT NULL PRIMARY KEY, + value VARCHAR(100), + four_id INTEGER NOT NULL, + CONSTRAINT loader_test5_uniq UNIQUE (four_id), + FOREIGN KEY (four_id) REFERENCES dbicsl_test1.sqlanywhere_loader_test4 (id) + ) +EOF + $dbh->do(<<"EOF"); CREATE TABLE dbicsl_test2.sqlanywhere_loader_test6 ( id INT IDENTITY NOT NULL PRIMARY KEY, value VARCHAR(100), @@ -258,7 +302,7 @@ EOF ok $row = $rs->create({ value => 'foo' }); } 'executed SQL on table in schema one'; - $rel_info = try { $rsrc->relationship_info('sqlanywhere_loader_test5') }; + $rel_info = try { $rsrc->relationship_info('dbicsl_test1_sqlanywhere_loader_test5') }; is_deeply $rel_info->{cond}, { 'foreign.four_id' => 'self.id' @@ -271,7 +315,7 @@ EOF 'relationship in schema one'; lives_and { - ok $rsrc = $test_schema->source('SqlanywhereLoaderTest5'); + ok $rsrc = $test_schema->source('DbicslTest1SqlanywhereLoaderTest5'); } 'got source for table in schema one'; %uniqs = try { $rsrc->unique_constraints }; @@ -279,6 +323,11 @@ EOF is keys %uniqs, 2, 'got unique and primary constraint in schema one'; + delete $uniqs{primary}; + + is_deeply ((values %uniqs)[0], ['four_id'], + 'correct unique constraint in schema one'); + lives_and { ok $rsrc = $test_schema->source('SqlanywhereLoaderTest6'); } 'got source for table in schema two'; @@ -321,6 +370,11 @@ EOF is keys %uniqs, 2, 'got unique and primary constraint in schema two'; + delete $uniqs{primary}; + + is_deeply ((values %uniqs)[0], ['six_id'], + 'correct unique constraint in schema two'); + lives_and { ok $test_schema->source('SqlanywhereLoaderTest6') ->has_relationship('sqlanywhere_loader_test4'); @@ -346,12 +400,7 @@ EOF }, ); -if (not ($dbd_sqlanywhere_dsn || $odbc_dsn)) { - $tester->skip_tests('You need to set the DBICTEST_SQLANYWHERE_DSN, _USER and _PASS and/or the DBICTEST_SQLANYWHERE_ODBC_DSN, _USER and _PASS environment variables'); -} -else { - $tester->run_tests(); -} +$tester->run_tests(); sub extra_cleanup { if (not $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) { @@ -359,6 +408,7 @@ sub extra_cleanup { foreach my $table ('dbicsl_test1.sqlanywhere_loader_test8', 'dbicsl_test2.sqlanywhere_loader_test7', 'dbicsl_test2.sqlanywhere_loader_test6', + 'dbicsl_test2.sqlanywhere_loader_test5', 'dbicsl_test1.sqlanywhere_loader_test5', 'dbicsl_test1.sqlanywhere_loader_test4') { try {