(t *testing.T)
| 591 | } |
| 592 | |
| 593 | func 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 | })} |
nothing calls this directly
no test coverage detected