Skip to content

Commit 062e494

Browse files
alxkmilayaperumalg
authored andcommitted
test: Add tests for OpenAiApi.Builder mutation and configuration isolation
Signed-off-by: Oleksandr Klymenko <[email protected]> Co-authored-by: Oleksandr Klymenko <[email protected]>
1 parent 673f483 commit 062e494

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/OpenAiApiBuilderTests.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.opentest4j.AssertionFailedError;
3333

3434
import org.springframework.ai.model.ApiKey;
35+
import org.springframework.ai.model.NoopApiKey;
3536
import org.springframework.ai.model.SimpleApiKey;
3637
import org.springframework.http.HttpHeaders;
3738
import org.springframework.http.HttpStatus;
@@ -275,6 +276,70 @@ void testDifferentApiKeyTypes() {
275276
assertThat(api2).isNotNull();
276277
}
277278

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+
278343
@Nested
279344
class MockRequests {
280345

0 commit comments

Comments
 (0)