#!/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;
plan tests => 10;
use_ok('SQL::Translator::Diff') or die "Cannot continue\n";
my $tr = SQL::Translator->new;
my ( $source_schema, $target_schema ) = map {
my $t = SQL::Translator->new;
$t->parser( 'YAML' )
or die $tr->error;
my $out = $t->translate( catfile($Bin, qw/data diff /, $_ ) )
or die $tr->error;
my $schema = $t->schema;
unless ( $schema->name ) {
$schema->name( $_ );
}
($schema);
} (qw/create1.yml create2.yml/);
# Test for differences
my $diff = SQL::Translator::Diff->new({
source_schema => $source_schema,
source_db => 'MySQL',
target_schema => $target_schema,
target_db => 'MySQL',
})->compute_differences;
my $diff_hash = make_diff_hash();
eq_or_diff($diff_hash->{employee},
{
constraints_to_create => [ 'FK5302D47D93FE702E_diff' ],
constraints_to_drop => [ 'FK5302D47D93FE702E' ],
fields_to_drop => [ 'job_title' ]
},
"Correct differences correct on employee table");
eq_or_diff($diff_hash->{person},
{
constraints_to_create => [ 'UC_person_id', 'UC_age_name' ],
constraints_to_drop => [ 'UC_age_name' ],
fields_to_alter => [
'person_id person_id',
'name name',
'age age',
'iq iq',
],
fields_to_create => [ 'is_rock_star' ],
fields_to_rename => [ 'description physical_description' ],
indexes_to_create => [ 'unique_name' ],
indexes_to_drop => [ 'u_name' ],
table_options => [ 'person' ],
},
"Correct differences correct on person table");
eq_or_diff(
[ map { $_->name } @{$diff->tables_to_drop} ],
[ "deleted" ],
"tables_to_drop right"
);
eq_or_diff(
[ map { $_->name } @{$diff->tables_to_create} ],
[ "added" ],
"tables_to_create right"
);
$diff = SQL::Translator::Diff->new({
source_schema => $source_schema,
source_db => 'MySQL',
target_schema => $target_schema,
target_db => 'MySQL',
ignore_index_names => 1,
ignore_constraint_names => 1,
})->compute_differences;
$diff_hash = make_diff_hash();
eq_or_diff($diff_hash->{employee},
{
fields_to_drop => [ 'job_title' ]
},
"Correct differences correct on employee table");
eq_or_diff($diff_hash->{person},
{
constraints_to_create => [ 'UC_person_id', 'UC_age_name' ],
constraints_to_drop => [ 'UC_age_name' ],
fields_to_alter => [
'person_id person_id',
'name name',
'age age',
'iq iq',
],
fields_to_create => [ 'is_rock_star' ],
fields_to_rename => [ 'description physical_description' ],
table_options => [ 'person' ],
},
"Correct differences correct on person table");
# Test for sameness
$diff = SQL::Translator::Diff->new({
source_schema => $source_schema,
source_db => 'MySQL',
target_schema => $source_schema,
target_db => 'MySQL',
})->compute_differences;
$diff_hash = make_diff_hash();
eq_or_diff($diff_hash, {}, "No differences");
is( @{$diff->tables_to_drop}, 0, "tables_to_drop right");
is( @{$diff->tables_to_create}, 0, "tables_to_create right");
# Turn table_diff_hash into something we can eq_or_diff better
sub make_diff_hash {
return {
map {
my $table = $_;
my $table_diff = $diff->table_diff_hash->{$table};
my %table_diffs = (
map {
my $opt = $table_diff->{$_};
@$opt ? ( $_ => [ map {
(ref $_||'') eq 'ARRAY' ? "@$_" :
(ref $_) ? $_->name
: "$_";
} @$opt
] )
: ()
} keys %$table_diff
);
%table_diffs ? ( $table => \%table_diffs ) : ();
} keys %{ $diff->table_diff_hash }
};
}