|
32 | 32 | import org.opentest4j.AssertionFailedError; |
33 | 33 |
|
34 | 34 | import org.springframework.ai.model.ApiKey; |
| 35 | +import org.springframework.ai.model.NoopApiKey; |
35 | 36 | import org.springframework.ai.model.SimpleApiKey; |
36 | 37 | import org.springframework.http.HttpHeaders; |
37 | 38 | import org.springframework.http.HttpStatus; |
@@ -275,6 +276,70 @@ void testDifferentApiKeyTypes() { |
275 | 276 | assertThat(api2).isNotNull(); |
276 | 277 | } |
277 | 278 |
|
| 279 | + @Test |
| 280 | + void testBuilderCreatesIndependentInstances() { |
| 281 | + MultiValueMap<String, String> sharedHeaders = new LinkedMultiValueMap<>(); |
| 282 | + sharedHeaders.add("X-Shared", "value"); |
| 283 | + |
| 284 | + OpenAiApi.Builder builder = OpenAiApi.builder() |
| 285 | + .apiKey(TEST_API_KEY) |
| 286 | + .baseUrl(TEST_BASE_URL) |
| 287 | + .headers(sharedHeaders); |
| 288 | + |
| 289 | + OpenAiApi api1 = builder.build(); |
| 290 | + |
| 291 | + // Modify the shared headers |
| 292 | + sharedHeaders.add("X-Modified", "new-value"); |
| 293 | + |
| 294 | + OpenAiApi api2 = builder.build(); |
| 295 | + |
| 296 | + // Both APIs should have the modified headers since they share the same reference |
| 297 | + assertThat(api1.getHeaders()).containsKey("X-Modified"); |
| 298 | + assertThat(api2.getHeaders()).containsKey("X-Modified"); |
| 299 | + } |
| 300 | + |
| 301 | + @Test |
| 302 | + void testMutatePreservesResponseErrorHandler() { |
| 303 | + ResponseErrorHandler customHandler = mock(ResponseErrorHandler.class); |
| 304 | + |
| 305 | + OpenAiApi original = OpenAiApi.builder().apiKey(TEST_API_KEY).responseErrorHandler(customHandler).build(); |
| 306 | + |
| 307 | + OpenAiApi mutated = original.mutate().apiKey("new-key").build(); |
| 308 | + |
| 309 | + assertThat(original.getResponseErrorHandler()).isSameAs(customHandler); |
| 310 | + assertThat(mutated.getResponseErrorHandler()).isSameAs(customHandler); |
| 311 | + } |
| 312 | + |
| 313 | + @Test |
| 314 | + void testMutateCreatesIndependentHeaders() { |
| 315 | + MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); |
| 316 | + headers.add("X-Original", "value1"); |
| 317 | + |
| 318 | + OpenAiApi original = OpenAiApi.builder().apiKey(TEST_API_KEY).headers(headers).build(); |
| 319 | + |
| 320 | + MultiValueMap<String, String> newHeaders = new LinkedMultiValueMap<>(); |
| 321 | + newHeaders.add("X-New", "value2"); |
| 322 | + |
| 323 | + OpenAiApi mutated = original.mutate().headers(newHeaders).build(); |
| 324 | + |
| 325 | + // Original headers should be unchanged |
| 326 | + assertThat(original.getHeaders()).containsKey("X-Original"); |
| 327 | + assertThat(original.getHeaders()).doesNotContainKey("X-New"); |
| 328 | + |
| 329 | + // Mutated should have new headers |
| 330 | + assertThat(mutated.getHeaders()).doesNotContainKey("X-Original"); |
| 331 | + assertThat(mutated.getHeaders()).containsKey("X-New"); |
| 332 | + } |
| 333 | + |
| 334 | + @Test |
| 335 | + void testNoopApiKey() { |
| 336 | + OpenAiApi api = OpenAiApi.builder().apiKey(new NoopApiKey()).build(); |
| 337 | + |
| 338 | + assertThat(api).isNotNull(); |
| 339 | + assertThat(api.getApiKey()).isInstanceOf(NoopApiKey.class); |
| 340 | + assertThat(api.getApiKey().getValue()).isEmpty(); |
| 341 | + } |
| 342 | + |
278 | 343 | @Nested |
279 | 344 | class MockRequests { |
280 | 345 |
|
|
0 commit comments