- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
265 lines
10 KiB
PHP
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');
|
|
});
|