package statemachine import ( "testing" "provisioning/internal/model" ) func TestValidTransitions(t *testing.T) { cases := []struct { from model.HostState trigger Trigger want model.HostState }{ {model.StateRegistered, TriggerRebuildRequested, model.StatePXEReady}, {model.StateReady, TriggerRebuildRequested, model.StatePXEReady}, {model.StateFailed, TriggerRebuildRequested, model.StatePXEReady}, {model.StatePXEReady, TriggerPXEScriptServed, model.StatePXEBooted}, {model.StatePXEBooted, TriggerAnswerServed, model.StateInstalling}, {model.StateInstalling, TriggerInstallWebhook, model.StateInstalled}, {model.StateInstalled, TriggerPhoneHome, model.StateFirstBoot}, {model.StateFirstBoot, TriggerClusterJoinStart, model.StateJoining}, {model.StateJoining, TriggerJoinComplete, model.StateReady}, } for _, tc := range cases { got, err := Next(tc.from, tc.trigger) if err != nil { t.Errorf("Next(%q, %q) error: %v", tc.from, tc.trigger, err) continue } if got != tc.want { t.Errorf("Next(%q, %q) = %q, want %q", tc.from, tc.trigger, got, tc.want) } } } func TestFailedFromAllActive(t *testing.T) { for _, state := range allActiveStates { got, err := Next(state, TriggerFailed) if err != nil { t.Errorf("Next(%q, Failed) error: %v", state, err) continue } if got != model.StateFailed { t.Errorf("Next(%q, Failed) = %q, want %q", state, got, model.StateFailed) } } } func TestInvalidTransitions(t *testing.T) { cases := []struct { from model.HostState trigger Trigger }{ {model.StateRegistered, TriggerPXEScriptServed}, {model.StateReady, TriggerPhoneHome}, {model.StatePXEReady, TriggerInstallWebhook}, {model.StateInstalling, TriggerRebuildRequested}, {model.StateRegistered, TriggerFailed}, } for _, tc := range cases { _, err := Next(tc.from, tc.trigger) if err == nil { t.Errorf("Next(%q, %q) expected error, got nil", tc.from, tc.trigger) } } }