produce_diff_sql(): list context
[dbsrgits/SQL-Translator.git] / t / 30sqlt-new-diff-pgsql.t
1 #!/usr/bin/perl
2 # vim: set ft=perl:
3
4 use strict;
5 use warnings;
6 use SQL::Translator;
7
8 use File::Spec::Functions qw(catfile updir tmpdir);
9 use FindBin qw($Bin);
10 use Test::More;
11 use Test::Differences;
12 use Test::SQL::Translator qw(maybe_plan);
13 use SQL::Translator::Schema::Constants;
14 use Storable 'dclone';
15
16 plan tests => 4;
17
18 use_ok('SQL::Translator::Diff') or die "Cannot continue\n";
19
20 my $tr = SQL::Translator->new;
21
22 my ( $source_schema, $target_schema, $parsed_sql_schema ) = map {
23     my $t = SQL::Translator->new;
24     $t->parser( 'YAML' )
25       or die $tr->error;
26     my $out = $t->translate( catfile($Bin, qw/data diff pgsql/, $_ ) )
27       or die $tr->error;
28
29     my $schema = $t->schema;
30     unless ( $schema->name ) {
31         $schema->name( $_ );
32     }
33     ($schema);
34 } (qw( create1.yml create2.yml ));
35
36 # Test for differences
37 my $out = SQL::Translator::Diff::schema_diff(
38     $source_schema,
39    'PostgreSQL',
40     $target_schema,
41    'PostgreSQL',
42    {
43      producer_args => {
44          quote_identifiers => 0,
45      }
46    }
47 );
48
49 eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
50 -- Convert schema 'create1.yml' to 'create2.yml':;
51
52 BEGIN;
53
54 CREATE TABLE added (
55   id bigint
56 );
57
58 ALTER TABLE old_name RENAME TO new_name;
59
60 ALTER TABLE employee DROP CONSTRAINT FK5302D47D93FE702E;
61
62 ALTER TABLE person DROP CONSTRAINT UC_age_name;
63
64 DROP INDEX u_name;
65
66 ALTER TABLE employee DROP COLUMN job_title;
67
68 ALTER TABLE new_name ADD COLUMN new_field integer;
69
70 ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;
71
72 ALTER TABLE person ALTER COLUMN person_id TYPE serial;
73
74 ALTER TABLE person ALTER COLUMN name SET NOT NULL;
75
76 ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
77
78 ALTER TABLE person ALTER COLUMN iq TYPE bigint;
79
80 ALTER TABLE person ALTER COLUMN nickname SET NOT NULL;
81
82 ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
83
84 ALTER TABLE person RENAME COLUMN description TO physical_description;
85
86 ALTER TABLE person ADD CONSTRAINT unique_name UNIQUE (name);
87
88 ALTER TABLE employee ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id)
89   REFERENCES person (person_id) DEFERRABLE;
90
91 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
92
93 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
94
95 DROP TABLE deleted CASCADE;
96
97
98 COMMIT;
99
100 ## END OF DIFF
101
102 $out = SQL::Translator::Diff::schema_diff(
103     $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL',
104     { ignore_index_names => 1,
105       ignore_constraint_names => 1,
106       producer_args => {
107          quote_table_names => 0,
108          quote_field_names => 0,
109       }
110     });
111
112 eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
113 -- Convert schema 'create1.yml' to 'create2.yml':;
114
115 BEGIN;
116
117 CREATE TABLE added (
118   id bigint
119 );
120
121 ALTER TABLE old_name RENAME TO new_name;
122
123 ALTER TABLE person DROP CONSTRAINT UC_age_name;
124
125 ALTER TABLE employee DROP COLUMN job_title;
126
127 ALTER TABLE new_name ADD COLUMN new_field integer;
128
129 ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;
130
131 ALTER TABLE person ALTER COLUMN person_id TYPE serial;
132
133 ALTER TABLE person ALTER COLUMN name SET NOT NULL;
134
135 ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
136
137 ALTER TABLE person ALTER COLUMN iq TYPE bigint;
138
139 ALTER TABLE person ALTER COLUMN nickname SET NOT NULL;
140
141 ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
142
143 ALTER TABLE person RENAME COLUMN description TO physical_description;
144
145 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
146
147 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
148
149 DROP TABLE deleted CASCADE;
150
151
152 COMMIT;
153
154 ## END OF DIFF
155
156
157 # Test for sameness
158 $out = SQL::Translator::Diff::schema_diff(
159     $source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL'
160 );
161
162 eq_or_diff($out, <<'## END OF DIFF', "No differences found");
163 -- Convert schema 'create1.yml' to 'create1.yml':;
164
165 -- No differences found;
166
167 ## END OF DIFF