['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'); });