test: P1.6 — table-driven tests for classifyStatus, isAdoptable, isTerminalError (34 cases)

This commit is contained in:
“Naeel”
2026-06-30 17:40:20 +04:00
parent d1ca283d3a
commit 2bc0e0160a
@@ -3,6 +3,8 @@ package resources_core
import (
"context"
"testing"
"terraform-provider-nubes/internal/core"
)
func TestIsStatusSuspended(t *testing.T) {
@@ -54,3 +56,144 @@ func TestDeleteBehaviorDefault(t *testing.T) {
t.Errorf("expected nil error for default (state_only) destroy behavior, got: %v", err)
}
}
// ── P1.6: Табличные тесты classifyStatus ────────────────────────────────────
func TestClassifyStatus(t *testing.T) {
cases := []struct {
name string
inst *core.InstanceStateResponse
expected InstanceState
}{
{
name: "NOT_CREATED",
inst: &core.InstanceStateResponse{ExplainedStatus: "not created"},
expected: StateNotCreated,
},
{
name: "CREATING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "creating",
OperationIsInProgress: true,
},
expected: StateCreating,
},
{
name: "RUNNING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "running",
},
expected: StateRunning,
},
{
name: "RUNNING_PENDING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "running",
OperationIsPending: true,
},
expected: StateRunningPending,
},
{
name: "MODIFYING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "modifying",
OperationIsInProgress: true,
},
expected: StateModifying,
},
{
name: "SUSPENDED",
inst: &core.InstanceStateResponse{
ExplainedStatus: "suspended",
},
expected: StateSuspended,
},
{
name: "SUSPENDING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "suspending",
OperationIsInProgress: true,
},
expected: StateSuspending,
},
{
name: "DELETED",
inst: &core.InstanceStateResponse{
ExplainedStatus: "deleted",
IsDeleted: true,
},
expected: StateDeleted,
},
{
name: "DELETING",
inst: &core.InstanceStateResponse{
ExplainedStatus: "deleting",
OperationIsInProgress: true,
},
expected: StateDeleting,
},
{
name: "CREATION_FAILED",
inst: &core.InstanceStateResponse{
ExplainedStatus: "creation failed",
},
expected: StateCreationFailed,
},
{
name: "UNKNOWN (empty)",
inst: &core.InstanceStateResponse{
ExplainedStatus: "",
},
expected: StateUnknown,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
result := classifyStatus(c.inst)
if result != c.expected {
t.Errorf("classifyStatus(%q): expected %d, got %d",
c.inst.ExplainedStatus, c.expected, result)
}
})
}
}
func TestIsAdoptable(t *testing.T) {
adoptable := []InstanceState{StateRunning, StateRunningPending, StateSuspended}
notAdoptable := []InstanceState{StateNotCreated, StateCreating, StateCreationFailed,
StateModifying, StateModificationFailed, StateSuspending, StateSuspendFailed,
StateResuming, StateResumeFailed, StateDeleting, StateDeletionFailed,
StateDeleted, StateOrphaned, StateUnknown}
for _, s := range adoptable {
if !isAdoptable(s) {
t.Errorf("state %d should be adoptable", s)
}
}
for _, s := range notAdoptable {
if isAdoptable(s) {
t.Errorf("state %d should NOT be adoptable", s)
}
}
}
func TestIsTerminalError(t *testing.T) {
errors := []InstanceState{StateCreationFailed, StateModificationFailed,
StateSuspendFailed, StateResumeFailed, StateDeletionFailed,
StateOrphaned, StateDeleted}
nonErrors := []InstanceState{StateNotCreated, StateCreating, StateRunning,
StateRunningPending, StateModifying, StateSuspending, StateSuspended,
StateResuming, StateDeleting, StateUnknown}
for _, s := range errors {
if !isTerminalError(s) {
t.Errorf("state %d should be terminal error", s)
}
}
for _, s := range nonErrors {
if isTerminalError(s) {
t.Errorf("state %d should NOT be terminal error", s)
}
}
}