package migration import ( "context" "path/filepath" "testing" "cmroubao/backend-api/internal/platform/database" ) func TestRunnerSupportsUpStatusDownAndIdempotentUp(t *testing.T) { db, err := database.Open( context.Background(), filepath.Join(t.TempDir(), "migration.db"), ) if err != nil { t.Fatalf("database.Open() error = %v", err) } t.Cleanup(func() { _ = db.Close() }) runner, err := New(db) if err != nil { t.Fatalf("New() error = %v", err) } applied, err := runner.Up(context.Background()) if err != nil { t.Fatalf("Up() error = %v", err) } if applied != 1 { t.Fatalf("Up() applied = %d, want 1", applied) } assertStatus(t, runner, true) applied, err = runner.Up(context.Background()) if err != nil { t.Fatalf("second Up() error = %v", err) } if applied != 0 { t.Fatalf("second Up() applied = %d, want 0", applied) } if err := runner.Down(context.Background()); err != nil { t.Fatalf("Down() error = %v", err) } assertStatus(t, runner, false) applied, err = runner.Up(context.Background()) if err != nil { t.Fatalf("final Up() error = %v", err) } if applied != 1 { t.Fatalf("final Up() applied = %d, want 1", applied) } } func assertStatus(t *testing.T, runner *Runner, applied bool) { t.Helper() statuses, err := runner.Status(context.Background()) if err != nil { t.Fatalf("Status() error = %v", err) } if len(statuses) != 1 { t.Fatalf("Status() count = %d, want 1", len(statuses)) } if statuses[0].Version != 1 || statuses[0].Applied != applied { t.Fatalf("Status() = %+v", statuses[0]) } }