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 )