Better exception when things get really really bad with prepare()
[dbsrgits/DBIx-Class.git] / t / storage / quote_names.t
1 use strict;
2 use warnings;
3 use Test::More;
4 use Test::Exception;
5 use Data::Dumper::Concise;
6 use lib qw(t/lib);
7 use DBICTest;
8
9 my %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
52 while (my ($class, $mapping) = each %expected) {
53   my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
54   eval "require ${class};";
55   die $@ if $@;
56   my $instance = $class->new;
57
58   my $quote_char_text = dumper($quote_char);
59
60   if (exists $mapping->{quote_char}) {
61     is_deeply $instance->sql_quote_char, $quote_char,
62       "sql_quote_char for $class is $quote_char_text";
63   }
64
65   is $instance->sql_name_sep, $name_sep,
66     "sql_name_sep for $class is '$name_sep'";
67 }
68
69 # Try quote_names with available DBs.
70
71 # SQLite first.
72
73 my $schema = DBICTest->init_schema(quote_names => 1);
74
75 is $schema->storage->sql_maker->quote_char, '"',
76   q{quote_names => 1 sets correct quote_char for SQLite ('"')};
77
78 is $schema->storage->sql_maker->name_sep, '.',
79   q{quote_names => 1 sets correct name_sep for SQLite (".")};
80
81 # Now the others.
82
83 # Env var to base class mapping, these are the DBs I actually have.
84 # -- Caelum
85 my %dbs = (
86   ORA              => 'DBIx::Class::Storage::DBI::Oracle::Generic',
87   PG               => 'DBIx::Class::Storage::DBI::Pg',
88   MYSQL            => 'DBIx::Class::Storage::DBI::mysql',
89   DB2              => 'DBIx::Class::Storage::DBI::DB2',
90   SYBASE           => 'DBIx::Class::Storage::DBI::Sybase::ASE',
91   SQLANYWHERE      => 'DBIx::Class::Storage::DBI::SQLAnywhere',
92   SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
93   FIREBIRD         => 'DBIx::Class::Storage::DBI::InterBase',
94   FIREBIRD_ODBC    => 'DBIx::Class::Storage::DBI::InterBase',
95   INFORMIX         => 'DBIx::Class::Storage::DBI::Informix',
96   MSSQL_ODBC       => 'DBIx::Class::Storage::DBI::MSSQL',
97 );
98
99 while (my ($db, $base_class) = each %dbs) {
100   my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
101
102   next unless $dsn;
103
104   my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
105     quote_names => 1
106   });
107
108   my $expected_quote_char = $expected{$base_class}{quote_char};
109   my $quote_char_text = dumper($expected_quote_char);
110
111   is_deeply $schema->storage->sql_maker->quote_char,
112     $expected_quote_char,
113     "$db quote_char with quote_names => 1 is $quote_char_text";
114
115   my $expected_name_sep = $expected{$base_class}{name_sep};
116
117   is $schema->storage->sql_maker->name_sep,
118     $expected_name_sep,
119     "$db name_sep with quote_names => 1 is '$expected_name_sep'";
120 }
121
122 done_testing;
123
124 sub dumper {
125     my $val = shift;
126
127     my $dd = DumperObject;
128     $dd->Indent(0);
129     return $dd->Values([ $val ])->Dump;
130 }
131
132 1;