package deploy_test import ( "context" "database/sql" "log/slog" "testing" "github.com/stretchr/testify/assert" "git.eeqj.de/sneak/upaas/internal/models" "git.eeqj.de/sneak/upaas/internal/service/deploy" ) func TestRollback_NoPreviousImage(t *testing.T) { t.Parallel() svc := deploy.NewTestService(slog.Default()) app := &models.App{ ID: "app-rollback-1", PreviousImageID: sql.NullString{}, } err := svc.Rollback(context.Background(), app) assert.ErrorIs(t, err, deploy.ErrNoPreviousImage) } func TestRollback_EmptyPreviousImage(t *testing.T) { t.Parallel() svc := deploy.NewTestService(slog.Default()) app := &models.App{ ID: "app-rollback-2", PreviousImageID: sql.NullString{String: "", Valid: true}, } err := svc.Rollback(context.Background(), app) assert.ErrorIs(t, err, deploy.ErrNoPreviousImage) } func TestRollback_DeploymentLocked(t *testing.T) { t.Parallel() svc := deploy.NewTestService(slog.Default()) // Simulate a deploy holding the lock assert.True(t, svc.TryLockApp("app-rollback-3")) defer svc.UnlockApp("app-rollback-3") app := &models.App{ ID: "app-rollback-3", PreviousImageID: sql.NullString{String: "sha256:abc123", Valid: true}, } err := svc.Rollback(context.Background(), app) assert.ErrorIs(t, err, deploy.ErrDeploymentInProgress) } func TestRollback_LockedApp(t *testing.T) { t.Parallel() svc := deploy.NewTestService(slog.Default()) assert.True(t, svc.TryLockApp("app-rollback-4")) defer svc.UnlockApp("app-rollback-4") app := &models.App{ ID: "app-rollback-4", PreviousImageID: sql.NullString{String: "sha256:abc123", Valid: true}, } err := svc.Rollback(context.Background(), app) assert.ErrorIs(t, err, deploy.ErrDeploymentInProgress) }