Fix identifier quoting in PostgreSQL diff producer
[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 => 1,
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 "employee" DROP CONSTRAINT "FK5302D47D93FE702E";
59
60 ALTER TABLE "employee" DROP COLUMN "job_title";
61
62 ALTER TABLE "employee" ADD CONSTRAINT "FK5302D47D93FE702E_diff" FOREIGN KEY ("employee_id")
63   REFERENCES "person" ("person_id") DEFERRABLE;
64
65 ALTER TABLE "old_name" RENAME TO "new_name";
66
67 ALTER TABLE "new_name" ADD COLUMN "new_field" integer;
68
69 ALTER TABLE "person" DROP CONSTRAINT "UC_age_name";
70
71 DROP INDEX "u_name";
72
73 ALTER TABLE "person" ADD COLUMN "is_rock_star" smallint DEFAULT 1;
74
75 ALTER TABLE "person" ALTER COLUMN "person_id" TYPE serial;
76
77 ALTER TABLE "person" ALTER COLUMN "name" SET NOT NULL;
78
79 ALTER TABLE "person" ALTER COLUMN "age" SET DEFAULT 18;
80
81 ALTER TABLE "person" ALTER COLUMN "iq" TYPE bigint;
82
83 ALTER TABLE "person" ALTER COLUMN "nickname" SET NOT NULL;
84
85 ALTER TABLE "person" ALTER COLUMN "nickname" TYPE character varying(24);
86
87 ALTER TABLE "person" RENAME COLUMN "description" TO "physical_description";
88
89 ALTER TABLE "person" ADD CONSTRAINT "unique_name" UNIQUE ("name");
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_identifiers => 0,
108       }
109     });
110
111 eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
112 -- Convert schema 'create1.yml' to 'create2.yml':;
113
114 BEGIN;
115
116 CREATE TABLE added (
117   id bigint
118 );
119
120 ALTER TABLE employee DROP COLUMN job_title;
121
122 ALTER TABLE old_name RENAME TO new_name;
123
124 ALTER TABLE new_name ADD COLUMN new_field integer;
125
126 ALTER TABLE person DROP CONSTRAINT UC_age_name;
127
128 ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;
129
130 ALTER TABLE person ALTER COLUMN person_id TYPE serial;
131
132 ALTER TABLE person ALTER COLUMN name SET NOT NULL;
133
134 ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
135
136 ALTER TABLE person ALTER COLUMN iq TYPE bigint;
137
138 ALTER TABLE person ALTER COLUMN nickname SET NOT NULL;
139
140 ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
141
142 ALTER TABLE person RENAME COLUMN description TO physical_description;
143
144 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
145
146 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
147
148 DROP TABLE deleted CASCADE;
149
150
151 COMMIT;
152
153 ## END OF DIFF
154
155
156 # Test for sameness
157 $out = SQL::Translator::Diff::schema_diff(
158     $source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL'
159 );
160
161 eq_or_diff($out, <<'## END OF DIFF', "No differences found");
162 -- Convert schema 'create1.yml' to 'create1.yml':;
163
164 -- No differences found;
165
166 ## END OF DIFF