check database driver dependencies for tests
[dbsrgits/DBIx-Class.git] / t / storage / quote_names.t
CommitLineData
2b8cc2f2 1use strict;
2use warnings;
3use Test::More;
4use Test::Exception;
5use Data::Dumper::Concise;
199fbc45 6use Try::Tiny;
2b8cc2f2 7use lib qw(t/lib);
8use DBICTest;
9
10my %expected = (
11 'DBIx::Class::Storage::DBI' =>
12 # no default quote_char
13 { name_sep => '.' },
14
15 'DBIx::Class::Storage::DBI::MSSQL' =>
16 { quote_char => [ '[', ']' ], name_sep => '.' },
17
18 'DBIx::Class::Storage::DBI::DB2' =>
19 { quote_char => '"', name_sep => '.' },
20
21 'DBIx::Class::Storage::DBI::Informix' =>
22 { quote_char => '"', name_sep => '.' },
23
24 'DBIx::Class::Storage::DBI::InterBase' =>
25 { quote_char => '"', name_sep => '.' },
26
27 'DBIx::Class::Storage::DBI::mysql' =>
28 { quote_char => '`', name_sep => '.' },
29
30 'DBIx::Class::Storage::DBI::Pg' =>
31 { quote_char => '"', name_sep => '.' },
32
33 'DBIx::Class::Storage::DBI::ODBC::ACCESS' =>
34 { quote_char => [ '[', ']' ], name_sep => '.' },
35
36# Not testing this one, it's a pain.
37# 'DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL' =>
38# { quote_char => '"', name_sep => qr/must be connected/ },
39
40 'DBIx::Class::Storage::DBI::Oracle::Generic' =>
41 { quote_char => '"', name_sep => '.' },
42
43 'DBIx::Class::Storage::DBI::SQLAnywhere' =>
44 { quote_char => '"', name_sep => '.' },
45
46 'DBIx::Class::Storage::DBI::SQLite' =>
47 { quote_char => '"', name_sep => '.' },
48
49 'DBIx::Class::Storage::DBI::Sybase::ASE' =>
50 { quote_char => [ '[', ']' ], name_sep => '.' },
51);
52
665f6286 53for my $class (keys %expected) { SKIP: {
54 eval "require ${class}"
55 or skip "Skipping test of quotes for $class due to missing dependencies", 1;
56
57 my $mapping = $expected{$class};
2b8cc2f2 58 my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
2b8cc2f2 59 my $instance = $class->new;
60
61 my $quote_char_text = dumper($quote_char);
62
63 if (exists $mapping->{quote_char}) {
64 is_deeply $instance->sql_quote_char, $quote_char,
65 "sql_quote_char for $class is $quote_char_text";
66 }
67
68 is $instance->sql_name_sep, $name_sep,
69 "sql_name_sep for $class is '$name_sep'";
665f6286 70}}
2b8cc2f2 71
72# Try quote_names with available DBs.
73
74# SQLite first.
75
76my $schema = DBICTest->init_schema(quote_names => 1);
77
78is $schema->storage->sql_maker->quote_char, '"',
79 q{quote_names => 1 sets correct quote_char for SQLite ('"')};
80
81is $schema->storage->sql_maker->name_sep, '.',
82 q{quote_names => 1 sets correct name_sep for SQLite (".")};
83
84# Now the others.
85
86# Env var to base class mapping, these are the DBs I actually have.
87# -- Caelum
88my %dbs = (
89 ORA => 'DBIx::Class::Storage::DBI::Oracle::Generic',
90 PG => 'DBIx::Class::Storage::DBI::Pg',
91 MYSQL => 'DBIx::Class::Storage::DBI::mysql',
92 DB2 => 'DBIx::Class::Storage::DBI::DB2',
93 SYBASE => 'DBIx::Class::Storage::DBI::Sybase::ASE',
94 SQLANYWHERE => 'DBIx::Class::Storage::DBI::SQLAnywhere',
95 SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
96 FIREBIRD => 'DBIx::Class::Storage::DBI::InterBase',
97 FIREBIRD_ODBC => 'DBIx::Class::Storage::DBI::InterBase',
98 INFORMIX => 'DBIx::Class::Storage::DBI::Informix',
99 MSSQL_ODBC => 'DBIx::Class::Storage::DBI::MSSQL',
100);
101
102while (my ($db, $base_class) = each %dbs) {
103 my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
104
105 next unless $dsn;
106
199fbc45 107 my $schema;
108
109 try {
110 $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
111 quote_names => 1
112 });
113 $schema->storage->ensure_connected;
114 1;
115 } || next;
2b8cc2f2 116
117 my $expected_quote_char = $expected{$base_class}{quote_char};
118 my $quote_char_text = dumper($expected_quote_char);
119
120 is_deeply $schema->storage->sql_maker->quote_char,
121 $expected_quote_char,
122 "$db quote_char with quote_names => 1 is $quote_char_text";
123
124 my $expected_name_sep = $expected{$base_class}{name_sep};
125
126 is $schema->storage->sql_maker->name_sep,
127 $expected_name_sep,
128 "$db name_sep with quote_names => 1 is '$expected_name_sep'";
129}
130
131done_testing;
132
133sub dumper {
134 my $val = shift;
135
136 my $dd = DumperObject;
137 $dd->Indent(0);
138 return $dd->Values([ $val ])->Dump;
139}
140
1411;