package handoff import ( "testing" "time" ) func TestFallbackManager(t *testing.T) { m := NewFallbackManager(FallbackConfig{MaxLanguageFailures: 3, MaxRegionFailures: 3, MaxNoAnswer: 2, MaxKBUnavailable: 1, MaxAIErrors: 1, MaxMediaErrors: 1, MaxToolErrors: 2, CallTimeout: time.Minute}) if d := m.Evaluate(FallbackCounters{LanguageFailures: 3}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonLanguageFailures { t.Fatalf("language fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{RegionFailures: 3}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonRegionFailures { t.Fatalf("region fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{NoAnswerCount: 2}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonRepeatedNoAnswer { t.Fatalf("no answer fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{KBUnavailable: 1}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonKBUnavailable { t.Fatalf("kb fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{AIProviderErrors: 1}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonAIProviderError { t.Fatalf("ai fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{MediaErrors: 1}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonMediaError { t.Fatalf("media fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{ToolErrors: 2}, "ru", time.Now()); !d.ShouldOfferHandoff || d.ReasonCode != HandoffReasonToolError { t.Fatalf("tool fallback failed: %+v", d) } if d := m.Evaluate(FallbackCounters{StartedAt: time.Now().Add(-2 * time.Minute)}, "ru", time.Now()); !d.ShouldClose || d.ReasonCode != HandoffReasonTimeout { t.Fatalf("timeout fallback failed: %+v", d) } }