78 lines
2.4 KiB
Go
78 lines
2.4 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestAppStatusValid(t *testing.T) {
|
|
statuses := []AppStatus{
|
|
StatusNotInstalled,
|
|
StatusQueued,
|
|
StatusDownloading,
|
|
StatusVerifying,
|
|
StatusExtracting,
|
|
StatusInstalling,
|
|
StatusInstalled,
|
|
StatusUpdateAvailable,
|
|
StatusRunning,
|
|
StatusFailed,
|
|
StatusRollbackPending,
|
|
StatusIncompatible,
|
|
}
|
|
|
|
for _, status := range statuses {
|
|
if !status.Valid() {
|
|
t.Errorf("status %q should be valid", status)
|
|
}
|
|
}
|
|
|
|
if AppStatus("unknown").Valid() {
|
|
t.Fatal("unknown status should be invalid")
|
|
}
|
|
}
|
|
|
|
func TestValidateTransition(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
from AppStatus
|
|
to AppStatus
|
|
want error
|
|
}{
|
|
{name: "queue install", from: StatusNotInstalled, to: StatusQueued},
|
|
{name: "start download", from: StatusQueued, to: StatusDownloading},
|
|
{name: "pause download", from: StatusDownloading, to: StatusQueued},
|
|
{name: "finish install", from: StatusInstalling, to: StatusInstalled},
|
|
{name: "start app", from: StatusInstalled, to: StatusRunning},
|
|
{name: "recover rollback", from: StatusRollbackPending, to: StatusInstalled},
|
|
{name: "skip install pipeline", from: StatusNotInstalled, to: StatusInstalled, want: ErrInvalidTransition},
|
|
{name: "download while running", from: StatusRunning, to: StatusDownloading, want: ErrInvalidTransition},
|
|
{name: "extract incompatible app", from: StatusIncompatible, to: StatusExtracting, want: ErrInvalidTransition},
|
|
{name: "same status", from: StatusInstalled, to: StatusInstalled, want: ErrInvalidTransition},
|
|
{name: "unknown source", from: AppStatus("unknown"), to: StatusQueued, want: ErrInvalidStatus},
|
|
{name: "unknown target", from: StatusQueued, to: AppStatus("unknown"), want: ErrInvalidStatus},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
err := ValidateTransition(test.from, test.to)
|
|
if test.want == nil {
|
|
if err != nil {
|
|
t.Fatalf("ValidateTransition(%q, %q) error = %v", test.from, test.to, err)
|
|
}
|
|
if !CanTransition(test.from, test.to) {
|
|
t.Fatalf("CanTransition(%q, %q) = false, want true", test.from, test.to)
|
|
}
|
|
return
|
|
}
|
|
|
|
if !errors.Is(err, test.want) {
|
|
t.Fatalf("ValidateTransition(%q, %q) error = %v, want %v", test.from, test.to, err, test.want)
|
|
}
|
|
if CanTransition(test.from, test.to) {
|
|
t.Fatalf("CanTransition(%q, %q) = true, want false", test.from, test.to)
|
|
}
|
|
})
|
|
}
|
|
}
|