package orchestration import ( "context" "errors" "reflect" "testing" "git.nianxx.cn/wangxuming/NianAIGC/backend/internal/assets" "git.nianxx.cn/wangxuming/NianAIGC/backend/internal/jobs" ) func TestAssetArtifactsDeletesUniqueOutputsAndIgnoresAlreadyMissingAssets(t *testing.T) { deletions := &recordingAssetDeleter{missing: map[string]bool{"asset-missing": true}} adapter := NewAssetArtifacts(deletions) deleted, err := adapter.DeleteOutputs(context.Background(), jobs.Job{ OwnerID: "account-1", OutputAssetIDs: []string{"asset-1", "asset-missing", "asset-1", "asset-2"}, }) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(deleted, []string{"asset-1", "asset-2"}) || !reflect.DeepEqual(deletions.ids, []string{"asset-1", "asset-missing", "asset-2"}) { t.Fatalf("deleted=%#v calls=%#v", deleted, deletions.ids) } } func TestAssetArtifactsFailsClosedOnStorageError(t *testing.T) { deletions := &recordingAssetDeleter{failure: errors.New("storage unavailable")} _, err := NewAssetArtifacts(deletions).DeleteOutputs(context.Background(), jobs.Job{OwnerID: "account-1", OutputAssetIDs: []string{"asset-1"}}) if err == nil || err.Error() != "delete generation output assets" { t.Fatalf("err=%v", err) } } type recordingAssetDeleter struct { ids []string missing map[string]bool failure error } func (d *recordingAssetDeleter) Delete(_ context.Context, _ assets.Scope, id string) (assets.Asset, error) { d.ids = append(d.ids, id) if d.failure != nil { return assets.Asset{}, d.failure } if d.missing[id] { return assets.Asset{}, assets.ErrNotFound } return assets.Asset{ID: id}, nil }