Files
michaelschiemer/tests/Framework/Database/Schema/Comparison/TableDifferenceTest.php
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

265 lines
10 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Framework\Database\Schema\Comparison;
use App\Framework\Database\Schema\Comparison\TableDifference;
test('creates a table difference with column differences', function () {
$tableDifference = new TableDifference(
'users',
[
'email' => ['type' => 'varchar', 'nullable' => false],
'created_at' => ['type' => 'timestamp', 'nullable' => false],
], // missing columns
[
'username' => ['type' => 'varchar', 'nullable' => false],
'last_login' => ['type' => 'timestamp', 'nullable' => true],
], // extra columns
[
'name' => [
'source' => ['type' => 'varchar', 'nullable' => false],
'target' => ['type' => 'varchar', 'nullable' => true],
],
], // modified columns
[], // missing indexes
[], // extra indexes
[], // modified indexes
[], // missing foreign keys
[], // extra foreign keys
[] // modified foreign keys
);
expect($tableDifference->tableName)->toBe('users');
expect($tableDifference->missingColumns)->toHaveCount(2);
expect($tableDifference->extraColumns)->toHaveCount(2);
expect($tableDifference->modifiedColumns)->toHaveCount(1);
expect($tableDifference->missingIndexes)->toBeEmpty();
expect($tableDifference->extraIndexes)->toBeEmpty();
expect($tableDifference->modifiedIndexes)->toBeEmpty();
expect($tableDifference->missingForeignKeys)->toBeEmpty();
expect($tableDifference->extraForeignKeys)->toBeEmpty();
expect($tableDifference->modifiedForeignKeys)->toBeEmpty();
expect($tableDifference->hasDifferences())->toBeTrue();
});
test('creates a table difference with index differences', function () {
$tableDifference = new TableDifference(
'users',
[], // missing columns
[], // extra columns
[], // modified columns
[
'idx_users_email' => [
'type' => 'unique',
'columns' => ['email'],
],
'idx_users_name' => [
'type' => 'index',
'columns' => ['name'],
],
], // missing indexes
[
'idx_users_username' => [
'type' => 'unique',
'columns' => ['username'],
],
], // extra indexes
[
'idx_users_created_at' => [
'source' => [
'type' => 'index',
'columns' => ['created_at'],
],
'target' => [
'type' => 'index',
'columns' => ['created_at', 'updated_at'],
],
],
], // modified indexes
[], // missing foreign keys
[], // extra foreign keys
[] // modified foreign keys
);
expect($tableDifference->tableName)->toBe('users');
expect($tableDifference->missingColumns)->toBeEmpty();
expect($tableDifference->extraColumns)->toBeEmpty();
expect($tableDifference->modifiedColumns)->toBeEmpty();
expect($tableDifference->missingIndexes)->toHaveCount(2);
expect($tableDifference->extraIndexes)->toHaveCount(1);
expect($tableDifference->modifiedIndexes)->toHaveCount(1);
expect($tableDifference->missingForeignKeys)->toBeEmpty();
expect($tableDifference->extraForeignKeys)->toBeEmpty();
expect($tableDifference->modifiedForeignKeys)->toBeEmpty();
expect($tableDifference->hasDifferences())->toBeTrue();
});
test('creates a table difference with foreign key differences', function () {
$tableDifference = new TableDifference(
'posts',
[], // missing columns
[], // extra columns
[], // modified columns
[], // missing indexes
[], // extra indexes
[], // modified indexes
[
'fk_posts_user_id' => [
'columns' => ['user_id'],
'referenced_table' => 'users',
'referenced_columns' => ['id'],
'update_rule' => 'CASCADE',
'delete_rule' => 'CASCADE',
],
], // missing foreign keys
[
'fk_posts_category_id' => [
'columns' => ['category_id'],
'referenced_table' => 'categories',
'referenced_columns' => ['id'],
'update_rule' => 'CASCADE',
'delete_rule' => 'CASCADE',
],
], // extra foreign keys
[
'fk_posts_parent_id' => [
'source' => [
'columns' => ['parent_id'],
'referenced_table' => 'posts',
'referenced_columns' => ['id'],
'update_rule' => 'CASCADE',
'delete_rule' => 'CASCADE',
],
'target' => [
'columns' => ['parent_id'],
'referenced_table' => 'posts',
'referenced_columns' => ['id'],
'update_rule' => 'CASCADE',
'delete_rule' => 'SET NULL',
],
],
] // modified foreign keys
);
expect($tableDifference->tableName)->toBe('posts');
expect($tableDifference->missingColumns)->toBeEmpty();
expect($tableDifference->extraColumns)->toBeEmpty();
expect($tableDifference->modifiedColumns)->toBeEmpty();
expect($tableDifference->missingIndexes)->toBeEmpty();
expect($tableDifference->extraIndexes)->toBeEmpty();
expect($tableDifference->modifiedIndexes)->toBeEmpty();
expect($tableDifference->missingForeignKeys)->toHaveCount(1);
expect($tableDifference->extraForeignKeys)->toHaveCount(1);
expect($tableDifference->modifiedForeignKeys)->toHaveCount(1);
expect($tableDifference->hasDifferences())->toBeTrue();
});
test('creates a table difference with no differences', function () {
$tableDifference = new TableDifference(
'users',
[], // missing columns
[], // extra columns
[], // modified columns
[], // missing indexes
[], // extra indexes
[], // modified indexes
[], // missing foreign keys
[], // extra foreign keys
[] // modified foreign keys
);
expect($tableDifference->tableName)->toBe('users');
expect($tableDifference->missingColumns)->toBeEmpty();
expect($tableDifference->extraColumns)->toBeEmpty();
expect($tableDifference->modifiedColumns)->toBeEmpty();
expect($tableDifference->missingIndexes)->toBeEmpty();
expect($tableDifference->extraIndexes)->toBeEmpty();
expect($tableDifference->modifiedIndexes)->toBeEmpty();
expect($tableDifference->missingForeignKeys)->toBeEmpty();
expect($tableDifference->extraForeignKeys)->toBeEmpty();
expect($tableDifference->modifiedForeignKeys)->toBeEmpty();
expect($tableDifference->hasDifferences())->toBeFalse();
});
test('gets summary of differences', function () {
$tableDifference = new TableDifference(
'users',
['email' => ['type' => 'varchar', 'nullable' => false]], // missing columns
['username' => ['type' => 'varchar', 'nullable' => false]], // extra columns
[
'name' => [
'source' => ['type' => 'varchar', 'nullable' => false],
'target' => ['type' => 'varchar', 'nullable' => true],
],
], // modified columns
['idx_users_email' => ['type' => 'unique', 'columns' => ['email']]], // missing indexes
['idx_users_username' => ['type' => 'unique', 'columns' => ['username']]], // extra indexes
[], // modified indexes
['fk_users_role_id' => []], // missing foreign keys
['fk_users_team_id' => []], // extra foreign keys
[] // modified foreign keys
);
$summary = $tableDifference->getSummary();
expect($summary)->toBeArray();
expect($summary['missing_columns'])->toBe(1);
expect($summary['extra_columns'])->toBe(1);
expect($summary['modified_columns'])->toBe(1);
expect($summary['missing_indexes'])->toBe(1);
expect($summary['extra_indexes'])->toBe(1);
expect($summary['modified_indexes'])->toBe(0);
expect($summary['missing_foreign_keys'])->toBe(1);
expect($summary['extra_foreign_keys'])->toBe(1);
expect($summary['modified_foreign_keys'])->toBe(0);
});
test('gets description of differences', function () {
$tableDifference = new TableDifference(
'users',
['email' => ['type' => 'varchar', 'nullable' => false]], // missing columns
['username' => ['type' => 'varchar', 'nullable' => false]], // extra columns
[
'name' => [
'source' => ['type' => 'varchar', 'nullable' => false],
'target' => ['type' => 'varchar', 'nullable' => true],
],
], // modified columns
['idx_users_email' => ['type' => 'unique', 'columns' => ['email']]], // missing indexes
['idx_users_username' => ['type' => 'unique', 'columns' => ['username']]], // extra indexes
[], // modified indexes
['fk_users_role_id' => [
'columns' => ['role_id'],
'referenced_table' => 'roles',
'referenced_columns' => ['id'],
]], // missing foreign keys
['fk_users_team_id' => [
'columns' => ['team_id'],
'referenced_table' => 'teams',
'referenced_columns' => ['id'],
]], // extra foreign keys
[] // modified foreign keys
);
$description = $tableDifference->getDescription();
expect($description)->toBeString();
expect($description)->toContain('Table: users');
expect($description)->toContain('Missing Columns');
expect($description)->toContain('email');
expect($description)->toContain('Extra Columns');
expect($description)->toContain('username');
expect($description)->toContain('Modified Columns');
expect($description)->toContain('name');
expect($description)->toContain('Missing Indexes');
expect($description)->toContain('idx_users_email');
expect($description)->toContain('Extra Indexes');
expect($description)->toContain('idx_users_username');
expect($description)->toContain('Missing Foreign Keys');
expect($description)->toContain('fk_users_role_id');
expect($description)->toContain('Extra Foreign Keys');
expect($description)->toContain('fk_users_team_id');
});