Skip to content

Commit 6eb0bc4

Browse files
test: Split single test into multiple tests for AI data model classes
Co-Authored-By: [email protected] <[email protected]>
1 parent 745db03 commit 6eb0bc4

File tree

1 file changed

+369
-4
lines changed

1 file changed

+369
-4
lines changed

lib/sdk/server-ai/src/test/java/com/launchdarkly/sdk/server/ai/LDAiClientTest.java

Lines changed: 369 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,50 @@
44

55
import com.launchdarkly.sdk.LDValue;
66
import com.launchdarkly.sdk.server.ai.datamodel.AiConfig;
7+
import com.launchdarkly.sdk.server.ai.datamodel.Message;
78
import com.launchdarkly.sdk.server.ai.datamodel.Role;
89

910
import static org.junit.Assert.assertEquals;
11+
import static org.junit.Assert.assertNotNull;
12+
import static org.junit.Assert.assertNull;
13+
import static org.junit.Assert.assertTrue;
14+
import static org.junit.Assert.assertFalse;
15+
16+
import java.util.List;
17+
import java.util.Map;
1018

1119
public class LDAiClientTest {
20+
/**
21+
* Helper method to generate valid JSON with all required fields
22+
* This can be modified for specific test cases
23+
*/
24+
private String getValidBaseJson() {
25+
return "{\n" + //
26+
" \"_ldMeta\": {\n" + //
27+
" \"variationKey\" : \"1234\",\n" + //
28+
" \"enabled\": true,\n" + //
29+
" \"version\": 1\n" + //
30+
" },\n" + //
31+
" \"messages\": [\n" + //
32+
" {\n" + //
33+
" \"content\": \"This is an {{ adjective }} message.\",\n" + //
34+
" \"role\": \"user\"\n" + //
35+
" }\n" + //
36+
" ],\n" + //
37+
" \"model\": {\n" + //
38+
" \"name\": \"my-cool-custom-model\"\n" + //
39+
" },\n" + //
40+
" \"provider\": {\n" + //
41+
" \"name\" : \"provider-name\"\n" + //
42+
" }\n" + //
43+
"}";
44+
}
45+
46+
/**
47+
* Tests that a complete valid JSON is properly converted to an AiConfig object
48+
*/
1249
@Test
13-
public void testParseAiConfig() {
50+
public void testCompleteAiConfig() {
1451
String rawJson = "{\n" + //
1552
" \"_ldMeta\": {\n" + //
1653
" \"variationKey\" : \"1234\",\n" + //
@@ -47,15 +84,343 @@ public void testParseAiConfig() {
4784
"}";
4885

4986
LDValue input = LDValue.parse(rawJson);
50-
5187
LDAiClient client = new LDAiClient(null);
52-
5388
AiConfig result = client.parseAiConfig(input, "Whatever");
5489

5590
assertEquals(Role.USER, result.getMessages().get(0).getRole());
5691
assertEquals("This is the final {{ noun }}.", result.getMessages().get(2).getContent());
5792
assertEquals(Integer.valueOf(1), result.getMeta().getVersion().orElse(0));
5893
assertEquals(LDValue.of(true), result.getModel().getParameters().get("qux"));
5994
assertEquals("provider-name", result.getProvider().getName());
60-
};
95+
assertTrue(result.isEnabled());
96+
}
97+
98+
/**
99+
* Tests that a valid Meta object is correctly parsed
100+
*/
101+
@Test
102+
public void testValidMeta() {
103+
String json = "{\n" + //
104+
" \"_ldMeta\": {\n" + //
105+
" \"variationKey\" : \"key-123\",\n" + //
106+
" \"enabled\": true,\n" + //
107+
" \"version\": 42\n" + //
108+
" },\n" + //
109+
" \"messages\": [{\n" + //
110+
" \"content\": \"content\",\n" + //
111+
" \"role\": \"user\"\n" + //
112+
" }],\n" + //
113+
" \"model\": {\n" + //
114+
" \"name\": \"model-name\"\n" + //
115+
" },\n" + //
116+
" \"provider\": {\n" + //
117+
" \"name\" : \"provider-name\"\n" + //
118+
" }\n" + //
119+
"}";
120+
121+
LDValue input = LDValue.parse(json);
122+
LDAiClient client = new LDAiClient(null);
123+
AiConfig result = client.parseAiConfig(input, "Whatever");
124+
125+
assertNotNull(result.getMeta());
126+
assertEquals("key-123", result.getMeta().getVariationKey());
127+
assertEquals(Integer.valueOf(42), result.getMeta().getVersion().orElse(0));
128+
assertTrue(result.isEnabled());
129+
}
130+
131+
/**
132+
* Tests that invalid Meta with number as variationKey is handled properly
133+
*/
134+
@Test
135+
public void testInvalidMetaNumberAsVariationKey() {
136+
String json = "{\n" + //
137+
" \"_ldMeta\": {\n" + //
138+
" \"variationKey\" : 123,\n" + //
139+
" \"enabled\": true,\n" + //
140+
" \"version\": 1\n" + //
141+
" },\n" + //
142+
" \"messages\": [{\n" + //
143+
" \"content\": \"content\",\n" + //
144+
" \"role\": \"user\"\n" + //
145+
" }],\n" + //
146+
" \"model\": {\n" + //
147+
" \"name\": \"model-name\"\n" + //
148+
" },\n" + //
149+
" \"provider\": {\n" + //
150+
" \"name\" : \"provider-name\"\n" + //
151+
" }\n" + //
152+
"}";
153+
154+
LDValue input = LDValue.parse(json);
155+
LDAiClient client = new LDAiClient(null);
156+
AiConfig result = client.parseAiConfig(input, "Whatever");
157+
158+
assertNull(result.getMeta());
159+
}
160+
161+
/**
162+
* Tests that valid Messages are correctly parsed
163+
*/
164+
@Test
165+
public void testValidMessages() {
166+
String json = "{\n" + //
167+
" \"_ldMeta\": {\n" + //
168+
" \"variationKey\" : \"key-123\",\n" + //
169+
" \"enabled\": true,\n" + //
170+
" \"version\": 1\n" + //
171+
" },\n" + //
172+
" \"messages\": [\n" + //
173+
" {\n" + //
174+
" \"content\": \"User message\",\n" + //
175+
" \"role\": \"user\"\n" + //
176+
" },\n" + //
177+
" {\n" + //
178+
" \"content\": \"System message\",\n" + //
179+
" \"role\": \"system\"\n" + //
180+
" },\n" + //
181+
" {\n" + //
182+
" \"content\": \"Assistant message\",\n" + //
183+
" \"role\": \"assistant\"\n" + //
184+
" }\n" + //
185+
" ],\n" + //
186+
" \"model\": {\n" + //
187+
" \"name\": \"model-name\"\n" + //
188+
" },\n" + //
189+
" \"provider\": {\n" + //
190+
" \"name\" : \"provider-name\"\n" + //
191+
" }\n" + //
192+
"}";
193+
194+
LDValue input = LDValue.parse(json);
195+
LDAiClient client = new LDAiClient(null);
196+
AiConfig result = client.parseAiConfig(input, "Whatever");
197+
198+
assertNotNull(result.getMessages());
199+
assertEquals(3, result.getMessages().size());
200+
201+
assertEquals(Role.USER, result.getMessages().get(0).getRole());
202+
assertEquals("User message", result.getMessages().get(0).getContent());
203+
204+
assertEquals(Role.SYSTEM, result.getMessages().get(1).getRole());
205+
assertEquals("System message", result.getMessages().get(1).getContent());
206+
207+
assertEquals(Role.ASSISTANT, result.getMessages().get(2).getRole());
208+
assertEquals("Assistant message", result.getMessages().get(2).getContent());
209+
}
210+
211+
/**
212+
* Tests that invalid Messages with wrong role type are handled properly
213+
*/
214+
@Test
215+
public void testInvalidMessagesInvalidRole() {
216+
String json = "{\n" + //
217+
" \"_ldMeta\": {\n" + //
218+
" \"variationKey\" : \"key\",\n" + //
219+
" \"enabled\": true,\n" + //
220+
" \"version\": 1\n" + //
221+
" },\n" + //
222+
" \"messages\": [\n" + //
223+
" {\n" + //
224+
" \"content\": \"Invalid role\",\n" + //
225+
" \"role\": \"invalid_role_value\"\n" + //
226+
" }\n" + //
227+
" ],\n" + //
228+
" \"model\": {\n" + //
229+
" \"name\": \"model-name\"\n" + //
230+
" },\n" + //
231+
" \"provider\": {\n" + //
232+
" \"name\" : \"provider-name\"\n" + //
233+
" }\n" + //
234+
"}";
235+
236+
LDValue input = LDValue.parse(json);
237+
LDAiClient client = new LDAiClient(null);
238+
AiConfig result = client.parseAiConfig(input, "Whatever");
239+
240+
assertNotNull(result.getMessages());
241+
assertEquals(1, result.getMessages().size());
242+
assertNull(result.getMessages().get(0).getRole());
243+
}
244+
245+
/**
246+
* Tests that a valid Model object is correctly parsed
247+
*/
248+
@Test
249+
public void testValidModel() {
250+
String json = "{\n" + //
251+
" \"_ldMeta\": {\n" + //
252+
" \"variationKey\" : \"key\",\n" + //
253+
" \"enabled\": true,\n" + //
254+
" \"version\": 1\n" + //
255+
" },\n" + //
256+
" \"messages\": [{\n" + //
257+
" \"content\": \"content\",\n" + //
258+
" \"role\": \"user\"\n" + //
259+
" }],\n" + //
260+
" \"model\": {\n" + //
261+
" \"name\": \"test-model\",\n" + //
262+
" \"parameters\": {\n" + //
263+
" \"string_param\" : \"value\",\n" + //
264+
" \"number_param\" : 42,\n" + //
265+
" \"bool_param\" : true,\n" + //
266+
" \"array_param\" : [1, 2, 3],\n" + //
267+
" \"object_param\" : {\"key\": \"value\"}\n" + //
268+
" },\n" + //
269+
" \"custom\": {\n" + //
270+
" \"custom_key\": \"custom_value\"\n" + //
271+
" }\n" + //
272+
" },\n" + //
273+
" \"provider\": {\n" + //
274+
" \"name\" : \"provider-name\"\n" + //
275+
" }\n" + //
276+
"}";
277+
278+
LDValue input = LDValue.parse(json);
279+
LDAiClient client = new LDAiClient(null);
280+
AiConfig result = client.parseAiConfig(input, "Whatever");
281+
282+
assertNotNull(result.getModel());
283+
assertEquals("test-model", result.getModel().getName());
284+
285+
assertNotNull(result.getModel().getParameters());
286+
assertEquals(5, result.getModel().getParameters().size());
287+
assertEquals(LDValue.of("value"), result.getModel().getParameters().get("string_param"));
288+
assertEquals(LDValue.of(42), result.getModel().getParameters().get("number_param"));
289+
assertEquals(LDValue.of(true), result.getModel().getParameters().get("bool_param"));
290+
291+
assertNotNull(result.getModel().getCustom());
292+
assertEquals(1, result.getModel().getCustom().size());
293+
assertEquals(LDValue.of("custom_value"), result.getModel().getCustom().get("custom_key"));
294+
}
295+
296+
/**
297+
* Tests that invalid Model with name as non-string is handled properly
298+
*/
299+
@Test
300+
public void testInvalidModelNameType() {
301+
String json = "{\n" + //
302+
" \"_ldMeta\": {\n" + //
303+
" \"variationKey\" : \"key\",\n" + //
304+
" \"enabled\": true,\n" + //
305+
" \"version\": 1\n" + //
306+
" },\n" + //
307+
" \"messages\": [{\n" + //
308+
" \"content\": \"content\",\n" + //
309+
" \"role\": \"user\"\n" + //
310+
" }],\n" + //
311+
" \"model\": {\n" + //
312+
" \"name\": 123,\n" + //
313+
" \"parameters\": {}\n" + //
314+
" },\n" + //
315+
" \"provider\": {\n" + //
316+
" \"name\" : \"provider-name\"\n" + //
317+
" }\n" + //
318+
"}";
319+
320+
LDValue input = LDValue.parse(json);
321+
LDAiClient client = new LDAiClient(null);
322+
AiConfig result = client.parseAiConfig(input, "Whatever");
323+
324+
assertNull(result.getModel());
325+
}
326+
327+
/**
328+
* Tests that a valid Provider object is correctly parsed
329+
*/
330+
@Test
331+
public void testValidProvider() {
332+
String json = "{\n" + //
333+
" \"_ldMeta\": {\n" + //
334+
" \"variationKey\" : \"key\",\n" + //
335+
" \"enabled\": true,\n" + //
336+
" \"version\": 1\n" + //
337+
" },\n" + //
338+
" \"messages\": [{\n" + //
339+
" \"content\": \"content\",\n" + //
340+
" \"role\": \"user\"\n" + //
341+
" }],\n" + //
342+
" \"model\": {\n" + //
343+
" \"name\": \"model-name\"\n" + //
344+
" },\n" + //
345+
" \"provider\": {\n" + //
346+
" \"name\" : \"test-provider\"\n" + //
347+
" }\n" + //
348+
"}";
349+
350+
LDValue input = LDValue.parse(json);
351+
LDAiClient client = new LDAiClient(null);
352+
AiConfig result = client.parseAiConfig(input, "Whatever");
353+
354+
assertNotNull(result.getProvider());
355+
assertEquals("test-provider", result.getProvider().getName());
356+
}
357+
358+
/**
359+
* Tests that invalid Provider with name as non-string is handled properly
360+
*/
361+
@Test
362+
public void testInvalidProviderNameType() {
363+
String json = "{\n" + //
364+
" \"_ldMeta\": {\n" + //
365+
" \"variationKey\" : \"key\",\n" + //
366+
" \"enabled\": true,\n" + //
367+
" \"version\": 1\n" + //
368+
" },\n" + //
369+
" \"messages\": [{\n" + //
370+
" \"content\": \"content\",\n" + //
371+
" \"role\": \"user\"\n" + //
372+
" }],\n" + //
373+
" \"model\": {\n" + //
374+
" \"name\": \"model-name\"\n" + //
375+
" },\n" + //
376+
" \"provider\": {\n" + //
377+
" \"name\" : 123\n" + //
378+
" }\n" + //
379+
"}";
380+
381+
LDValue input = LDValue.parse(json);
382+
LDAiClient client = new LDAiClient(null);
383+
AiConfig result = client.parseAiConfig(input, "Whatever");
384+
385+
assertNotNull(result.getProvider());
386+
assertNull(result.getProvider().getName());
387+
}
388+
389+
/**
390+
* Tests that a completely invalid JSON input (not an object) is handled properly
391+
*/
392+
@Test
393+
public void testInvalidJsonNotObject() {
394+
String json = "[]"; // Array instead of object
395+
396+
LDValue input = LDValue.parse(json);
397+
LDAiClient client = new LDAiClient(null);
398+
AiConfig result = client.parseAiConfig(input, "Whatever");
399+
400+
assertFalse(result.isEnabled());
401+
assertNull(result.getMeta());
402+
assertNull(result.getModel());
403+
assertNull(result.getMessages());
404+
}
405+
406+
/**
407+
* Tests that a JSON with missing required properties is handled properly
408+
*/
409+
@Test
410+
public void testMissingRequiredProperties() {
411+
String json = "{\n" + //
412+
" \"_ldMeta\": {\n" + //
413+
" \"enabled\": true\n" + //
414+
" }\n" + //
415+
"}";
416+
417+
LDValue input = LDValue.parse(json);
418+
LDAiClient client = new LDAiClient(null);
419+
AiConfig result = client.parseAiConfig(input, "Whatever");
420+
421+
assertTrue(result.isEnabled()); // enabled is present and true
422+
assertNull(result.getMeta()); // Meta should be null due to missing variationKey
423+
assertNull(result.getModel());
424+
assertNull(result.getMessages());
425+
}
61426
}

0 commit comments

Comments
 (0)