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