Skip to content

Commit 53eaf9a

Browse files
authored
test: Add robust null safety and configuration testing for Azure OpenAI embeddings and Google GenAI runtime hints (#4456)
Signed-off-by: Oleksandr Klymenko <alexanderklmn@gmail.com>
1 parent 5d8907f commit 53eaf9a

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureEmbeddingsOptionsTests.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.ai.embedding.EmbeddingRequest;
3131

3232
import static org.assertj.core.api.Assertions.assertThat;
33+
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
3334

3435
/**
3536
* @author Christian Tzolov
@@ -202,4 +203,41 @@ public void shouldValidateInputListIsNotModified() {
202203
assertThat(inputsCopy).isEqualTo(originalInputs);
203204
}
204205

206+
@Test
207+
public void shouldHandleNullInputList() {
208+
var requestOptions = this.client.toEmbeddingOptions(new EmbeddingRequest(null, null));
209+
assertThat(requestOptions.getInput()).isNull();
210+
}
211+
212+
@Test
213+
public void shouldHandleNullEmbeddingRequest() {
214+
assertThatThrownBy(() -> this.client.toEmbeddingOptions(null)).isInstanceOf(NullPointerException.class);
215+
}
216+
217+
@Test
218+
public void shouldHandlePartialOptionsOverride() {
219+
var partialOptions = AzureOpenAiEmbeddingOptions.builder()
220+
.deploymentName("CUSTOM_MODEL")
221+
// user is not set, should use default
222+
.build();
223+
224+
var requestOptions = this.client
225+
.toEmbeddingOptions(new EmbeddingRequest(List.of("Test content"), partialOptions));
226+
227+
assertThat(requestOptions.getModel()).isEqualTo("CUSTOM_MODEL");
228+
assertThat(requestOptions.getUser()).isEqualTo("USER_TEST"); // from default
229+
}
230+
231+
@Test
232+
public void shouldHandleDefaultOptionsOnlyClient() {
233+
var clientWithMinimalDefaults = new AzureOpenAiEmbeddingModel(this.mockClient, MetadataMode.EMBED,
234+
AzureOpenAiEmbeddingOptions.builder().deploymentName("MINIMAL_MODEL").build());
235+
236+
var requestOptions = clientWithMinimalDefaults
237+
.toEmbeddingOptions(new EmbeddingRequest(List.of("Test content"), null));
238+
239+
assertThat(requestOptions.getModel()).isEqualTo("MINIMAL_MODEL");
240+
assertThat(requestOptions.getUser()).isNull();
241+
}
242+
205243
}

models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/aot/GoogleGenAiRuntimeHintsTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,32 @@ void registerHints() {
5454
assertThat(registeredTypes.contains(TypeReference.of(GoogleGenAiChatOptions.class))).isTrue();
5555
}
5656

57+
@Test
58+
void registerHintsWithNullClassLoader() {
59+
RuntimeHints runtimeHints = new RuntimeHints();
60+
GoogleGenAiRuntimeHints googleGenAiRuntimeHints = new GoogleGenAiRuntimeHints();
61+
62+
googleGenAiRuntimeHints.registerHints(runtimeHints, null);
63+
64+
assertThat(runtimeHints.reflection().typeHints().count()).isGreaterThan(0);
65+
}
66+
67+
@Test
68+
void verifyNoProxyHintsAreRegistered() {
69+
RuntimeHints runtimeHints = new RuntimeHints();
70+
GoogleGenAiRuntimeHints googleGenAiRuntimeHints = new GoogleGenAiRuntimeHints();
71+
googleGenAiRuntimeHints.registerHints(runtimeHints, null);
72+
73+
assertThat(runtimeHints.proxies().jdkProxyHints().count()).isEqualTo(0);
74+
}
75+
76+
@Test
77+
void verifyNoSerializationHintsAreRegistered() {
78+
RuntimeHints runtimeHints = new RuntimeHints();
79+
GoogleGenAiRuntimeHints googleGenAiRuntimeHints = new GoogleGenAiRuntimeHints();
80+
googleGenAiRuntimeHints.registerHints(runtimeHints, null);
81+
82+
assertThat(runtimeHints.serialization().javaSerializationHints().count()).isEqualTo(0);
83+
}
84+
5785
}

0 commit comments

Comments
 (0)