adding multi-schema tests
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 10_03pg_common.t
CommitLineData
a78e3fed 1use strict;
c2849787 2use lib qw(t/lib);
12b86f07 3use DBIx::Class::Schema::Loader 'make_schema_at';
4use DBIx::Class::Schema::Loader::Utils 'no_warnings';
fbd83464 5use dbixcsl_common_tests;
fdd8ff16 6use Test::More;
12b86f07 7use Test::Exception;
9065de34 8use File::Slurp 'slurp';
af15ea33 9use utf8;
10use Encode 'decode';
12b86f07 11use Try::Tiny;
a78e3fed 12
9e978a19 13my $dsn = $ENV{DBICTEST_PG_DSN} || '';
14my $user = $ENV{DBICTEST_PG_USER} || '';
15my $password = $ENV{DBICTEST_PG_PASS} || '';
a78e3fed 16
fbd83464 17my $tester = dbixcsl_common_tests->new(
a78e3fed 18 vendor => 'Pg',
19 auto_inc_pk => 'SERIAL NOT NULL PRIMARY KEY',
9e978a19 20 dsn => $dsn,
a78e3fed 21 user => $user,
22 password => $password,
c930f78b 23 loader_options => { preserve_case => 1 },
c38ec663 24 connect_info_opts => {
af15ea33 25 pg_enable_utf8 => 1,
26 on_connect_do => [ 'SET client_min_messages=WARNING' ],
c38ec663 27 },
c930f78b 28 quote_char => '"',
ee07e280 29 data_types => {
760fd65c 30 # http://www.postgresql.org/docs/7.4/interactive/datatype.html
31 #
32 # Numeric Types
33 boolean => { data_type => 'boolean' },
34 bool => { data_type => 'boolean' },
45321eda 35 'bool default false'
36 => { data_type => 'boolean', default_value => \'false' },
760fd65c 37
38 bigint => { data_type => 'bigint' },
39 int8 => { data_type => 'bigint' },
40 bigserial => { data_type => 'bigint', is_auto_increment => 1 },
41 serial8 => { data_type => 'bigint', is_auto_increment => 1 },
5163dc4a 42 integer => { data_type => 'integer' },
43 int => { data_type => 'integer' },
44 int4 => { data_type => 'integer' },
5163dc4a 45 serial => { data_type => 'integer', is_auto_increment => 1 },
46 serial4 => { data_type => 'integer', is_auto_increment => 1 },
760fd65c 47 smallint => { data_type => 'smallint' },
48 int2 => { data_type => 'smallint' },
49
50 money => { data_type => 'money' },
51
52 'double precision' => { data_type => 'double precision' },
53 float8 => { data_type => 'double precision' },
54 real => { data_type => 'real' },
55 float4 => { data_type => 'real' },
56 'float(24)' => { data_type => 'real' },
57 'float(25)' => { data_type => 'double precision' },
58 'float(53)' => { data_type => 'double precision' },
59 float => { data_type => 'double precision' },
60
61 numeric => { data_type => 'numeric' },
62 decimal => { data_type => 'numeric' },
f80b0ea7 63 'numeric(6,3)' => { data_type => 'numeric', size => [6,3] },
64 'decimal(6,3)' => { data_type => 'numeric', size => [6,3] },
760fd65c 65
66 # Bit String Types
f80b0ea7 67 'bit varying(2)' => { data_type => 'varbit', size => 2 },
68 'varbit(2)' => { data_type => 'varbit', size => 2 },
69 'varbit' => { data_type => 'varbit' },
70 bit => { data_type => 'bit', size => 1 },
71 'bit(3)' => { data_type => 'bit', size => 3 },
760fd65c 72
73 # Network Types
74 inet => { data_type => 'inet' },
75 cidr => { data_type => 'cidr' },
76 macaddr => { data_type => 'macaddr' },
77
78 # Geometric Types
79 point => { data_type => 'point' },
80 line => { data_type => 'line' },
81 lseg => { data_type => 'lseg' },
82 box => { data_type => 'box' },
83 path => { data_type => 'path' },
84 polygon => { data_type => 'polygon' },
85 circle => { data_type => 'circle' },
86
87 # Character Types
f80b0ea7 88 'character varying(2)' => { data_type => 'varchar', size => 2 },
89 'varchar(2)' => { data_type => 'varchar', size => 2 },
90 'character(2)' => { data_type => 'char', size => 2 },
91 'char(2)' => { data_type => 'char', size => 2 },
92 'character' => { data_type => 'char', size => 1 },
93 'char' => { data_type => 'char', size => 1 },
760fd65c 94 text => { data_type => 'text' },
f80b0ea7 95 # varchar with no size has unlimited size, we rewrite to 'text'
8e030521 96 varchar => { data_type => 'text',
97 original => { data_type => 'varchar' } },
760fd65c 98
99 # Datetime Types
100 date => { data_type => 'date' },
101 interval => { data_type => 'interval' },
f80b0ea7 102 'interval(2)' => { data_type => 'interval', size => 2 },
8e030521 103 time => { data_type => 'time' },
104 'time(2)' => { data_type => 'time', size => 2 },
105 'time without time zone' => { data_type => 'time' },
106 'time(2) without time zone' => { data_type => 'time', size => 2 },
df956aad 107 'time with time zone' => { data_type => 'time with time zone' },
f80b0ea7 108 'time(2) with time zone' => { data_type => 'time with time zone', size => 2 },
109 timestamp => { data_type => 'timestamp' },
701cd3e3 110 'timestamp default now()'
111 => { data_type => 'timestamp', default_value => \'current_timestamp',
112 original => { default_value => \'now()' } },
f80b0ea7 113 'timestamp(2)' => { data_type => 'timestamp', size => 2 },
114 'timestamp without time zone' => { data_type => 'timestamp' },
115 'timestamp(2) without time zone' => { data_type => 'timestamp', size => 2 },
760fd65c 116
df956aad 117 'timestamp with time zone' => { data_type => 'timestamp with time zone' },
f80b0ea7 118 'timestamp(2) with time zone' => { data_type => 'timestamp with time zone', size => 2 },
760fd65c 119
120 # Blob Types
121 bytea => { data_type => 'bytea' },
12333562 122
123 # Enum Types
b8ae4518 124 pg_loader_test_enum => { data_type => 'enum', extra => { custom_type_name => 'pg_loader_test_enum',
463c86fb 125 list => [ qw/foo bar baz/] } },
ee07e280 126 },
12333562 127 pre_create => [
128 q{
129 CREATE TYPE pg_loader_test_enum AS ENUM (
130 'foo', 'bar', 'baz'
131 )
132 },
133 ],
fdd8ff16 134 extra => {
135 create => [
136 q{
7b868481 137 CREATE SCHEMA dbicsl_test
138 },
139 q{
140 CREATE SEQUENCE dbicsl_test.myseq
141 },
142 q{
fdd8ff16 143 CREATE TABLE pg_loader_test1 (
7b868481 144 id INTEGER NOT NULL DEFAULT nextval('dbicsl_test.myseq') PRIMARY KEY,
fdd8ff16 145 value VARCHAR(100)
146 )
147 },
fd97abca 148 qq{
af15ea33 149 COMMENT ON TABLE pg_loader_test1 IS 'The\15\12Table ∑'
fdd8ff16 150 },
fd97abca 151 qq{
152 COMMENT ON COLUMN pg_loader_test1.value IS 'The\15\12Column'
fdd8ff16 153 },
4b9fb838 154 q{
155 CREATE TABLE pg_loader_test2 (
12b86f07 156 id SERIAL PRIMARY KEY,
4b9fb838 157 value VARCHAR(100)
158 )
159 },
160 q{
161 COMMENT ON TABLE pg_loader_test2 IS 'very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long comment'
162 },
12b86f07 163 q{
164 CREATE SCHEMA "dbicsl-test"
165 },
166 q{
167 CREATE TABLE "dbicsl-test".pg_loader_test3 (
168 id SERIAL PRIMARY KEY,
169 value VARCHAR(100)
170 )
171 },
172 q{
173 CREATE TABLE "dbicsl-test".pg_loader_test4 (
174 id SERIAL PRIMARY KEY,
175 value VARCHAR(100),
176 three_id INTEGER UNIQUE REFERENCES "dbicsl-test".pg_loader_test3 (id)
177 )
178 },
179 q{
180 CREATE SCHEMA "dbicsl.test"
181 },
182 q{
183 CREATE TABLE "dbicsl.test".pg_loader_test5 (
184 id SERIAL PRIMARY KEY,
2ac32e3f 185 value VARCHAR(100),
186 pg_loader_test3_id INTEGER NOT NULL REFERENCES "dbicsl-test".pg_loader_test3 (id)
12b86f07 187 )
188 },
189 q{
190 CREATE TABLE "dbicsl.test".pg_loader_test6 (
191 id SERIAL PRIMARY KEY,
192 value VARCHAR(100),
193 five_id INTEGER UNIQUE REFERENCES "dbicsl.test".pg_loader_test5 (id)
194 )
195 },
fdd8ff16 196 ],
7b868481 197 pre_drop_ddl => [
198 'DROP SCHEMA dbicsl_test CASCADE',
12b86f07 199 'DROP SCHEMA "dbicsl-test" CASCADE',
200 'DROP SCHEMA "dbicsl.test" CASCADE',
12333562 201 'DROP TYPE pg_loader_test_enum',
7b868481 202 ],
9065de34 203 drop => [ qw/ pg_loader_test1 pg_loader_test2 / ],
12b86f07 204 count => 24,
fdd8ff16 205 run => sub {
206 my ($schema, $monikers, $classes) = @_;
207
7b868481 208 is $schema->source($monikers->{pg_loader_test1})->column_info('id')->{sequence},
209 'dbicsl_test.myseq',
210 'qualified sequence detected';
211
fdd8ff16 212 my $class = $classes->{pg_loader_test1};
1ad8e8c3 213 my $filename = $schema->_loader->get_dump_filename($class);
fdd8ff16 214
af15ea33 215 my $code = decode('UTF-8', scalar slurp $filename);
fdd8ff16 216
af15ea33 217 like $code, qr/^=head1 NAME\n\n^$class - The\nTable ∑\n\n^=cut\n/m,
fdd8ff16 218 'table comment';
219
fd97abca 220 like $code, qr/^=head2 value\n\n(.+:.+\n)+\nThe\nColumn\n\n/m,
79a00530 221 'column comment and attrs';
baff904e 222
4b9fb838 223 $class = $classes->{pg_loader_test2};
1ad8e8c3 224 $filename = $schema->_loader->get_dump_filename($class);
4b9fb838 225
12b86f07 226 $code = decode('UTF-8', scalar slurp $filename);
4b9fb838 227
228 like $code, qr/^=head1 NAME\n\n^$class\n\n=head1 DESCRIPTION\n\n^very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long comment\n\n^=cut\n/m,
229 'long table comment is in DESCRIPTION';
12b86f07 230
231 lives_and {
232 no_warnings {
233 make_schema_at(
2ac32e3f 234 'PGMultiSchema',
12b86f07 235 {
236 naming => 'current',
237 preserve_case => 1,
2ac32e3f 238 db_schema => ['dbicsl-test', 'dbicsl.test'],
12b86f07 239 },
240 [ $dsn, $user, $password, {
241 on_connect_do => [ 'SET client_min_messages=WARNING' ],
242 } ],
243 );
244 };
2ac32e3f 245 }
246'created dynamic schema for "dbicsl-test" and "dbicsl.test" schemas with no warnings';
12b86f07 247
248 my ($rsrc, %uniqs, $rel_info);
249
250 lives_and {
2ac32e3f 251 ok $rsrc = PGMultiSchema->source('PgLoaderTest3');
12b86f07 252 } 'got source for table in schema name with dash';
253
254 is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
255 'column in schema name with dash';
256
257 is try { $rsrc->column_info('value')->{data_type} }, 'varchar',
258 'column in schema name with dash';
259
260 is try { $rsrc->column_info('value')->{size} }, 100,
261 'column in schema name with dash';
262
263 $rel_info = try { $rsrc->relationship_info('pg_loader_test4') };
264
265 is_deeply $rel_info->{cond}, {
266 'foreign.three_id' => 'self.id'
267 }, 'relationship in schema name with dash';
268
269 is $rel_info->{attrs}{accessor}, 'single',
270 'relationship in schema name with dash';
271
272 is $rel_info->{attrs}{join_type}, 'LEFT',
273 'relationship in schema name with dash';
274
275 lives_and {
2ac32e3f 276 ok $rsrc = PGMultiSchema->source('PgLoaderTest4');
12b86f07 277 } 'got source for table in schema name with dash';
278
279 %uniqs = try { $rsrc->unique_constraints };
280
281 is keys %uniqs, 2,
282 'got unique and primary constraint in schema name with dash';
283
284 lives_and {
2ac32e3f 285 ok $rsrc = PGMultiSchema->source('PgLoaderTest5');
12b86f07 286 } 'got source for table in schema name with dot';
287
288 is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
289 'column in schema name with dot introspected correctly';
290
291 is try { $rsrc->column_info('value')->{data_type} }, 'varchar',
292 'column in schema name with dash introspected correctly';
293
294 is try { $rsrc->column_info('value')->{size} }, 100,
295 'column in schema name with dash introspected correctly';
296
297 $rel_info = try { $rsrc->relationship_info('pg_loader_test6') };
298
299 is_deeply $rel_info->{cond}, {
300 'foreign.five_id' => 'self.id'
301 }, 'relationship in schema name with dot';
302
303 is $rel_info->{attrs}{accessor}, 'single',
304 'relationship in schema name with dot';
305
306 is $rel_info->{attrs}{join_type}, 'LEFT',
307 'relationship in schema name with dot';
308
309 lives_and {
2ac32e3f 310 ok $rsrc = PGMultiSchema->source('PgLoaderTest6');
12b86f07 311 } 'got source for table in schema name with dot';
312
313 %uniqs = try { $rsrc->unique_constraints };
314
315 is keys %uniqs, 2,
316 'got unique and primary constraint in schema name with dot';
fdd8ff16 317 },
318 },
a78e3fed 319);
320
9e978a19 321if( !$dsn || !$user ) {
322 $tester->skip_tests('You need to set the DBICTEST_PG_DSN, _USER, and _PASS environment variables');
a78e3fed 323}
324else {
325 $tester->run_tests();
326}
8e64075f 327# vim:et sw=4 sts=4 tw=0: