MCPcopy Index your code
hub / github.com/coder/coder / TestAIBridgeRoutingFailClosed

Function TestAIBridgeRoutingFailClosed

coderd/x/chatd/model_routing_internal_test.go:593–674  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

591}
592
593func TestAIBridgeRoutingFailClosed(t *testing.T) {
594 t.Parallel()
595
596 providerID := uuid.New()
597 chat := database.Chat{ID: uuid.New(), OwnerID: uuid.New()}
598 aiProvider := aibridgeTestAIProvider(providerID, "primary-openai", database.AiProviderTypeOpenai)
599
600 t.Run("NilFactory", func(t *testing.T) {
601 t.Parallel()
602 server := &Server{aiGatewayRoutingEnabled: true}
603 _, err := server.newModel(t.Context(), aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(aiProvider), modelBuildOptions{ActiveAPIKeyID: uuid.NewString()})
604 require.ErrorContains(t, err, "transport factory")
605 })
606
607 t.Run("FactoryError", func(t *testing.T) {
608 t.Parallel()
609 factory := &aibridgeTestFactory{err: xerrors.New("boom")}
610 server := &Server{
611 aiGatewayRoutingEnabled: true,
612 aibridgeTransportFactory: aibridgeTestFactoryPointer(factory),
613 }
614 _, err := server.newModel(t.Context(), aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(aiProvider), modelBuildOptions{ActiveAPIKeyID: uuid.NewString()})
615 require.ErrorContains(t, err, "boom")
616 })
617
618 t.Run("MissingProviderName", func(t *testing.T) {
619 t.Parallel()
620 server := &Server{aiGatewayRoutingEnabled: true}
621 missingNameProvider := aibridgeTestAIProvider(providerID, "", database.AiProviderTypeOpenai)
622 _, err := server.newModel(t.Context(), aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(missingNameProvider), modelBuildOptions{ActiveAPIKeyID: uuid.NewString()})
623 require.ErrorContains(t, err, "AI provider name")
624 })
625
626 t.Run("MissingAPIKeyID", func(t *testing.T) {
627 t.Parallel()
628 factory := &aibridgeTestFactory{rt: roundTripFunc(func(*http.Request) (*http.Response, error) {
629 t.Fatal("transport must not be used without an API key ID")
630 return nil, xerrors.New("unreachable")
631 })}
632 server := &Server{
633 aiGatewayRoutingEnabled: true,
634 aibridgeTransportFactory: aibridgeTestFactoryPointer(factory),
635 }
636 _, err := server.newModel(t.Context(), aibridgeTestRequest(chat, "gpt-4"), aibridgeTestRoute(aiProvider), modelBuildOptions{})
637 require.ErrorContains(t, err, "active turn API key ID")
638
639 classified := chaterror.Classify(err)
640 require.Equal(t, codersdk.ChatErrorKindMissingKey, classified.Kind,
641 "production path must return a pre-classified missing_key error")
642 require.False(t, classified.Retryable)
643 })
644
645 t.Run("OpenRouterMisconfiguredAsOpenAI", func(t *testing.T) {
646 t.Parallel()
647 factory := &aibridgeTestFactory{rt: roundTripFunc(func(*http.Request) (*http.Response, error) {
648 t.Fatal("transport must not be used for invalid provider config")
649 return nil, xerrors.New("unreachable")
650 })}

Callers

nothing calls this directly

Calls 13

newModelMethod · 0.95
ClassifyFunction · 0.92
aibridgeTestAIProviderFunction · 0.85
aibridgeTestRequestFunction · 0.85
aibridgeTestRouteFunction · 0.85
newAIGatewayModelRouteFunction · 0.85
FatalMethod · 0.80
roundTripFuncFuncType · 0.70
NewMethod · 0.65
RunMethod · 0.65
ContextMethod · 0.65

Tested by

no test coverage detected