91 lines
2.6 KiB
Go
91 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|