2 use DBIx::Class::Schema::Loader::Utils 'slurp_file';
5 use dbixcsl_common_tests;
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;
12 my $skip_rels_msg = 'You need to set the DBICTEST_MYSQL_INNODB environment variable to test relationships.';
14 my $innodb = $test_innodb ? q{Engine=InnoDB} : '';
16 my $tester = dbixcsl_common_tests->new(
18 auto_inc_pk => 'INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT',
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,
28 no_implicit_rels => 1,
30 # http://dev.mysql.com/doc/refman/5.5/en/data-type-overview.html
32 'bit' => { data_type => 'bit', size => 1 },
33 'bit(11)' => { data_type => 'bit', size => 11 },
35 'bool' => { data_type => 'tinyint' },
36 'boolean' => { data_type => 'tinyint' },
37 'tinyint' => { data_type => 'tinyint' },
39 => { data_type => 'tinyint', extra => { unsigned => 1 } },
40 'smallint' => { data_type => 'smallint' },
42 => { data_type => 'smallint', extra => { unsigned => 1 } },
43 'mediumint' => { data_type => 'mediumint' },
45 => { data_type => 'mediumint', extra => { unsigned => 1 } },
46 'int' => { data_type => 'integer' },
48 => { data_type => 'integer', extra => { unsigned => 1 } },
49 'integer' => { data_type => 'integer' },
51 => { data_type => 'integer', extra => { unsigned => 1 } },
53 => { data_type => 'integer' },
54 'bigint' => { data_type => 'bigint' },
56 => { data_type => 'bigint', extra => { unsigned => 1 } },
58 'serial' => { data_type => 'bigint', is_auto_increment => 1, extra => { unsigned => 1 } },
60 'float' => { data_type => 'float' },
62 => { data_type => 'float', extra => { unsigned => 1 } },
63 'double' => { data_type => 'double precision' },
65 => { data_type => 'double precision', extra => { unsigned => 1 } },
67 { data_type => 'double precision' },
68 'double precision unsigned'
69 => { data_type => 'double precision', extra => { unsigned => 1 } },
71 # we skip 'real' because its alias depends on the 'REAL AS FLOAT' setting
73 'float(2)' => { data_type => 'float' },
74 'float(24)' => { data_type => 'float' },
75 'float(25)' => { data_type => 'double precision' },
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] },
82 'decimal' => { data_type => 'decimal' },
84 => { data_type => 'decimal', extra => { unsigned => 1 } },
85 'dec' => { data_type => 'decimal' },
86 'numeric' => { data_type => 'decimal' },
87 'fixed' => { data_type => 'decimal' },
89 'decimal(3)' => { data_type => 'decimal', size => [3,0] },
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] },
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 },
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 },
114 'tinyblob' => { data_type => 'tinyblob' },
115 'tinytext' => { data_type => 'tinytext' },
116 'blob' => { data_type => 'blob' },
118 # text(M) types will map to the appropriate type, length is not stored
119 'text' => { data_type => 'text' },
121 'mediumblob' => { data_type => 'mediumblob' },
122 'mediumtext' => { data_type => 'mediumtext' },
123 'longblob' => { data_type => 'longblob' },
124 'longtext' => { data_type => 'longtext' },
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/] } },
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' },
146 CREATE TABLE `mysql_loader-test1` (
147 id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'The\15\12Column',
149 ) $innodb COMMENT 'The\15\12Table'
152 CREATE VIEW mysql_loader_test2 AS SELECT * FROM `mysql_loader-test1`
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`)
172 pre_drop_ddl => [ 'DROP VIEW mysql_loader_test2', ],
173 drop => [ 'mysql_loader-test1', 'mysql_loader_test3' ],
176 my ($schema, $monikers, $classes) = @_;
178 is $monikers->{'mysql_loader-test1'}, 'MysqlLoaderTest1',
179 'table with dash correctly monikerized';
181 my $rsrc = $schema->source('MysqlLoaderTest2');
183 is $rsrc->column_info('value')->{data_type}, 'varchar',
184 'view introspected successfully';
186 $rsrc = $schema->source('MysqlLoaderTest3');
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';
191 my $class = $classes->{'mysql_loader-test1'};
192 my $filename = $schema->loader->get_dump_filename($class);
194 my $code = slurp_file $filename;
196 like $code, qr/^=head1 NAME\n\n^$class - The\nTable\n\n^=cut\n/m,
199 like $code, qr/^=head2 id\n\n(.+:.+\n)+\nThe\nColumn\n\n/m,
200 'column comment and attrs';
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');
210 diag $skip_rels_msg if not $test_innodb;
211 $tester->run_tests();
214 # vim:et sts=4 sw=4 tw=0: