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