fix erroneous default_value for MySQL NOT NULL columns (RT#57225)
[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     data_types  => {
18         # http://www.postgresql.org/docs/7.4/interactive/datatype.html
19         #
20         # Numeric Types
21         boolean     => { data_type => 'boolean' },
22         bool        => { data_type => 'boolean' },
23
24         bigint      => { data_type => 'bigint' },
25         int8        => { data_type => 'bigint' },
26         bigserial   => { data_type => 'bigint', is_auto_increment => 1 },
27         serial8     => { data_type => 'bigint', is_auto_increment => 1 },
28         integer     => { data_type => 'integer' },
29         int         => { data_type => 'integer' },
30         int4        => { data_type => 'integer' },
31         serial      => { data_type => 'integer', is_auto_increment => 1 },
32         serial4     => { data_type => 'integer', is_auto_increment => 1 },
33         smallint    => { data_type => 'smallint' },
34         int2        => { data_type => 'smallint' },
35
36         money       => { data_type => 'money' },
37
38         'double precision' => { data_type => 'double precision' },
39         float8             => { data_type => 'double precision' },
40         real               => { data_type => 'real' },
41         float4             => { data_type => 'real' },
42         'float(24)'        => { data_type => 'real' },
43         'float(25)'        => { data_type => 'double precision' },
44         'float(53)'        => { data_type => 'double precision' },
45         float              => { data_type => 'double precision' },
46
47         numeric        => { data_type => 'numeric' },
48         decimal        => { data_type => 'numeric' },
49         'numeric(6,3)' => { size => [6,3], data_type => 'numeric' },
50         'decimal(6,3)' => { size => [6,3], data_type => 'numeric' },
51
52         # Bit String Types
53         #
54         # XXX alias 'bit varying' to 'varbit'
55         'bit varying(2)' => { size => 2, data_type => 'bit varying' },
56         'varbit(2)'      => { size => 2, data_type => 'bit varying' },
57         'varbit'         => { size => 1, data_type => 'bit varying' },
58         # XXX support bit(n)
59         bit              => { data_type => 'bit' },
60
61         # Network Types
62         inet    => { data_type => 'inet' },
63         cidr    => { data_type => 'cidr' },
64         macaddr => { data_type => 'macaddr' },
65
66         # Geometric Types
67         point   => { data_type => 'point' },
68         line    => { data_type => 'line' },
69         lseg    => { data_type => 'lseg' },
70         box     => { data_type => 'box' },
71         path    => { data_type => 'path' },
72         polygon => { data_type => 'polygon' },
73         circle  => { data_type => 'circle' },
74
75         # Character Types
76         # XXX alias 'character varying' to 'varchar'
77         'character varying(2)'           => { size => 2, data_type => 'character varying' },
78         'varchar(2)'                     => { size => 2, data_type => 'character varying' },
79
80         # XXX alias 'character' to 'char'
81         'character(2)'                   => { size => 2, data_type => 'character' },
82         'char(2)'                        => { size => 2, data_type => 'character' },
83         'character'                      => { size => 1, data_type => 'character' },
84         'char'                           => { size => 1, data_type => 'character' },
85         text                             => { data_type => 'text' },
86
87         # Datetime Types
88         date                             => { data_type => 'date' },
89         interval                         => { data_type => 'interval' },
90         'interval(2)'                    => { size => 2, data_type => 'interval' },
91         time                             => { data_type => 'time without time zone' },
92         'time(2)'                        => { size => 2, data_type => 'time without time zone' },
93         'time without time zone'         => { data_type => 'time without time zone' },
94         'time(2) without time zone'      => { size => 2, data_type => 'time without time zone' },
95         'time with time zone'            => { data_type => 'time with time zone' },
96         'time(2) with time zone'         => { size => 2, data_type => 'time with time zone' },
97
98         # XXX alias 'timestamp without time zone' to 'timestamp'
99         timestamp                        => { data_type => 'timestamp without time zone' },
100         'timestamp default current_timestamp'
101                                          => { data_type => 'timestamp without time zone', default_value => \'current_timestamp' },
102         'timestamp(2)'                   => { size => 2, data_type => 'timestamp without time zone' },
103         'timestamp without time zone'    => { data_type => 'timestamp without time zone' },
104         'timestamp(2) without time zone' => { size => 2, data_type => 'timestamp without time zone' },
105
106         'timestamp with time zone'       => { data_type => 'timestamp with time zone' },
107         'timestamp(2) with time zone'    => { size => 2, data_type => 'timestamp with time zone' },
108
109         # Blob Types
110         bytea => { data_type => 'bytea' },
111     },
112     extra       => {
113         create => [
114             q{
115                 CREATE TABLE pg_loader_test1 (
116                     id SERIAL NOT NULL PRIMARY KEY,
117                     value VARCHAR(100)
118                 )
119             },
120             q{
121                 COMMENT ON TABLE pg_loader_test1 IS 'The Table'
122             },
123             q{
124                 COMMENT ON COLUMN pg_loader_test1.value IS 'The Column'
125             },
126             q{
127                 CREATE TABLE pg_loader_test2 (
128                     id SERIAL NOT NULL PRIMARY KEY,
129                     value VARCHAR(100)
130                 )
131             },
132             q{
133                 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'
134             },
135         ],
136         drop  => [ qw/ pg_loader_test1 pg_loader_test2 / ],
137         count => 3,
138         run   => sub {
139             my ($schema, $monikers, $classes) = @_;
140
141             my $class    = $classes->{pg_loader_test1};
142             my $filename = $schema->_loader->_get_dump_filename($class);
143
144             my $code = slurp $filename;
145
146             like $code, qr/^=head1 NAME\n\n^$class - The Table\n\n^=cut\n/m,
147                 'table comment';
148
149             like $code, qr/^=head2 value\n\n(.+:.+\n)+\nThe Column\n\n/m,
150                 'column comment and attrs';
151
152             $class    = $classes->{pg_loader_test2};
153             $filename = $schema->_loader->_get_dump_filename($class);
154
155             $code = slurp $filename;
156
157             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,
158                 'long table comment is in DESCRIPTION';
159         },
160     },
161 );
162
163 if( !$dsn || !$user ) {
164     $tester->skip_tests('You need to set the DBICTEST_PG_DSN, _USER, and _PASS environment variables');
165 }
166 else {
167     $tester->run_tests();
168 }
169 # vim:et sw=4 sts=4 tw=0: