package conversation import ( "errors" "testing" ) func TestDocumentedConversationPath(t *testing.T) { path := []Status{StatusPreparing, StatusRoomIssued, StatusStartingAgent, StatusActive, StatusStopping, StatusCompleted} for index := 1; index < len(path); index++ { if err := ValidateTransition(path[index-1], path[index]); err != nil { t.Fatalf("transition %s -> %s: %v", path[index-1], path[index], err) } } } func TestDuplicateAndTerminalCallbacksCannotRegress(t *testing.T) { if err := ValidateTransition(StatusActive, StatusActive); err != nil { t.Fatalf("duplicate callback should be idempotent: %v", err) } for _, terminal := range []Status{StatusCompleted, StatusFailed, StatusExpired} { if !IsTerminal(terminal) { t.Fatalf("%s should be terminal", terminal) } if err := ValidateTransition(terminal, StatusActive); !errors.Is(err, ErrInvalidTransition) { t.Fatalf("terminal regression %s -> ACTIVE error = %v", terminal, err) } } } func TestFailureAndExpiryBranches(t *testing.T) { for _, transition := range [][2]Status{ {StatusPreparing, StatusFailed}, {StatusRoomIssued, StatusExpired}, {StatusStartingAgent, StatusFailed}, } { if err := ValidateTransition(transition[0], transition[1]); err != nil { t.Fatal(err) } } }