PgSQL diff patch from wries
[dbsrgits/SQL-Translator.git] / t / 30sqlt-new-diff-pgsql.t
diff --git a/t/30sqlt-new-diff-pgsql.t b/t/30sqlt-new-diff-pgsql.t
new file mode 100644 (file)
index 0000000..0926514
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/perl
+# vim: set ft=perl:
+
+use strict;
+use warnings;
+use SQL::Translator;
+
+use File::Spec::Functions qw(catfile updir tmpdir);
+use FindBin qw($Bin);
+use Test::More;
+use Test::Differences;
+use Test::SQL::Translator qw(maybe_plan);
+use SQL::Translator::Schema::Constants;
+use Storable 'dclone';
+
+plan tests => 4;
+
+use_ok('SQL::Translator::Diff') or die "Cannot continue\n";
+
+my $tr = SQL::Translator->new;
+
+my ( $source_schema, $target_schema, $parsed_sql_schema ) = map {
+    my $t = SQL::Translator->new;
+    $t->parser( 'YAML' )
+      or die $tr->error;
+    my $out = $t->translate( catfile($Bin, qw/data diff pgsql/, $_ ) )
+      or die $tr->error;
+    
+    my $schema = $t->schema;
+    unless ( $schema->name ) {
+        $schema->name( $_ );
+    }
+    ($schema);
+} (qw( create1.yml create2.yml ));
+
+# Test for differences
+my $out = SQL::Translator::Diff::schema_diff(
+    $source_schema,
+   'PostgreSQL',
+    $target_schema,
+   'PostgreSQL',
+   {
+     producer_options => {
+         quote_table_names => 0,
+     }
+   }
+);
+eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
+-- Convert schema 'create1.yml' to 'create2.yml':;
+
+BEGIN;
+
+CREATE TABLE added (
+  "id" bigint
+);
+
+ALTER TABLE old_name RENAME TO new_name;
+
+ALTER TABLE employee DROP CONSTRAINT FK5302D47D93FE702E;
+
+ALTER TABLE person DROP CONSTRAINT UC_age_name;
+
+DROP INDEX u_name;
+
+ALTER TABLE employee DROP COLUMN job_title;
+
+ALTER TABLE new_name ADD COLUMN new_field integer;
+
+ALTER TABLE person ADD COLUMN is_rock_star smallint DEFAULT '1';
+
+ALTER TABLE person ALTER COLUMN person_id TYPE serial;
+
+ALTER TABLE person ALTER COLUMN name SET NOT NULL;
+
+ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
+
+ALTER TABLE person ALTER COLUMN iq TYPE bigint;
+
+ALTER TABLE person RENAME COLUMN description TO physical_description;
+
+ALTER TABLE person ADD CONSTRAINT "unique_name" UNIQUE (name);
+
+ALTER TABLE employee ADD FOREIGN KEY (employee_id)
+  REFERENCES person (person_id) DEFERRABLE;
+
+ALTER TABLE person ADD CONSTRAINT "UC_person_id" UNIQUE (person_id);
+
+ALTER TABLE person ADD CONSTRAINT "UC_age_name" UNIQUE (age, name);
+
+DROP TABLE deleted CASCADE;
+
+
+COMMIT;
+
+## END OF DIFF
+
+$out = SQL::Translator::Diff::schema_diff(
+    $source_schema, 'PostgreSQL', $target_schema, 'PostgreSQL',
+    { ignore_index_names => 1,
+      ignore_constraint_names => 1,
+      producer_options => {
+         quote_table_names => 0,
+         quote_field_names => 0,
+      }
+    });
+
+eq_or_diff($out, <<'## END OF DIFF', "Diff as expected");
+-- Convert schema 'create1.yml' to 'create2.yml':;
+
+BEGIN;
+
+CREATE TABLE added02 (
+  id bigint
+);
+
+ALTER TABLE old_name RENAME TO new_name;
+
+ALTER TABLE person DROP CONSTRAINT UC_age_name;
+
+ALTER TABLE employee DROP COLUMN job_title;
+
+ALTER TABLE new_name ADD COLUMN new_field02 integer;
+
+ALTER TABLE person ADD COLUMN is_rock_star02 smallint DEFAULT '1';
+
+ALTER TABLE person ALTER COLUMN person_id TYPE serial;
+
+ALTER TABLE person ALTER COLUMN name SET NOT NULL;
+
+ALTER TABLE person ALTER COLUMN age SET DEFAULT 18;
+
+ALTER TABLE person ALTER COLUMN iq TYPE bigint;
+
+ALTER TABLE person RENAME COLUMN description TO physical_description;
+
+ALTER TABLE person ADD CONSTRAINT "UC_person_id3" UNIQUE (person_id);
+
+ALTER TABLE person ADD CONSTRAINT "UC_age_name3" UNIQUE (age, name);
+
+DROP TABLE deleted CASCADE;
+
+
+COMMIT;
+
+## END OF DIFF
+
+
+# Test for sameness
+$out = SQL::Translator::Diff::schema_diff(
+    $source_schema, 'PostgreSQL', $source_schema, 'PostgreSQL'
+);
+
+eq_or_diff($out, <<'## END OF DIFF', "No differences found");
+-- Convert schema 'create1.yml' to 'create1.yml':;
+
+-- No differences found;
+
+## END OF DIFF