@@ -9,21 +9,147 @@ vitest.mock("vscode", () => ({
99 } ,
1010} ) )
1111
12- import type { ProviderSettings } from "@roo-code/types"
12+ // Handler constructors can require credentials or initialize SDK clients. Replace them
13+ // with inert classes so these tests exercise only the factory's routing behavior.
14+ vitest . mock ( "../providers" , async ( ) => {
15+ const providers = await vitest . importActual < Record < string , unknown > > ( "../providers" )
16+
17+ return Object . fromEntries ( Object . keys ( providers ) . map ( ( name ) => [ name , class { } ] ) )
18+ } )
19+
20+ vitest . mock ( "../providers/native-ollama" , ( ) => ( {
21+ NativeOllamaHandler : class { } ,
22+ } ) )
23+
24+ import {
25+ providerIdentifiers ,
26+ retiredProviderIdentifiers ,
27+ type ProviderName ,
28+ type ProviderNameWithRetired ,
29+ } from "@roo-code/types"
1330
1431import { buildApiHandler } from "../index"
15- import { KenariHandler } from "../providers/kenari"
32+ import {
33+ AnthropicHandler ,
34+ AnthropicVertexHandler ,
35+ AwsBedrockHandler ,
36+ BasetenHandler ,
37+ DeepSeekHandler ,
38+ FakeAIHandler ,
39+ FireworksHandler ,
40+ FriendliHandler ,
41+ GeminiHandler ,
42+ KenariHandler ,
43+ KimiCodeHandler ,
44+ LiteLLMHandler ,
45+ LmStudioHandler ,
46+ MiniMaxHandler ,
47+ MimoHandler ,
48+ MistralHandler ,
49+ MoonshotHandler ,
50+ OpenAiCodexHandler ,
51+ OpenAiHandler ,
52+ OpenAiNativeHandler ,
53+ OpencodeGoHandler ,
54+ OpenRouterHandler ,
55+ PoeHandler ,
56+ QwenCodeHandler ,
57+ RequestyHandler ,
58+ SambaNovaHandler ,
59+ UnboundHandler ,
60+ VercelAiGatewayHandler ,
61+ VertexHandler ,
62+ VsCodeLmHandler ,
63+ XAIHandler ,
64+ ZAiHandler ,
65+ ZooGatewayHandler ,
66+ } from "../providers"
67+ import { NativeOllamaHandler } from "../providers/native-ollama"
68+
69+ type HandlerConstructor = new ( ...args : never [ ] ) => object
70+
71+ const expectedHandlers = {
72+ [ providerIdentifiers . anthropic ] : AnthropicHandler ,
73+ [ providerIdentifiers . openrouter ] : OpenRouterHandler ,
74+ [ providerIdentifiers . bedrock ] : AwsBedrockHandler ,
75+ [ providerIdentifiers . openai ] : OpenAiHandler ,
76+ [ providerIdentifiers . ollama ] : NativeOllamaHandler ,
77+ [ providerIdentifiers . lmstudio ] : LmStudioHandler ,
78+ [ providerIdentifiers . gemini ] : GeminiHandler ,
79+ // Gemini CLI currently relies on the factory's default Anthropic handler.
80+ [ providerIdentifiers . geminiCli ] : AnthropicHandler ,
81+ [ providerIdentifiers . openaiCodex ] : OpenAiCodexHandler ,
82+ [ providerIdentifiers . openaiNative ] : OpenAiNativeHandler ,
83+ [ providerIdentifiers . deepseek ] : DeepSeekHandler ,
84+ [ providerIdentifiers . qwenCode ] : QwenCodeHandler ,
85+ [ providerIdentifiers . moonshot ] : MoonshotHandler ,
86+ [ providerIdentifiers . kimiCode ] : KimiCodeHandler ,
87+ [ providerIdentifiers . vscodeLm ] : VsCodeLmHandler ,
88+ [ providerIdentifiers . mistral ] : MistralHandler ,
89+ [ providerIdentifiers . requesty ] : RequestyHandler ,
90+ [ providerIdentifiers . unbound ] : UnboundHandler ,
91+ [ providerIdentifiers . fakeAi ] : FakeAIHandler ,
92+ [ providerIdentifiers . xai ] : XAIHandler ,
93+ [ providerIdentifiers . litellm ] : LiteLLMHandler ,
94+ [ providerIdentifiers . sambanova ] : SambaNovaHandler ,
95+ [ providerIdentifiers . mimo ] : MimoHandler ,
96+ [ providerIdentifiers . zai ] : ZAiHandler ,
97+ [ providerIdentifiers . fireworks ] : FireworksHandler ,
98+ [ providerIdentifiers . friendli ] : FriendliHandler ,
99+ [ providerIdentifiers . vercelAiGateway ] : VercelAiGatewayHandler ,
100+ [ providerIdentifiers . opencodeGo ] : OpencodeGoHandler ,
101+ [ providerIdentifiers . kenari ] : KenariHandler ,
102+ [ providerIdentifiers . zooGateway ] : ZooGatewayHandler ,
103+ [ providerIdentifiers . minimax ] : MiniMaxHandler ,
104+ [ providerIdentifiers . baseten ] : BasetenHandler ,
105+ [ providerIdentifiers . poe ] : PoeHandler ,
106+ } satisfies Record < Exclude < ProviderName , typeof providerIdentifiers . vertex > , HandlerConstructor >
107+
108+ const expectedHandlerEntries = Object . entries ( expectedHandlers ) as Array <
109+ [ Exclude < ProviderName , typeof providerIdentifiers . vertex > , HandlerConstructor ]
110+ >
16111
17112describe ( "buildApiHandler" , ( ) => {
18- it ( "returns a KenariHandler for the kenari provider" , ( ) => {
19- const configuration : ProviderSettings = {
20- apiProvider : "kenari" ,
21- kenariApiKey : "test-key" ,
22- kenariModelId : "glm-5-2" ,
23- }
113+ it . each ( expectedHandlerEntries ) ( "returns the expected handler for %s" , ( apiProvider , Handler ) => {
114+ const handler = buildApiHandler ( { apiProvider } )
115+
116+ expect ( handler ) . toBeInstanceOf ( Handler )
117+ } )
118+
119+ it . each ( [
120+ [ "an unspecified model" , undefined , VertexHandler ] ,
121+ [ "non-Claude models" , "non-claude-test-model" , VertexHandler ] ,
122+ [ "Claude models" , "claude-test-model" , AnthropicVertexHandler ] ,
123+ ] as const ) ( "returns the expected Vertex handler for %s" , ( _description , apiModelId , Handler ) => {
124+ const handler = buildApiHandler ( {
125+ apiProvider : providerIdentifiers . vertex ,
126+ apiModelId,
127+ } )
128+
129+ expect ( handler ) . toBeInstanceOf ( Handler )
130+ } )
131+
132+ it ( "preserves the dedicated removal error for the retired Roo provider" , ( ) => {
133+ expect ( ( ) =>
134+ buildApiHandler ( {
135+ apiProvider : retiredProviderIdentifiers . roo ,
136+ } ) ,
137+ ) . toThrow ( "Roo Code Router has been removed" )
138+ } )
139+
140+ it ( "rejects other retired providers" , ( ) => {
141+ expect ( ( ) =>
142+ buildApiHandler ( {
143+ apiProvider : retiredProviderIdentifiers . cerebras ,
144+ } ) ,
145+ ) . toThrow ( "this provider is no longer supported" )
146+ } )
24147
25- const handler = buildApiHandler ( configuration )
148+ it ( "falls back to Anthropic for an unsupported provider value" , ( ) => {
149+ const handler = buildApiHandler ( {
150+ apiProvider : "unsupported-provider" as ProviderNameWithRetired ,
151+ } )
26152
27- expect ( handler ) . toBeInstanceOf ( KenariHandler )
153+ expect ( handler ) . toBeInstanceOf ( AnthropicHandler )
28154 } )
29155} )
0 commit comments