@@ -2035,4 +2035,132 @@ describe("CodeIndexConfigManager", () => {
20352035 } )
20362036 } )
20372037 } )
2038+
2039+ describe ( "mistral, vercel-ai-gateway and bedrock provider configuration" , ( ) => {
2040+ it ( "should load Mistral provider configuration and mark it configured" , async ( ) => {
2041+ mockContextProxy . getGlobalState . mockReturnValue ( {
2042+ codebaseIndexEnabled : true ,
2043+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2044+ codebaseIndexEmbedderProvider : providerIdentifiers . mistral ,
2045+ } )
2046+ mockContextProxy . getSecret . mockImplementation ( ( key : string ) => {
2047+ if ( key === "codebaseIndexMistralApiKey" ) return "test-mistral-key"
2048+ return undefined
2049+ } )
2050+
2051+ const result = await configManager . loadConfiguration ( )
2052+
2053+ expect ( result . currentConfig . embedderProvider ) . toBe ( providerIdentifiers . mistral )
2054+ expect ( result . currentConfig . mistralOptions ) . toEqual ( { apiKey : "test-mistral-key" } )
2055+ expect ( result . currentConfig . isConfigured ) . toBe ( true )
2056+ expect ( configManager . currentEmbedderProvider ) . toBe ( "mistral" )
2057+ } )
2058+
2059+ it ( "should return false from isConfigured for Mistral when the API key is missing" , ( ) => {
2060+ mockContextProxy . getGlobalState . mockReturnValue ( {
2061+ codebaseIndexEnabled : true ,
2062+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2063+ codebaseIndexEmbedderProvider : providerIdentifiers . mistral ,
2064+ } )
2065+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2066+
2067+ configManager = new CodeIndexConfigManager ( mockContextProxy )
2068+ expect ( configManager . isConfigured ( ) ) . toBe ( false )
2069+ } )
2070+
2071+ it ( "should load Vercel AI Gateway provider configuration and mark it configured" , async ( ) => {
2072+ mockContextProxy . getGlobalState . mockReturnValue ( {
2073+ codebaseIndexEnabled : true ,
2074+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2075+ codebaseIndexEmbedderProvider : providerIdentifiers . vercelAiGateway ,
2076+ } )
2077+ mockContextProxy . getSecret . mockImplementation ( ( key : string ) => {
2078+ if ( key === "codebaseIndexVercelAiGatewayApiKey" ) return "test-vercel-key"
2079+ return undefined
2080+ } )
2081+
2082+ const result = await configManager . loadConfiguration ( )
2083+
2084+ expect ( result . currentConfig . embedderProvider ) . toBe ( providerIdentifiers . vercelAiGateway )
2085+ expect ( result . currentConfig . vercelAiGatewayOptions ) . toEqual ( { apiKey : "test-vercel-key" } )
2086+ expect ( result . currentConfig . isConfigured ) . toBe ( true )
2087+ expect ( configManager . currentEmbedderProvider ) . toBe ( "vercel-ai-gateway" )
2088+ } )
2089+
2090+ it ( "should return false from isConfigured for Vercel AI Gateway when the API key is missing" , ( ) => {
2091+ mockContextProxy . getGlobalState . mockReturnValue ( {
2092+ codebaseIndexEnabled : true ,
2093+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2094+ codebaseIndexEmbedderProvider : providerIdentifiers . vercelAiGateway ,
2095+ } )
2096+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2097+
2098+ configManager = new CodeIndexConfigManager ( mockContextProxy )
2099+ expect ( configManager . isConfigured ( ) ) . toBe ( false )
2100+ } )
2101+
2102+ it ( "should load Bedrock provider configuration with region and profile and mark it configured" , async ( ) => {
2103+ mockContextProxy . getGlobalState . mockReturnValue ( {
2104+ codebaseIndexEnabled : true ,
2105+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2106+ codebaseIndexEmbedderProvider : providerIdentifiers . bedrock ,
2107+ codebaseIndexBedrockRegion : "eu-west-1" ,
2108+ codebaseIndexBedrockProfile : "test-profile" ,
2109+ } )
2110+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2111+
2112+ const result = await configManager . loadConfiguration ( )
2113+
2114+ expect ( result . currentConfig . embedderProvider ) . toBe ( providerIdentifiers . bedrock )
2115+ expect ( result . currentConfig . bedrockOptions ) . toEqual ( { region : "eu-west-1" , profile : "test-profile" } )
2116+ expect ( result . currentConfig . isConfigured ) . toBe ( true )
2117+ expect ( configManager . currentEmbedderProvider ) . toBe ( "bedrock" )
2118+ } )
2119+
2120+ it ( "should default Bedrock region to us-east-1 when no region is configured" , async ( ) => {
2121+ mockContextProxy . getGlobalState . mockReturnValue ( {
2122+ codebaseIndexEnabled : true ,
2123+ codebaseIndexQdrantUrl : "http://qdrant.local" ,
2124+ codebaseIndexEmbedderProvider : providerIdentifiers . bedrock ,
2125+ } )
2126+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2127+
2128+ const result = await configManager . loadConfiguration ( )
2129+
2130+ expect ( result . currentConfig . bedrockOptions ) . toEqual ( { region : "us-east-1" , profile : undefined } )
2131+ expect ( result . currentConfig . isConfigured ) . toBe ( true )
2132+ } )
2133+
2134+ it ( "should return false from isConfigured for Bedrock when the Qdrant URL is missing" , ( ) => {
2135+ mockContextProxy . getGlobalState . mockReturnValue ( {
2136+ codebaseIndexEnabled : true ,
2137+ codebaseIndexEmbedderProvider : providerIdentifiers . bedrock ,
2138+ codebaseIndexBedrockRegion : "us-east-1" ,
2139+ } )
2140+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2141+
2142+ configManager = new CodeIndexConfigManager ( mockContextProxy )
2143+ expect ( configManager . isConfigured ( ) ) . toBe ( false )
2144+ } )
2145+ } )
2146+
2147+ describe ( "isConfigured defensive fallback" , ( ) => {
2148+ it ( "should return false when the provider is not a recognized embedder provider" , ( ) => {
2149+ // The isConfigured() switch lists every EmbedderProvider member explicitly and
2150+ // ends in a defensive `return false` ("Should not happen if embedderProvider is
2151+ // always set correctly"). That fallback is unreachable through the public API
2152+ // because EmbedderProvider is a closed union, so exercise it by forcing the
2153+ // private field to a value outside the union.
2154+ mockContextProxy . getGlobalState . mockReturnValue ( {
2155+ codebaseIndexEnabled : true ,
2156+ } )
2157+ mockContextProxy . getSecret . mockReturnValue ( undefined )
2158+
2159+ configManager = new CodeIndexConfigManager ( mockContextProxy )
2160+ // The private `embedderProvider` field has no public setter; the cast is the
2161+ // only way to reach the defensive branch without changing source logic.
2162+ Object . defineProperty ( configManager , "embedderProvider" , { value : "not-a-provider" } )
2163+ expect ( configManager . isConfigured ( ) ) . toBe ( false )
2164+ } )
2165+ } )
20382166} )
0 commit comments