24086ea099cb988bb47601a06ab5374cdf3b5477
[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 ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
82
83 ALTER TABLE person RENAME COLUMN description TO physical_description;
84
85 ALTER TABLE person ADD CONSTRAINT unique_name UNIQUE (name);
86
87 ALTER TABLE employee ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id)
88   REFERENCES person (person_id) DEFERRABLE;
89
90 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
91
92 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
93
94 DROP TABLE deleted CASCADE;
95
96
97 COMMIT;
98
99 ## END OF DIFF
100
101 $out = SQL::Translator::Diff::schema_diff(
102     $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL',
103     { ignore_index_names => 1,
104       ignore_constraint_names => 1,
105       producer_args => {
106          quote_table_names => 0,
107          quote_field_names => 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 old_name RENAME TO new_name;
121
122 ALTER TABLE person DROP CONSTRAINT UC_age_name;
123
124 ALTER TABLE employee DROP COLUMN job_title;
125
126 ALTER TABLE new_name ADD COLUMN new_field integer;
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 ALTER TABLE person ALTER COLUMN nickname TYPE character varying(24);
140
141 ALTER TABLE person RENAME COLUMN description TO physical_description;
142
143 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
144
145 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
146
147 DROP TABLE deleted CASCADE;
148
149
150 COMMIT;
151
152 ## END OF DIFF
153
154
155 # Test for sameness
156 $out = SQL::Translator::Diff::schema_diff(
157     $source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL'
158 );
159
160 eq_or_diff($out, <<'## END OF DIFF', "No differences found");
161 -- Convert schema 'create1.yml' to 'create1.yml':;
162
163 -- No differences found;
164
165 ## END OF DIFF