DBIO-MySQL
view release on metacpan or search on metacpan
t/40-diff.t view on Meta::CPAN
);
is($ops[0]->action, 'drop', 'drop col');
like($ops[0]->as_sql, qr/DROP COLUMN `old`/, 'drop SQL');
}
# --- Diff::Index create ---
{
my @ops = DBIO::MySQL::Diff::Index->diff(
{},
{ t => { idx_t_name => {
index_name => 'idx_t_name', is_unique => 1,
columns => ['name'], origin => 'c',
}}},
);
is(scalar @ops, 1, 'one index create');
is($ops[0]->as_sql, 'CREATE UNIQUE INDEX `idx_t_name` ON `t` (`name`);', 'create SQL');
}
# --- Diff::Index skips PK + UNIQUE constraint indexes ---
{
my @ops = DBIO::MySQL::Diff::Index->diff(
{},
{
t => {
PRIMARY => { index_name => 'PRIMARY', is_unique => 1, columns => ['id'], origin => 'pk' },
uniq_email => { index_name => 'uniq_email', is_unique => 1, columns => ['email'], origin => 'u' },
},
},
);
is(scalar @ops, 0, 'auto indexes skipped');
}
# --- Diff::Index drop ---
{
my @ops = DBIO::MySQL::Diff::Index->diff(
{ t => { gone_idx => {
index_name => 'gone_idx', columns => ['x'], origin => 'c',
}}},
{},
);
is($ops[0]->as_sql, 'DROP INDEX `gone_idx` ON `t`;', 'drop index SQL');
}
# --- Diff::ForeignKey add ---
{
my @ops = DBIO::MySQL::Diff::ForeignKey->diff(
{ t => [] },
{ t => [{
constraint_name => 'fk_t_other',
from_columns => ['other_id'],
to_table => 'other',
to_columns => ['id'],
on_update => 'NO ACTION',
on_delete => 'CASCADE',
}]},
{ t => {} }, { t => {} },
);
is(scalar @ops, 1, 'one fk add');
my $sql = $ops[0]->as_sql;
like($sql, qr/ADD CONSTRAINT `fk_t_other` FOREIGN KEY \(`other_id`\) REFERENCES `other`\(`id`\)/, 'add fk');
like($sql, qr/ON DELETE CASCADE/, 'on delete cascade');
unlike($sql, qr/ON UPDATE/, 'on update NO ACTION omitted');
}
# --- Diff::ForeignKey drop ---
{
my @ops = DBIO::MySQL::Diff::ForeignKey->diff(
{ t => [{
constraint_name => 'fk_old', from_columns => ['x'],
to_table => 'other', to_columns => ['id'],
}]},
{ t => [] },
{ t => {} }, { t => {} },
);
is($ops[0]->action, 'drop', 'drop fk');
is($ops[0]->as_sql, 'ALTER TABLE `t` DROP FOREIGN KEY `fk_old`;', 'drop fk SQL');
}
# --- Top-level orchestrator ---
{
my $diff = DBIO::MySQL::Diff->new(
source => { tables => {}, columns => {}, indexes => {}, foreign_keys => {} },
target => {
tables => { t => { table_name => 't', engine => 'InnoDB' } },
columns => { t => [ { column_name => 'id', column_type => 'int(11)', is_pk => 1 } ] },
indexes => {},
foreign_keys => {},
},
);
ok($diff->has_changes, 'has changes');
like($diff->as_sql, qr/CREATE TABLE `t`/, 'orchestrator emits CREATE TABLE');
like($diff->summary, qr/\+ table: t/, 'summary line');
}
# --- Identical models = no changes ---
{
my $model = {
tables => { t => { table_name => 't' } },
columns => { t => [ { column_name => 'id', column_type => 'int' } ] },
indexes => {},
foreign_keys => {},
};
my $diff = DBIO::MySQL::Diff->new(source => $model, target => $model);
ok(!$diff->has_changes, 'identical = no changes');
}
done_testing;
( run in 1.102 second using v1.01-cache-2.11-cpan-7fcb06a456a )