9a538ea037fa832e8873f43b0442f4a4b3ced5f2
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 10_02mysql_common.t
1 use strict;
2 use DBIx::Class::Schema::Loader::Utils 'slurp_file';
3 use Test::More;
4 use lib qw(t/lib);
5 use dbixcsl_common_tests;
6
7 my $dsn         = $ENV{DBICTEST_MYSQL_DSN} || '';
8 my $user        = $ENV{DBICTEST_MYSQL_USER} || '';
9 my $password    = $ENV{DBICTEST_MYSQL_PASS} || '';
10 my $test_innodb = $ENV{DBICTEST_MYSQL_INNODB} || 0;
11
12 my $skip_rels_msg = 'You need to set the DBICTEST_MYSQL_INNODB environment variable to test relationships.';
13
14 my $innodb = $test_innodb ? q{Engine=InnoDB} : '';
15
16 my $tester = dbixcsl_common_tests->new(
17     vendor           => 'Mysql',
18     auto_inc_pk      => 'INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT',
19     innodb           => $innodb,
20     dsn              => $dsn,
21     user             => $user,
22     password         => $password,
23     connect_info_opts=> { on_connect_call => 'set_strict_mode' },
24     loader_options   => { preserve_case => 1 },
25     skip_rels        => $test_innodb ? 0 : $skip_rels_msg,
26     quote_char       => '`',
27     no_inline_rels   => 1,
28     no_implicit_rels => 1,
29     data_types  => {
30         # http://dev.mysql.com/doc/refman/5.5/en/data-type-overview.html
31         # Numeric Types
32         'bit'         => { data_type => 'bit', size => 1 },
33         'bit(11)'     => { data_type => 'bit', size => 11 },
34
35         'bool'        => { data_type => 'tinyint' },
36         'boolean'     => { data_type => 'tinyint' },
37         'tinyint'     => { data_type => 'tinyint' },
38         'tinyint unsigned'
39                       => { data_type => 'tinyint',   extra => { unsigned => 1 } },
40         'smallint'    => { data_type => 'smallint' },
41         'smallint unsigned'
42                       => { data_type => 'smallint',  extra => { unsigned => 1 } },
43         'mediumint'   => { data_type => 'mediumint' },
44         'mediumint unsigned'
45                       => { data_type => 'mediumint', extra => { unsigned => 1 } },
46         'int'         => { data_type => 'integer' },
47         'int unsigned'
48                       => { data_type => 'integer',   extra => { unsigned => 1 } },
49         'integer'     => { data_type => 'integer' },
50         'integer unsigned'
51                       => { data_type => 'integer',   extra => { unsigned => 1 } },
52         'integer not null'
53                       => { data_type => 'integer' },
54         'bigint'      => { data_type => 'bigint' },
55         'bigint unsigned'
56                       => { data_type => 'bigint',    extra => { unsigned => 1 } },
57
58         'serial'      => { data_type => 'bigint', is_auto_increment => 1, extra => { unsigned => 1 } },
59
60         'float'       => { data_type => 'float' },
61         'float unsigned'
62                       => { data_type => 'float',     extra => { unsigned => 1 } },
63         'double'      => { data_type => 'double precision' },
64         'double unsigned'
65                       => { data_type => 'double precision', extra => { unsigned => 1 } },
66         'double precision' =>
67                          { data_type => 'double precision' },
68         'double precision unsigned'
69                       => { data_type => 'double precision', extra => { unsigned => 1 } },
70
71         # we skip 'real' because its alias depends on the 'REAL AS FLOAT' setting
72
73         'float(2)'    => { data_type => 'float' },
74         'float(24)'   => { data_type => 'float' },
75         'float(25)'   => { data_type => 'double precision' },
76
77         'float(3,3)'  => { data_type => 'float', size => [3,3] },
78         'double(3,3)' => { data_type => 'double precision', size => [3,3] },
79         'double precision(3,3)'
80                       => { data_type => 'double precision', size => [3,3] },
81
82         'decimal'     => { data_type => 'decimal' },
83         'decimal unsigned'
84                       => { data_type => 'decimal', extra => { unsigned => 1 } },
85         'dec'         => { data_type => 'decimal' },
86         'numeric'     => { data_type => 'decimal' },
87         'fixed'       => { data_type => 'decimal' },
88
89         'decimal(3)'   => { data_type => 'decimal', size => [3,0] },
90
91         'decimal(3,3)' => { data_type => 'decimal', size => [3,3] },
92         'dec(3,3)'     => { data_type => 'decimal', size => [3,3] },
93         'numeric(3,3)' => { data_type => 'decimal', size => [3,3] },
94         'fixed(3,3)'   => { data_type => 'decimal', size => [3,3] },
95
96         # Date and Time Types
97         'date'        => { data_type => 'date', datetime_undef_if_invalid => 1 },
98         'datetime'    => { data_type => 'datetime', datetime_undef_if_invalid => 1 },
99         'timestamp default current_timestamp'
100                       => { data_type => 'timestamp', default_value => \'current_timestamp', datetime_undef_if_invalid => 1 },
101         'time'        => { data_type => 'time' },
102         'year'        => { data_type => 'year' },
103         'year(4)'     => { data_type => 'year' },
104         'year(2)'     => { data_type => 'year', size => 2 },
105
106         # String Types
107         'char'         => { data_type => 'char',      size => 1  },
108         'char(11)'     => { data_type => 'char',      size => 11 },
109         'varchar(20)'  => { data_type => 'varchar',   size => 20 },
110         'binary'       => { data_type => 'binary',    size => 1  },
111         'binary(11)'   => { data_type => 'binary',    size => 11 },
112         'varbinary(20)'=> { data_type => 'varbinary', size => 20 },
113
114         'tinyblob'    => { data_type => 'tinyblob' },
115         'tinytext'    => { data_type => 'tinytext' },
116         'blob'        => { data_type => 'blob' },
117
118         # text(M) types will map to the appropriate type, length is not stored
119         'text'        => { data_type => 'text' },
120
121         'mediumblob'  => { data_type => 'mediumblob' },
122         'mediumtext'  => { data_type => 'mediumtext' },
123         'longblob'    => { data_type => 'longblob' },
124         'longtext'    => { data_type => 'longtext' },
125
126         "enum('foo','bar','baz')"
127                       => { data_type => 'enum', extra => { list => [qw/foo bar baz/] } },
128         "enum('foo \\'bar\\' baz', 'foo ''bar'' quux')"
129                       => { data_type => 'enum', extra => { list => [q{foo 'bar' baz}, q{foo 'bar' quux}] } },
130         "set('foo \\'bar\\' baz', 'foo ''bar'' quux')"
131                       => { data_type => 'set', extra => { list => [q{foo 'bar' baz}, q{foo 'bar' quux}] } },
132         "set('foo','bar','baz')"
133                       => { data_type => 'set',  extra => { list => [qw/foo bar baz/] } },
134
135         # RT#68717
136         "enum('11,10 (<500)/0 DUN','4,90 (<120)/0 EUR') NOT NULL default '11,10 (<500)/0 DUN'"
137                       => { data_type => 'enum', extra => { list => ['11,10 (<500)/0 DUN', '4,90 (<120)/0 EUR'] }, default_value => '11,10 (<500)/0 DUN' },
138         "set('11_10 (<500)/0 DUN','4_90 (<120)/0 EUR') NOT NULL default '11_10 (<500)/0 DUN'"
139                       => { data_type => 'set', extra => { list => ['11_10 (<500)/0 DUN', '4_90 (<120)/0 EUR'] }, default_value => '11_10 (<500)/0 DUN' },
140         "enum('19,90 (<500)/0 EUR','4,90 (<120)/0 EUR','7,90 (<200)/0 CHF','300 (<6000)/0 CZK','4,90 (<100)/0 EUR','39 (<900)/0 DKK','299 (<5000)/0 EEK','9,90 (<250)/0 EUR','3,90 (<100)/0 GBP','3000 (<70000)/0 HUF','4000 (<70000)/0 JPY','13,90 (<200)/0 LVL','99 (<2500)/0 NOK','39 (<1000)/0 PLN','1000 (<20000)/0 RUB','49 (<2500)/0 SEK','29 (<600)/0 USD','19,90 (<600)/0 EUR','0 EUR','0 CHF') NOT NULL default '19,90 (<500)/0 EUR'"
141                       => { data_type => 'enum', extra => { list => ['19,90 (<500)/0 EUR','4,90 (<120)/0 EUR','7,90 (<200)/0 CHF','300 (<6000)/0 CZK','4,90 (<100)/0 EUR','39 (<900)/0 DKK','299 (<5000)/0 EEK','9,90 (<250)/0 EUR','3,90 (<100)/0 GBP','3000 (<70000)/0 HUF','4000 (<70000)/0 JPY','13,90 (<200)/0 LVL','99 (<2500)/0 NOK','39 (<1000)/0 PLN','1000 (<20000)/0 RUB','49 (<2500)/0 SEK','29 (<600)/0 USD','19,90 (<600)/0 EUR','0 EUR','0 CHF'] }, default_value => '19,90 (<500)/0 EUR' },
142     },
143     extra => {
144         create => [
145             qq{
146                 CREATE TABLE `mysql_loader-test1` (
147                     id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'The\15\12Column',
148                     value varchar(100)
149                 ) $innodb COMMENT 'The\15\12Table'
150             },
151             q{
152                 CREATE VIEW mysql_loader_test2 AS SELECT * FROM `mysql_loader-test1`
153             },
154             # RT#68717
155             qq{
156                 CREATE TABLE `mysql_loader_test3` (
157                   `ISO3_code` char(3) NOT NULL default '',
158                   `lang_pref` enum('de','en','fr','nl','dk','es','se') NOT NULL,
159                   `vat` decimal(4,2) default '16.00',
160                   `price_group` enum('EUR_DEFAULT','GBP_GBR','EUR_AUT_BEL_FRA_IRL_NLD','EUR_DNK_SWE','EUR_AUT','EUR_BEL','EUR_FIN','EUR_FRA','EUR_IRL','EUR_NLD','EUR_DNK','EUR_POL','EUR_PRT','EUR_SWE','CHF_CHE','DKK_DNK','SEK_SWE','NOK_NOR','USD_USA','CZK_CZE','PLN_POL','RUB_RUS','HUF_HUN','SKK_SVK','JPY_JPN','LVL_LVA','ROL_ROU','EEK_EST') NOT NULL default 'EUR_DEFAULT',
161                   `del_group` enum('19,90 (<500)/0 EUR','4,90 (<120)/0 EUR','7,90 (<200)/0 CHF','300 (<6000)/0 CZK','4,90 (<100)/0 EUR','39 (<900)/0 DKK','299 (<5000)/0 EEK','9,90 (<250)/0 EUR','3,90 (<100)/0 GBP','3000 (<70000)/0 HUF','4000 (<70000)/0 JPY','13,90 (<200)/0 LVL','99 (<2500)/0 NOK','39 (<1000)/0 PLN','1000 (<20000)/0 RUB','49 (<2500)/0 SEK','29 (<600)/0 USD','19,90 (<600)/0 EUR','0 EUR','0 CHF') NOT NULL default '19,90 (<500)/0 EUR',
162                   `express_del_group` enum('NO','39 EUR (EXPRESS)','59 EUR (EXPRESS)','79 CHF (EXPRESS)','49 EUR (EXPRESS)','990 CZK (EXPRESS)','19,9 EUR (EXPRESS)','290 DKK (EXPRESS)','990 EEK (EXPRESS)','39 GBP (EXPRESS)','14000 HUF (EXPRESS)','49 LVL (EXPRESS)','590 NOK (EXPRESS)','250 PLN (EXPRESS)','490 SEK (EXPRESS)') NOT NULL default 'NO',
163                   `pmethod` varchar(255) NOT NULL default 'VISA,MASTER',
164                   `delivery_time` varchar(5) default NULL,
165                   `express_delivery_time` varchar(5) default NULL,
166                   `eu` int(1) default '0',
167                   `cod_costs` varchar(12) default NULL,
168                   PRIMARY KEY (`ISO3_code`)
169                 ) $innodb
170             },
171         ],
172         pre_drop_ddl => [ 'DROP VIEW mysql_loader_test2', ],
173         drop => [ 'mysql_loader-test1', 'mysql_loader_test3' ],
174         count => 5,
175         run => sub {
176             my ($schema, $monikers, $classes) = @_;
177
178             is $monikers->{'mysql_loader-test1'}, 'MysqlLoaderTest1',
179                 'table with dash correctly monikerized';
180
181             my $rsrc = $schema->source('MysqlLoaderTest2');
182
183             is $rsrc->column_info('value')->{data_type}, 'varchar',
184                 'view introspected successfully';
185
186             $rsrc = $schema->source('MysqlLoaderTest3');
187
188             is_deeply $rsrc->column_info('del_group')->{extra}{list}, ['19,90 (<500)/0 EUR','4,90 (<120)/0 EUR','7,90 (<200)/0 CHF','300 (<6000)/0 CZK','4,90 (<100)/0 EUR','39 (<900)/0 DKK','299 (<5000)/0 EEK','9,90 (<250)/0 EUR','3,90 (<100)/0 GBP','3000 (<70000)/0 HUF','4000 (<70000)/0 JPY','13,90 (<200)/0 LVL','99 (<2500)/0 NOK','39 (<1000)/0 PLN','1000 (<20000)/0 RUB','49 (<2500)/0 SEK','29 (<600)/0 USD','19,90 (<600)/0 EUR','0 EUR','0 CHF'],
189                 'hairy enum introspected correctly';
190
191             my $class    = $classes->{'mysql_loader-test1'};
192             my $filename = $schema->loader->get_dump_filename($class);
193
194             my $code = slurp_file $filename;
195
196             like $code, qr/^=head1 NAME\n\n^$class - The\nTable\n\n^=cut\n/m,
197                 'table comment';
198
199             like $code, qr/^=head2 id\n\n(.+:.+\n)+\nThe\nColumn\n\n/m,
200                 'column comment and attrs';
201
202         },
203     },
204 );
205
206 if( !$dsn || !$user ) {
207     $tester->skip_tests('You need to set the DBICTEST_MYSQL_DSN, DBICTEST_MYSQL_USER, and DBICTEST_MYSQL_PASS environment variables');
208 }
209 else {
210     diag $skip_rels_msg if not $test_innodb;
211     $tester->run_tests();
212 }
213
214 # vim:et sts=4 sw=4 tw=0: