Skip to content

Commit 63ba02a

Browse files
alxkmilayaperumalg
authored andcommitted
Add comprehensive edge case and boundary testing for Google GenAI components
Co-authored-by: Oleksandr Klymenko <[email protected]> Signed-off-by: Oleksandr Klymenko <[email protected]>
1 parent eba2cec commit 63ba02a

File tree

3 files changed

+112
-0
lines changed

3 files changed

+112
-0
lines changed

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,82 @@ public void createRequestWithThinkingBudgetOverride() {
340340
assertThat(request.config().thinkingConfig().get().thinkingBudget().get()).isEqualTo(25000);
341341
}
342342

343+
@Test
344+
public void createRequestWithNullThinkingBudget() {
345+
var client = GoogleGenAiChatModel.builder()
346+
.genAiClient(this.genAiClient)
347+
.defaultOptions(GoogleGenAiChatOptions.builder().model("DEFAULT_MODEL").thinkingBudget(null).build())
348+
.build();
349+
350+
GeminiRequest request = client
351+
.createGeminiRequest(client.buildRequestPrompt(new Prompt("Test message content")));
352+
353+
assertThat(request.contents()).hasSize(1);
354+
assertThat(request.modelName()).isEqualTo("DEFAULT_MODEL");
355+
356+
// Verify thinkingConfig is not present when thinkingBudget is null
357+
assertThat(request.config().thinkingConfig()).isEmpty();
358+
}
359+
360+
@Test
361+
public void createRequestWithZeroThinkingBudget() {
362+
var client = GoogleGenAiChatModel.builder()
363+
.genAiClient(this.genAiClient)
364+
.defaultOptions(GoogleGenAiChatOptions.builder().model("DEFAULT_MODEL").thinkingBudget(0).build())
365+
.build();
366+
367+
GeminiRequest request = client
368+
.createGeminiRequest(client.buildRequestPrompt(new Prompt("Test message content")));
369+
370+
assertThat(request.config().thinkingConfig()).isPresent();
371+
assertThat(request.config().thinkingConfig().get().thinkingBudget()).isPresent();
372+
assertThat(request.config().thinkingConfig().get().thinkingBudget().get()).isEqualTo(0);
373+
}
374+
375+
@Test
376+
public void createRequestWithNoMessages() {
377+
var client = GoogleGenAiChatModel.builder()
378+
.genAiClient(this.genAiClient)
379+
.defaultOptions(GoogleGenAiChatOptions.builder().model("DEFAULT_MODEL").build())
380+
.build();
381+
382+
GeminiRequest request = client.createGeminiRequest(client.buildRequestPrompt(new Prompt(List.of())));
383+
384+
assertThat(request.contents()).isEmpty();
385+
}
386+
387+
@Test
388+
public void createRequestWithOnlySystemMessage() {
389+
var systemMessage = new SystemMessage("System Message Only");
390+
391+
var client = GoogleGenAiChatModel.builder()
392+
.genAiClient(this.genAiClient)
393+
.defaultOptions(GoogleGenAiChatOptions.builder().model("DEFAULT_MODEL").build())
394+
.build();
395+
396+
GeminiRequest request = client
397+
.createGeminiRequest(client.buildRequestPrompt(new Prompt(List.of(systemMessage))));
398+
399+
assertThat(request.config().systemInstruction()).isPresent();
400+
assertThat(request.contents()).isEmpty();
401+
}
402+
403+
@Test
404+
public void createRequestWithLabels() {
405+
var client = GoogleGenAiChatModel.builder()
406+
.genAiClient(this.genAiClient)
407+
.defaultOptions(GoogleGenAiChatOptions.builder()
408+
.model("DEFAULT_MODEL")
409+
.labels(java.util.Map.of("org", "my-org", "env", "test"))
410+
.build())
411+
.build();
412+
413+
GeminiRequest request = client
414+
.createGeminiRequest(client.buildRequestPrompt(new Prompt("Test message content")));
415+
416+
assertThat(request.config().labels()).isPresent();
417+
assertThat(request.config().labels().get()).containsEntry("org", "my-org");
418+
assertThat(request.config().labels().get()).containsEntry("env", "test");
419+
}
420+
343421
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,18 @@ public void testToStringWithLabels() {
153153
assertThat(toString).contains("test-model");
154154
}
155155

156+
@Test
157+
public void testThinkingBudgetWithZeroValue() {
158+
GoogleGenAiChatOptions options = GoogleGenAiChatOptions.builder().thinkingBudget(0).build();
159+
160+
assertThat(options.getThinkingBudget()).isEqualTo(0);
161+
}
162+
163+
@Test
164+
public void testLabelsWithEmptyMap() {
165+
GoogleGenAiChatOptions options = GoogleGenAiChatOptions.builder().labels(Map.of()).build();
166+
167+
assertThat(options.getLabels()).isEmpty();
168+
}
169+
156170
}

models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/schema/JsonSchemaConverterTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@ void convertToOpenApiSchemaShouldThrowOnNullInput() {
5454
.hasMessage("JSON Schema node must not be null");
5555
}
5656

57+
@Test
58+
void fromJsonShouldHandleEmptyObject() {
59+
String json = "{}";
60+
ObjectNode result = JsonSchemaConverter.fromJson(json);
61+
62+
assertThat(result).isNotNull();
63+
assertThat(result.size()).isEqualTo(0);
64+
}
65+
66+
@Test
67+
void fromJsonShouldHandleEmptyString() {
68+
assertThatThrownBy(() -> JsonSchemaConverter.fromJson("")).isInstanceOf(RuntimeException.class)
69+
.hasMessageContaining("Failed to parse JSON");
70+
}
71+
72+
@Test
73+
void fromJsonShouldHandleNullInput() {
74+
assertThatThrownBy(() -> JsonSchemaConverter.fromJson(null)).isInstanceOf(RuntimeException.class);
75+
}
76+
5777
@Nested
5878
class SchemaConversionTests {
5979

0 commit comments

Comments
 (0)