package domain import ( "errors" "testing" ) func TestResolveAppStatusCoversAllStates(t *testing.T) { tests := []struct { name string facts AppStatusFacts want AppStatus }{ {name: "not installed", want: StatusNotInstalled}, {name: "queued", facts: AppStatusFacts{Operation: StatusQueued}, want: StatusQueued}, {name: "downloading", facts: AppStatusFacts{Operation: StatusDownloading}, want: StatusDownloading}, {name: "verifying", facts: AppStatusFacts{Operation: StatusVerifying}, want: StatusVerifying}, {name: "extracting", facts: AppStatusFacts{Operation: StatusExtracting}, want: StatusExtracting}, {name: "installing", facts: AppStatusFacts{Operation: StatusInstalling}, want: StatusInstalling}, { name: "installed", facts: AppStatusFacts{ InstalledVersion: "1.2.0", CatalogVersion: "1.2.0", }, want: StatusInstalled, }, { name: "update available", facts: AppStatusFacts{ InstalledVersion: "1.2.0", CatalogVersion: "1.3.0", }, want: StatusUpdateAvailable, }, {name: "running", facts: AppStatusFacts{Running: true}, want: StatusRunning}, {name: "failed", facts: AppStatusFacts{Operation: StatusFailed}, want: StatusFailed}, { name: "rollback pending", facts: AppStatusFacts{RecoveryPending: true}, want: StatusRollbackPending, }, { name: "incompatible", facts: AppStatusFacts{Incompatible: true}, want: StatusIncompatible, }, } seen := make(map[AppStatus]bool) for _, test := range tests { t.Run(test.name, func(t *testing.T) { status, err := ResolveAppStatus(test.facts) if err != nil { t.Fatalf("ResolveAppStatus() error = %v", err) } if status != test.want { t.Fatalf("status = %q, want %q", status, test.want) } seen[status] = true }) } if len(seen) != 12 { t.Fatalf("covered %d states, want 12", len(seen)) } } func TestResolveAppStatusPriorityAndValidation(t *testing.T) { status, err := ResolveAppStatus(AppStatusFacts{ Operation: StatusDownloading, Running: true, RecoveryPending: true, Incompatible: true, }) if err != nil { t.Fatalf("ResolveAppStatus() error = %v", err) } if status != StatusRollbackPending { t.Fatalf("status = %q, want %q", status, StatusRollbackPending) } _, err = ResolveAppStatus(AppStatusFacts{Operation: StatusInstalled}) if !errors.Is(err, ErrInvalidStatusFacts) { t.Fatalf("operation error = %v, want %v", err, ErrInvalidStatusFacts) } _, err = ResolveAppStatus(AppStatusFacts{InstalledVersion: "not-semver"}) if !errors.Is(err, ErrInvalidStatusFacts) { t.Fatalf("version error = %v, want %v", err, ErrInvalidStatusFacts) } }