X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Fquote_names.t;h=6492f256a0e4e06d81dab8b08ba33d32cd8c2867;hb=f9b5239ac;hp=073d7f3a4846e3bc56fa98670cfe4399ec5a5b40;hpb=2b8cc2f27d0dc881059e55dd6462bb28b7b8e414;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/quote_names.t b/t/storage/quote_names.t index 073d7f3..6492f25 100644 --- a/t/storage/quote_names.t +++ b/t/storage/quote_names.t @@ -1,8 +1,8 @@ use strict; use warnings; use Test::More; -use Test::Exception; use Data::Dumper::Concise; +use Try::Tiny; use lib qw(t/lib); use DBICTest; @@ -49,10 +49,12 @@ my %expected = ( { quote_char => [ '[', ']' ], name_sep => '.' }, ); -while (my ($class, $mapping) = each %expected) { +for my $class (keys %expected) { SKIP: { + eval "require ${class}" + or skip "Skipping test of quotes for $class due to missing dependencies", 1; + + my $mapping = $expected{$class}; my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/}; - eval "require ${class};"; - die $@ if $@; my $instance = $class->new; my $quote_char_text = dumper($quote_char); @@ -64,25 +66,15 @@ while (my ($class, $mapping) = each %expected) { is $instance->sql_name_sep, $name_sep, "sql_name_sep for $class is '$name_sep'"; -} +}} # Try quote_names with available DBs. -# SQLite first. - -my $schema = DBICTest->init_schema(quote_names => 1); - -is $schema->storage->sql_maker->quote_char, '"', - q{quote_names => 1 sets correct quote_char for SQLite ('"')}; - -is $schema->storage->sql_maker->name_sep, '.', - q{quote_names => 1 sets correct name_sep for SQLite (".")}; - -# Now the others. - # Env var to base class mapping, these are the DBs I actually have. -# -- Caelum +# the SQLITE is a fake memory dsn +local $ENV{DBICTEST_SQLITE_DSN} = 'dbi:SQLite::memory:'; my %dbs = ( + SQLITE => 'DBIx::Class::Storage::DBI::SQLite', ORA => 'DBIx::Class::Storage::DBI::Oracle::Generic', PG => 'DBIx::Class::Storage::DBI::Pg', MYSQL => 'DBIx::Class::Storage::DBI::mysql', @@ -96,37 +88,62 @@ my %dbs = ( MSSQL_ODBC => 'DBIx::Class::Storage::DBI::MSSQL', ); -while (my ($db, $base_class) = each %dbs) { +# lie that we already locked stuff - the tests below do not touch anything +$ENV{DBICTEST_LOCK_HOLDER} = -1; + +# Make sure oracle is tried last - some clients (e.g. 10.2) have symbol +# clashes with libssl, and will segfault everything coming after them +for my $db (sort { + $a eq 'ORA' ? 1 + : $b eq 'ORA' ? -1 + : $a cmp $b +} keys %dbs) { my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/; next unless $dsn; - my $schema = DBICTest::Schema->connect($dsn, $user, $pass, { - quote_names => 1 - }); + my $schema; + + try { + $schema = DBICTest::Schema->connect($dsn, $user, $pass, { + quote_names => 1 + }); + $schema->storage->ensure_connected; + 1; + } || next; - my $expected_quote_char = $expected{$base_class}{quote_char}; - my $quote_char_text = dumper($expected_quote_char); + my ($exp_quote_char, $exp_name_sep) = + @{$expected{$dbs{$db}}}{qw/quote_char name_sep/}; + + my ($quote_char_text, $name_sep_text) = map { dumper($_) } + ($exp_quote_char, $exp_name_sep); is_deeply $schema->storage->sql_maker->quote_char, - $expected_quote_char, + $exp_quote_char, "$db quote_char with quote_names => 1 is $quote_char_text"; - my $expected_name_sep = $expected{$base_class}{name_sep}; is $schema->storage->sql_maker->name_sep, - $expected_name_sep, - "$db name_sep with quote_names => 1 is '$expected_name_sep'"; + $exp_name_sep, + "$db name_sep with quote_names => 1 is $name_sep_text"; + + # if something was produced - it better be quoted + if ( my $ddl = try { $schema->deployment_statements } ) { + + my $quoted_artist = $schema->storage->sql_maker->_quote('artist'); + + like ($ddl, qr/^CREATE\s+TABLE\s+\Q$quoted_artist/msi, "$db DDL contains expected quoted table name"); + } } done_testing; sub dumper { - my $val = shift; + my $val = shift; - my $dd = DumperObject; - $dd->Indent(0); - return $dd->Values([ $val ])->Dump; + my $dd = DumperObject; + $dd->Indent(0); + return $dd->Values([ $val ])->Dump; } 1;