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