Some cosmetic fixes in ANFANG
[dbsrgits/DBIx-Class.git] / t / storage / quote_names.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5 use Test::More;
6 use Try::Tiny;
7
8 use DBICTest;
9 use DBIx::Class::_Util 'dump_value';
10 $Data::Dumper::Indent = 0;
11
12 my %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
55 for my $class (keys %expected) { SKIP: {
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   };
61
62   my $mapping = $expected{$class};
63   my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
64   my $instance = $class->new;
65
66   my $quote_char_text = dump_value $quote_char;
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'";
75 }}
76
77 # Try quote_names with available DBs.
78
79 # Env var to base class mapping, these are the DBs I actually have.
80 # the SQLITE is a fake memory dsn
81 local $ENV{DBICTEST_SQLITE_DSN} = 'dbi:SQLite::memory:';
82 my %dbs = (
83   SQLITE           => 'DBIx::Class::Storage::DBI::SQLite',
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
97 # lie that we already locked stuff - the tests below do not touch anything
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;
101
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
104 for my $db (sort {
105     $a eq 'ORA' ? 1
106   : $b eq 'ORA' ? -1
107   : $a cmp $b
108 } keys %dbs) {
109   my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
110
111   next unless $dsn;
112
113   my $schema;
114
115   my $sql_maker = try {
116     $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
117       quote_names => 1
118     });
119     $schema->storage->ensure_connected;
120     $schema->storage->sql_maker;
121   } || next;
122
123   my ($exp_quote_char, $exp_name_sep) =
124     @{$expected{$dbs{$db}}}{qw/quote_char name_sep/};
125
126   my ($quote_char_text, $name_sep_text) = map { dump_value $_ }
127     ($exp_quote_char, $exp_name_sep);
128
129   is_deeply $sql_maker->quote_char,
130     $exp_quote_char,
131     "$db quote_char with quote_names => 1 is $quote_char_text";
132
133
134   is $sql_maker->name_sep,
135     $exp_name_sep,
136     "$db name_sep with quote_names => 1 is $name_sep_text";
137
138   # if something was produced - it better be quoted
139   if (
140     # the SQLT producer has no idea what quotes are :/
141     ! grep { $db eq $_ } qw( SYBASE DB2 )
142       and
143     my $ddl = try { $schema->deployment_statements }
144   ) {
145     my $quoted_artist = $sql_maker->_quote('artist');
146
147     like ($ddl, qr/^CREATE\s+TABLE\s+\Q$quoted_artist/msi, "$db DDL contains expected quoted table name");
148   }
149 }
150
151 done_testing;