package jobs import ( "context" "testing" "time" ) func TestServiceDeletesScopedJobAndRetriesOnlyFailedImage(t *testing.T) { now := time.Date(2026, 8, 13, 9, 0, 0, 0, time.UTC) store := newMemoryJobStore() store.jobs["failed"] = Job{ID: "failed", OwnerID: "user-1", Capability: "image.generate", Provider: "mock", ReqKey: "fixture", Status: StatusFailed, Prompt: "p", InputAssetIDs: []string{}, InputURLs: []string{}, OutputAssetIDs: []string{"asset-1"}, RequestPayload: []byte(`{"prompt":"p"}`), CreatedAt: now, UpdatedAt: now} service := NewService(store, func() time.Time { return now }) retried, err := service.Retry(context.Background(), Scope{OwnerID: "user-1"}, "failed", "retry-1") if err != nil || retried.ID != "retry-1" || retried.RetryOf != "failed" || retried.Status != StatusQueued || retried.OutputAssetIDs == nil || len(retried.OutputAssetIDs) != 0 { t.Fatalf("Retry = %#v, %v", retried, err) } deleted, err := service.Delete(context.Background(), Scope{OwnerID: "user-1"}, "failed", nil) if err != nil || deleted.ID != "failed" { t.Fatalf("Delete = %#v, %v", deleted, err) } if _, ok := store.jobs["failed"]; ok { t.Fatal("job was not deleted") } } func TestServiceRejectsRetryForVideoOrActiveJob(t *testing.T) { store := newMemoryJobStore() store.jobs["video"] = Job{ID: "video", OwnerID: "user-1", Capability: "video.generate", Status: StatusFailed} store.jobs["active"] = Job{ID: "active", OwnerID: "user-1", Capability: "image.generate", Status: StatusRunning} service := NewService(store, nil) for _, id := range []string{"video", "active"} { if _, err := service.Retry(context.Background(), Scope{OwnerID: "user-1"}, id, "new"); err == nil { t.Fatalf("Retry(%s) error=nil", id) } } }