minor changes to table/column comment code
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 10_02mysql_common.t
CommitLineData
a78e3fed 1use strict;
ea998e8e 2use DBIx::Class::Schema::Loader::Utils 'slurp_file';
26334ec1 3use Test::More;
c2849787 4use lib qw(t/lib);
fbd83464 5use dbixcsl_common_tests;
a78e3fed 6
9e978a19 7my $dsn = $ENV{DBICTEST_MYSQL_DSN} || '';
8my $user = $ENV{DBICTEST_MYSQL_USER} || '';
9my $password = $ENV{DBICTEST_MYSQL_PASS} || '';
10my $test_innodb = $ENV{DBICTEST_MYSQL_INNODB} || 0;
a78e3fed 11
26334ec1 12my $skip_rels_msg = 'You need to set the DBICTEST_MYSQL_INNODB environment variable to test relationships.';
a78e3fed 13
e00d61ac 14my $innodb = $test_innodb ? q{Engine=InnoDB} : '';
15
fbd83464 16my $tester = dbixcsl_common_tests->new(
52bf3f26 17 vendor => 'Mysql',
18 auto_inc_pk => 'INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT',
e00d61ac 19 innodb => $innodb,
52bf3f26 20 dsn => $dsn,
21 user => $user,
22 password => $password,
309e2aa1 23 connect_info_opts=> { on_connect_call => 'set_strict_mode' },
eb040f78 24 loader_options => { preserve_case => 1 },
8ff3a23a 25 skip_rels => $test_innodb ? 0 : $skip_rels_msg,
6ebd0f33 26 quote_char => '`',
52bf3f26 27 no_inline_rels => 1,
28 no_implicit_rels => 1,
98857177 29 data_types => {
30 # http://dev.mysql.com/doc/refman/5.5/en/data-type-overview.html
31 # Numeric Types
26334ec1 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 } },
33aa3462 52 'integer not null'
53 => { data_type => 'integer' },
26334ec1 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 } },
98857177 66 'double precision' =>
26334ec1 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
98857177 96 # Date and Time Types
58333f16 97 'date' => { data_type => 'date', datetime_undef_if_invalid => 1 },
98 'datetime' => { data_type => 'datetime', datetime_undef_if_invalid => 1 },
6e566cc4 99 'timestamp default current_timestamp'
58333f16 100 => { data_type => 'timestamp', default_value => \'current_timestamp', datetime_undef_if_invalid => 1 },
26334ec1 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
98857177 106 # String Types
26334ec1 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
33aa3462 126 "enum('foo','bar','baz')"
26334ec1 127 => { data_type => 'enum', extra => { list => [qw/foo bar baz/] } },
e00d61ac 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}] } },
33aa3462 132 "set('foo','bar','baz')"
26334ec1 133 => { data_type => 'set', extra => { list => [qw/foo bar baz/] } },
698c11d8 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' },
0da287c8 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' },
98857177 142 },
3de915bc 143 extra => {
144 create => [
e00d61ac 145 qq{
6ebd0f33 146 CREATE TABLE `mysql_loader-test1` (
5c06aa08 147 id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'The\15\12Column',
3de915bc 148 value varchar(100)
5c06aa08 149 ) $innodb COMMENT 'The\15\12Table'
3de915bc 150 },
151 q{
6ebd0f33 152 CREATE VIEW mysql_loader_test2 AS SELECT * FROM `mysql_loader-test1`
3de915bc 153 },
e00d61ac 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 },
3de915bc 171 ],
172 pre_drop_ddl => [ 'DROP VIEW mysql_loader_test2', ],
e00d61ac 173 drop => [ 'mysql_loader-test1', 'mysql_loader_test3' ],
5c06aa08 174 count => 5,
3de915bc 175 run => sub {
176 my ($schema, $monikers, $classes) = @_;
177
6ebd0f33 178 is $monikers->{'mysql_loader-test1'}, 'MysqlLoaderTest1',
179 'table with dash correctly monikerized';
180
e00d61ac 181 my $rsrc = $schema->source('MysqlLoaderTest2');
3de915bc 182
183 is $rsrc->column_info('value')->{data_type}, 'varchar',
184 'view introspected successfully';
e00d61ac 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';
5c06aa08 190
191 my $class = $classes->{'mysql_loader-test1'};
ea998e8e 192 my $filename = $schema->loader->get_dump_filename($class);
5c06aa08 193
ea998e8e 194 my $code = slurp_file $filename;
5c06aa08 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
3de915bc 202 },
203 },
a78e3fed 204);
205
9e978a19 206if( !$dsn || !$user ) {
5c06aa08 207 $tester->skip_tests('You need to set the DBICTEST_MYSQL_DSN, DBICTEST_MYSQL_USER, and DBICTEST_MYSQL_PASS environment variables');
a78e3fed 208}
209else {
26334ec1 210 diag $skip_rels_msg if not $test_innodb;
a78e3fed 211 $tester->run_tests();
212}
26334ec1 213
214# vim:et sts=4 sw=4 tw=0: