Tab/WS crusade
[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_table_names => 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 RENAME COLUMN description TO physical_description;
81
82 ALTER TABLE person ADD CONSTRAINT unique_name UNIQUE (name);
83
84 ALTER TABLE employee ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id)
85   REFERENCES person (person_id) DEFERRABLE;
86
87 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
88
89 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
90
91 DROP TABLE deleted CASCADE;
92
93
94 COMMIT;
95
96 ## END OF DIFF
97
98 $out = SQL::Translator::Diff::schema_diff(
99     $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL',
100     { ignore_index_names => 1,
101       ignore_constraint_names => 1,
102       producer_args => {
103          quote_table_names => 0,
104          quote_field_names => 0,
105       }
106     });
107
108 eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
109 -- Convert schema 'create1.yml' to 'create2.yml':;
110
111 BEGIN;
112
113 CREATE TABLE added (
114   id bigint
115 );
116
117 ALTER TABLE old_name RENAME TO new_name;
118
119 ALTER TABLE person DROP CONSTRAINT UC_age_name;
120
121 ALTER TABLE employee DROP COLUMN job_title;
122
123 ALTER TABLE new_name ADD COLUMN new_field integer;
124
125 ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT 1;
126
127 ALTER TABLE person ALTER COLUMN person_id TYPE serial;
128
129 ALTER TABLE person ALTER COLUMN name SET NOT NULL;
130
131 ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
132
133 ALTER TABLE person ALTER COLUMN iq TYPE bigint;
134
135 ALTER TABLE person RENAME COLUMN description TO physical_description;
136
137 ALTER TABLE person ADD CONSTRAINT UC_person_id UNIQUE (person_id);
138
139 ALTER TABLE person ADD CONSTRAINT UC_age_name UNIQUE (age, name);
140
141 DROP TABLE deleted CASCADE;
142
143
144 COMMIT;
145
146 ## END OF DIFF
147
148
149 # Test for sameness
150 $out = SQL::Translator::Diff::schema_diff(
151     $source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL'
152 );
153
154 eq_or_diff($out, <<'## END OF DIFF', "No differences found");
155 -- Convert schema 'create1.yml' to 'create1.yml':;
156
157 -- No differences found;
158
159 ## END OF DIFF