bb036011c95bad3f706aa2051e2ea1cf0633ea2c
[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 TABLE pg_loader_test1 (
117                     id SERIAL NOT NULL PRIMARY KEY,
118                     value VARCHAR(100)
119                 )
120             },
121             qq{
122                 COMMENT ON TABLE pg_loader_test1 IS 'The\15\12Table'
123             },
124             qq{
125                 COMMENT ON COLUMN pg_loader_test1.value IS 'The\15\12Column'
126             },
127             q{
128                 CREATE TABLE pg_loader_test2 (
129                     id SERIAL NOT NULL PRIMARY KEY,
130                     value VARCHAR(100)
131                 )
132             },
133             q{
134                 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'
135             },
136         ],
137         drop  => [ qw/ pg_loader_test1 pg_loader_test2 / ],
138         count => 3,
139         run   => sub {
140             my ($schema, $monikers, $classes) = @_;
141
142             my $class    = $classes->{pg_loader_test1};
143             my $filename = $schema->_loader->_get_dump_filename($class);
144
145             my $code = slurp $filename;
146
147             like $code, qr/^=head1 NAME\n\n^$class - The\nTable\n\n^=cut\n/m,
148                 'table comment';
149
150             like $code, qr/^=head2 value\n\n(.+:.+\n)+\nThe\nColumn\n\n/m,
151                 'column comment and attrs';
152
153             $class    = $classes->{pg_loader_test2};
154             $filename = $schema->_loader->_get_dump_filename($class);
155
156             $code = slurp $filename;
157
158             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,
159                 'long table comment is in DESCRIPTION';
160         },
161     },
162 );
163
164 if( !$dsn || !$user ) {
165     $tester->skip_tests('You need to set the DBICTEST_PG_DSN, _USER, and _PASS environment variables');
166 }
167 else {
168     $tester->run_tests();
169 }
170 # vim:et sw=4 sts=4 tw=0: