c6a0473d9d6bc071a7d969ba58868695a71d740c
[dbsrgits/SQL-Translator.git] / t / postgresql-rename-table-and-field.t
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Exception;
8 use Test::SQL::Translator;
9 use SQL::Translator;
10 use SQL::Translator::Diff;
11
12 maybe_plan(undef, 'DBD::Pg');
13
14 my ( $pgsql, $ddl, $ret, $dsn, $user, $pass );
15 if ($ENV{DBICTEST_PG_DSN}) {
16     ($dsn, $user, $pass) = map { $ENV{"DBICTEST_PG_$_"} } qw(DSN USER PASS);
17 }
18 else {
19     no warnings 'once';
20     maybe_plan(undef, 'Test::PostgreSQL');
21     $pgsql = Test::PostgreSQL->new
22         or plan skip_all => "Can't create test database: $Test::PostgreSQL::errstr";
23     $dsn = $pgsql->dsn;
24 };
25
26 my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1, AutoCommit => 1 });
27 $dbh->do('SET client_min_messages=warning');
28
29 my $source_ddl = <<DDL;
30 CREATE TABLE sqlt_test_foo (
31     pk  SERIAL PRIMARY KEY,
32     bar VARCHAR(10)
33 );
34 DDL
35
36 ok( $ret = $dbh->do($source_ddl), "create table" );
37
38 ok( $ret = $dbh->do(q| INSERT INTO sqlt_test_foo (bar) VALUES ('buzz') |), "insert data" );
39
40 cmp_ok( $ret, '==', 1, "one row inserted" );
41
42 my $target_ddl = <<DDL;
43 CREATE TABLE sqlt_test_fluff (
44     pk   SERIAL PRIMARY KEY,
45     biff VARCHAR(10)
46 );
47 DDL
48
49 my $source_sqlt = SQL::Translator->new(
50     no_comments => 1,
51     parser   => 'SQL::Translator::Parser::PostgreSQL',
52 )->translate(\$source_ddl);
53
54 my $target_sqlt = SQL::Translator->new(
55     no_comments => 1,
56     parser   => 'SQL::Translator::Parser::PostgreSQL',
57 )->translate(\$target_ddl);
58
59 my $table = $target_sqlt->get_table('sqlt_test_fluff');
60 $table->extra( renamed_from => 'sqlt_test_foo' );
61 my $field = $table->get_field('biff');
62 $field->extra( renamed_from => 'bar' );
63
64 my @diff = SQL::Translator::Diff->new({
65     output_db => 'PostgreSQL',
66     source_schema => $source_sqlt,
67     target_schema => $target_sqlt,
68 })->compute_differences->produce_diff_sql;
69
70 foreach my $line (@diff) {
71     $line =~ s/\n//g;
72     next if $line =~ /^--/;
73     lives_ok { $dbh->do($line) } "$line";
74 }
75
76 ok ( $ret = $dbh->selectall_arrayref(q(SELECT biff FROM sqlt_test_fluff), { Slice => {} }), "query DB for data" );
77
78 cmp_ok( scalar(@$ret), '==', 1, "Got 1 row");
79
80 cmp_ok( $ret->[0]->{biff}, 'eq', 'buzz', "col biff has value buzz" );
81
82 # Make sure Test::PostgreSQL can kill Pg
83 undef $dbh if $pgsql;
84
85 END {
86     if ($dbh && !$pgsql) {
87         $dbh->do("drop table if exists sqlt_test_$_") foreach qw(foo fluff);
88     }
89 }
90
91 done_testing;