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