Fix failing tests with DBICTEST_SYBASE_DSN set
[dbsrgits/DBIx-Class.git] / t / storage / quote_names.t
CommitLineData
2b8cc2f2 1use strict;
2use warnings;
3use Test::More;
2b8cc2f2 4use Data::Dumper::Concise;
199fbc45 5use Try::Tiny;
2b8cc2f2 6use lib qw(t/lib);
7use DBICTest;
8
9my %expected = (
10 'DBIx::Class::Storage::DBI' =>
11 # no default quote_char
12 { name_sep => '.' },
13
14 'DBIx::Class::Storage::DBI::MSSQL' =>
15 { quote_char => [ '[', ']' ], name_sep => '.' },
16
17 'DBIx::Class::Storage::DBI::DB2' =>
18 { quote_char => '"', name_sep => '.' },
19
20 'DBIx::Class::Storage::DBI::Informix' =>
21 { quote_char => '"', name_sep => '.' },
22
23 'DBIx::Class::Storage::DBI::InterBase' =>
24 { quote_char => '"', name_sep => '.' },
25
26 'DBIx::Class::Storage::DBI::mysql' =>
27 { quote_char => '`', name_sep => '.' },
28
29 'DBIx::Class::Storage::DBI::Pg' =>
30 { quote_char => '"', name_sep => '.' },
31
32 'DBIx::Class::Storage::DBI::ODBC::ACCESS' =>
33 { quote_char => [ '[', ']' ], name_sep => '.' },
34
35# Not testing this one, it's a pain.
36# 'DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL' =>
37# { quote_char => '"', name_sep => qr/must be connected/ },
38
39 'DBIx::Class::Storage::DBI::Oracle::Generic' =>
40 { quote_char => '"', name_sep => '.' },
41
42 'DBIx::Class::Storage::DBI::SQLAnywhere' =>
43 { quote_char => '"', name_sep => '.' },
44
45 'DBIx::Class::Storage::DBI::SQLite' =>
46 { quote_char => '"', name_sep => '.' },
47
48 'DBIx::Class::Storage::DBI::Sybase::ASE' =>
49 { quote_char => [ '[', ']' ], name_sep => '.' },
50);
51
665f6286 52for my $class (keys %expected) { SKIP: {
53 eval "require ${class}"
54 or skip "Skipping test of quotes for $class due to missing dependencies", 1;
55
56 my $mapping = $expected{$class};
2b8cc2f2 57 my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
2b8cc2f2 58 my $instance = $class->new;
59
60 my $quote_char_text = dumper($quote_char);
61
62 if (exists $mapping->{quote_char}) {
63 is_deeply $instance->sql_quote_char, $quote_char,
64 "sql_quote_char for $class is $quote_char_text";
65 }
66
67 is $instance->sql_name_sep, $name_sep,
68 "sql_name_sep for $class is '$name_sep'";
665f6286 69}}
2b8cc2f2 70
71# Try quote_names with available DBs.
72
2b8cc2f2 73# Env var to base class mapping, these are the DBs I actually have.
8a6f4150 74# the SQLITE is a fake memory dsn
75local $ENV{DBICTEST_SQLITE_DSN} = 'dbi:SQLite::memory:';
2b8cc2f2 76my %dbs = (
8a6f4150 77 SQLITE => 'DBIx::Class::Storage::DBI::SQLite',
2b8cc2f2 78 ORA => 'DBIx::Class::Storage::DBI::Oracle::Generic',
79 PG => 'DBIx::Class::Storage::DBI::Pg',
80 MYSQL => 'DBIx::Class::Storage::DBI::mysql',
81 DB2 => 'DBIx::Class::Storage::DBI::DB2',
82 SYBASE => 'DBIx::Class::Storage::DBI::Sybase::ASE',
83 SQLANYWHERE => 'DBIx::Class::Storage::DBI::SQLAnywhere',
84 SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
85 FIREBIRD => 'DBIx::Class::Storage::DBI::InterBase',
86 FIREBIRD_ODBC => 'DBIx::Class::Storage::DBI::InterBase',
87 INFORMIX => 'DBIx::Class::Storage::DBI::Informix',
88 MSSQL_ODBC => 'DBIx::Class::Storage::DBI::MSSQL',
89);
90
8d6b1478 91# lie that we already locked stuff - the tests below do not touch anything
92$ENV{DBICTEST_LOCK_HOLDER} = -1;
93
8a6f4150 94# Make sure oracle is tried last - some clients (e.g. 10.2) have symbol
95# clashes with libssl, and will segfault everything coming after them
96for my $db (sort {
97 $a eq 'ORA' ? 1
98 : $b eq 'ORA' ? -1
99 : $a cmp $b
100} keys %dbs) {
2b8cc2f2 101 my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
102
103 next unless $dsn;
104
199fbc45 105 my $schema;
106
07d0bbab 107 my $sql_maker = try {
c7e85630 108 $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
199fbc45 109 quote_names => 1
110 });
111 $schema->storage->ensure_connected;
07d0bbab 112 $schema->storage->sql_maker;
199fbc45 113 } || next;
2b8cc2f2 114
8a6f4150 115 my ($exp_quote_char, $exp_name_sep) =
116 @{$expected{$dbs{$db}}}{qw/quote_char name_sep/};
117
118 my ($quote_char_text, $name_sep_text) = map { dumper($_) }
119 ($exp_quote_char, $exp_name_sep);
2b8cc2f2 120
07d0bbab 121 is_deeply $sql_maker->quote_char,
8a6f4150 122 $exp_quote_char,
2b8cc2f2 123 "$db quote_char with quote_names => 1 is $quote_char_text";
124
2b8cc2f2 125
07d0bbab 126 is $sql_maker->name_sep,
8a6f4150 127 $exp_name_sep,
128 "$db name_sep with quote_names => 1 is $name_sep_text";
f9b5239a 129
130 # if something was produced - it better be quoted
619f81c4 131 if (
132 # the SQLT producer has no idea what quotes are :/
133 $db ne 'SYBASE'
134 and
135 my $ddl = try { $schema->deployment_statements }
136 ) {
07d0bbab 137 my $quoted_artist = $sql_maker->_quote('artist');
f9b5239a 138
139 like ($ddl, qr/^CREATE\s+TABLE\s+\Q$quoted_artist/msi, "$db DDL contains expected quoted table name");
140 }
2b8cc2f2 141}
142
143done_testing;
144
145sub dumper {
8a6f4150 146 my $val = shift;
2b8cc2f2 147
8a6f4150 148 my $dd = DumperObject;
149 $dd->Indent(0);
150 return $dd->Values([ $val ])->Dump;
2b8cc2f2 151}
152
1531;