create([ 'name' => 'Test Source DB', ]); expect($sourceDb)->toBeInstanceOf(SourceDatabase::class); expect($sourceDb->name)->toBe('Test Source DB'); expect($sourceDb->is_active)->toBeTrue(); }); it('can create a target database', function () { $targetDb = TargetDatabase::factory()->create([ 'name' => 'Test Target DB', ]); expect($targetDb)->toBeInstanceOf(TargetDatabase::class); expect($targetDb->name)->toBe('Test Target DB'); }); it('can create a table with columns', function () { $sourceDb = SourceDatabase::factory()->create(); $table = Table::create([ 'source_database_id' => $sourceDb->id, 'schema_name' => 'public', 'table_name' => 'users', 'comment' => 'User table', ]); $column = Column::create([ 'table_id' => $table->id, 'column_name' => 'id', 'data_type' => 'integer', 'ordinal_position' => 1, 'is_nullable' => false, 'is_primary_key' => true, ]); expect($table)->toBeInstanceOf(Table::class); expect($table->columns)->toHaveCount(1); expect($column->is_primary_key)->toBeTrue(); }); it('can create a migration schedule', function () { $sourceDb = SourceDatabase::factory()->create(); $targetDb = TargetDatabase::factory()->create(); $schedule = MigrationSchedule::create([ 'name' => 'Daily User Sync', 'source_database_id' => $sourceDb->id, 'target_database_id' => $targetDb->id, 'tables' => [1, 2, 3], 'cron_expression' => '0 0 * * *', 'timezone' => 'UTC', 'is_active' => true, 'batch_size' => 1000, ]); expect($schedule)->toBeInstanceOf(MigrationSchedule::class); expect($schedule->is_active)->toBeTrue(); expect($schedule->cron_expression)->toBe('0 0 * * *'); }); it('can create a migration run', function () { $schedule = MigrationSchedule::factory()->create(); $run = MigrationRun::create([ 'schedule_id' => $schedule->id, 'status' => 'pending', 'total_tables' => 5, ]); expect($run)->toBeInstanceOf(MigrationRun::class); expect($run->status)->toBe('pending'); expect($run->progress)->toBe(0.0); }); it('calculates migration progress correctly', function () { $schedule = MigrationSchedule::factory()->create(); $run = MigrationRun::create([ 'schedule_id' => $schedule->id, 'status' => 'running', 'total_tables' => 10, 'processed_tables' => 5, ]); expect($run->progress)->toBe(50.0); }); it('has many tables relationship', function () { $sourceDb = SourceDatabase::factory()->create(); Table::create([ 'source_database_id' => $sourceDb->id, 'schema_name' => 'public', 'table_name' => 'users', ]); Table::create([ 'source_database_id' => $sourceDb->id, 'schema_name' => 'public', 'table_name' => 'posts', ]); expect($sourceDb->tables)->toHaveCount(2); }); it('belongs to source database', function () { $sourceDb = SourceDatabase::factory()->create(); $table = Table::create([ 'source_database_id' => $sourceDb->id, 'schema_name' => 'public', 'table_name' => 'users', ]); expect($table->sourceDatabase)->toBeInstanceOf(SourceDatabase::class); expect($table->sourceDatabase->id)->toBe($sourceDb->id); });