Understand Postgres enumerated types
[dbsrgits/DBIx-Class-Schema-Loader.git] / t / 12pg_common.t
CommitLineData
a78e3fed 1use strict;
c2849787 2use lib qw(t/lib);
fbd83464 3use dbixcsl_common_tests;
fdd8ff16 4use Test::More;
9065de34 5use File::Slurp 'slurp';
a78e3fed 6
9e978a19 7my $dsn = $ENV{DBICTEST_PG_DSN} || '';
8my $user = $ENV{DBICTEST_PG_USER} || '';
9my $password = $ENV{DBICTEST_PG_PASS} || '';
a78e3fed 10
fbd83464 11my $tester = dbixcsl_common_tests->new(
a78e3fed 12 vendor => 'Pg',
13 auto_inc_pk => 'SERIAL NOT NULL PRIMARY KEY',
9e978a19 14 dsn => $dsn,
a78e3fed 15 user => $user,
16 password => $password,
c930f78b 17 loader_options => { preserve_case => 1 },
c38ec663 18 connect_info_opts => {
19 on_connect_do => [ 'SET client_min_messages=WARNING' ],
20 },
c930f78b 21 quote_char => '"',
ee07e280 22 data_types => {
760fd65c 23 # http://www.postgresql.org/docs/7.4/interactive/datatype.html
24 #
25 # Numeric Types
26 boolean => { data_type => 'boolean' },
27 bool => { data_type => 'boolean' },
45321eda 28 'bool default false'
29 => { data_type => 'boolean', default_value => \'false' },
760fd65c 30
31 bigint => { data_type => 'bigint' },
32 int8 => { data_type => 'bigint' },
33 bigserial => { data_type => 'bigint', is_auto_increment => 1 },
34 serial8 => { data_type => 'bigint', is_auto_increment => 1 },
5163dc4a 35 integer => { data_type => 'integer' },
36 int => { data_type => 'integer' },
37 int4 => { data_type => 'integer' },
5163dc4a 38 serial => { data_type => 'integer', is_auto_increment => 1 },
39 serial4 => { data_type => 'integer', is_auto_increment => 1 },
760fd65c 40 smallint => { data_type => 'smallint' },
41 int2 => { data_type => 'smallint' },
42
43 money => { data_type => 'money' },
44
45 'double precision' => { data_type => 'double precision' },
46 float8 => { data_type => 'double precision' },
47 real => { data_type => 'real' },
48 float4 => { data_type => 'real' },
49 'float(24)' => { data_type => 'real' },
50 'float(25)' => { data_type => 'double precision' },
51 'float(53)' => { data_type => 'double precision' },
52 float => { data_type => 'double precision' },
53
54 numeric => { data_type => 'numeric' },
55 decimal => { data_type => 'numeric' },
f80b0ea7 56 'numeric(6,3)' => { data_type => 'numeric', size => [6,3] },
57 'decimal(6,3)' => { data_type => 'numeric', size => [6,3] },
760fd65c 58
59 # Bit String Types
f80b0ea7 60 'bit varying(2)' => { data_type => 'varbit', size => 2 },
61 'varbit(2)' => { data_type => 'varbit', size => 2 },
62 'varbit' => { data_type => 'varbit' },
63 bit => { data_type => 'bit', size => 1 },
64 'bit(3)' => { data_type => 'bit', size => 3 },
760fd65c 65
66 # Network Types
67 inet => { data_type => 'inet' },
68 cidr => { data_type => 'cidr' },
69 macaddr => { data_type => 'macaddr' },
70
71 # Geometric Types
72 point => { data_type => 'point' },
73 line => { data_type => 'line' },
74 lseg => { data_type => 'lseg' },
75 box => { data_type => 'box' },
76 path => { data_type => 'path' },
77 polygon => { data_type => 'polygon' },
78 circle => { data_type => 'circle' },
79
80 # Character Types
f80b0ea7 81 'character varying(2)' => { data_type => 'varchar', size => 2 },
82 'varchar(2)' => { data_type => 'varchar', size => 2 },
83 'character(2)' => { data_type => 'char', size => 2 },
84 'char(2)' => { data_type => 'char', size => 2 },
85 'character' => { data_type => 'char', size => 1 },
86 'char' => { data_type => 'char', size => 1 },
760fd65c 87 text => { data_type => 'text' },
f80b0ea7 88 # varchar with no size has unlimited size, we rewrite to 'text'
8e030521 89 varchar => { data_type => 'text',
90 original => { data_type => 'varchar' } },
760fd65c 91
92 # Datetime Types
93 date => { data_type => 'date' },
94 interval => { data_type => 'interval' },
f80b0ea7 95 'interval(2)' => { data_type => 'interval', size => 2 },
8e030521 96 time => { data_type => 'time' },
97 'time(2)' => { data_type => 'time', size => 2 },
98 'time without time zone' => { data_type => 'time' },
99 'time(2) without time zone' => { data_type => 'time', size => 2 },
df956aad 100 'time with time zone' => { data_type => 'time with time zone' },
f80b0ea7 101 'time(2) with time zone' => { data_type => 'time with time zone', size => 2 },
102 timestamp => { data_type => 'timestamp' },
701cd3e3 103 'timestamp default now()'
104 => { data_type => 'timestamp', default_value => \'current_timestamp',
105 original => { default_value => \'now()' } },
f80b0ea7 106 'timestamp(2)' => { data_type => 'timestamp', size => 2 },
107 'timestamp without time zone' => { data_type => 'timestamp' },
108 'timestamp(2) without time zone' => { data_type => 'timestamp', size => 2 },
760fd65c 109
df956aad 110 'timestamp with time zone' => { data_type => 'timestamp with time zone' },
f80b0ea7 111 'timestamp(2) with time zone' => { data_type => 'timestamp with time zone', size => 2 },
760fd65c 112
113 # Blob Types
114 bytea => { data_type => 'bytea' },
12333562 115
116 # Enum Types
117 pg_loader_test_enum => { data_type => 'enum', extra => { list => [ qw/foo bar baz/] }, size => 4 },
ee07e280 118 },
12333562 119 pre_create => [
120 q{
121 CREATE TYPE pg_loader_test_enum AS ENUM (
122 'foo', 'bar', 'baz'
123 )
124 },
125 ],
fdd8ff16 126 extra => {
127 create => [
128 q{
7b868481 129 CREATE SCHEMA dbicsl_test
130 },
131 q{
132 CREATE SEQUENCE dbicsl_test.myseq
133 },
134 q{
fdd8ff16 135 CREATE TABLE pg_loader_test1 (
7b868481 136 id INTEGER NOT NULL DEFAULT nextval('dbicsl_test.myseq') PRIMARY KEY,
fdd8ff16 137 value VARCHAR(100)
138 )
139 },
fd97abca 140 qq{
141 COMMENT ON TABLE pg_loader_test1 IS 'The\15\12Table'
fdd8ff16 142 },
fd97abca 143 qq{
144 COMMENT ON COLUMN pg_loader_test1.value IS 'The\15\12Column'
fdd8ff16 145 },
4b9fb838 146 q{
147 CREATE TABLE pg_loader_test2 (
148 id SERIAL NOT NULL PRIMARY KEY,
149 value VARCHAR(100)
150 )
151 },
152 q{
153 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'
154 },
fdd8ff16 155 ],
7b868481 156 pre_drop_ddl => [
157 'DROP SCHEMA dbicsl_test CASCADE',
12333562 158 'DROP TYPE pg_loader_test_enum',
7b868481 159 ],
9065de34 160 drop => [ qw/ pg_loader_test1 pg_loader_test2 / ],
7b868481 161 count => 4,
fdd8ff16 162 run => sub {
163 my ($schema, $monikers, $classes) = @_;
164
7b868481 165 is $schema->source($monikers->{pg_loader_test1})->column_info('id')->{sequence},
166 'dbicsl_test.myseq',
167 'qualified sequence detected';
168
fdd8ff16 169 my $class = $classes->{pg_loader_test1};
170 my $filename = $schema->_loader->_get_dump_filename($class);
171
9065de34 172 my $code = slurp $filename;
fdd8ff16 173
fd97abca 174 like $code, qr/^=head1 NAME\n\n^$class - The\nTable\n\n^=cut\n/m,
fdd8ff16 175 'table comment';
176
fd97abca 177 like $code, qr/^=head2 value\n\n(.+:.+\n)+\nThe\nColumn\n\n/m,
79a00530 178 'column comment and attrs';
baff904e 179
4b9fb838 180 $class = $classes->{pg_loader_test2};
181 $filename = $schema->_loader->_get_dump_filename($class);
182
9065de34 183 $code = slurp $filename;
4b9fb838 184
185 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,
186 'long table comment is in DESCRIPTION';
fdd8ff16 187 },
188 },
a78e3fed 189);
190
9e978a19 191if( !$dsn || !$user ) {
192 $tester->skip_tests('You need to set the DBICTEST_PG_DSN, _USER, and _PASS environment variables');
a78e3fed 193}
194else {
195 $tester->run_tests();
196}
8e64075f 197# vim:et sw=4 sts=4 tw=0: