Skip to content

Commit 0629cb2

Browse files
add roundtrip test
1 parent 9e3d1b0 commit 0629cb2

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

tests/Realtime/RealtimeSmokeTests.cs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,75 @@ public void UnknownCommandSerializationWorks()
223223
RealtimeUpdate deserializedUpdate = ModelReaderWriter.Read<RealtimeUpdate>(serializedUnknownCommand);
224224
Assert.That(deserializedUpdate, Is.Not.Null);
225225
}
226+
227+
[Test]
228+
public void ResponseFinishedUpdateCreatedItemsRoundTrip()
229+
{
230+
// Create sample items to include in the response
231+
RealtimeItem userMessageItem = RealtimeItem.CreateUserMessage(["Hello, world!"]);
232+
userMessageItem.Id = "item_123";
233+
234+
RealtimeItem functionCallItem = RealtimeItem.CreateFunctionCall("test_function", "call_456", "{\"param\":\"value\"}");
235+
functionCallItem.Id = "item_456";
236+
237+
RealtimeItem functionOutputItem = RealtimeItem.CreateFunctionCallOutput("call_456", "Function result");
238+
functionOutputItem.Id = "item_789";
239+
240+
BinaryData serializedResponse = BinaryData.FromString($$"""
241+
{
242+
"type": "response.done",
243+
"event_id": "event_123",
244+
"response": {
245+
"id": "response_abc",
246+
"object": "realtime.response",
247+
"status": "completed",
248+
"status_details": null,
249+
"output": [
250+
{{ModelReaderWriter.Write(userMessageItem)}},
251+
{{ModelReaderWriter.Write(functionCallItem)}},
252+
{{ModelReaderWriter.Write(functionOutputItem)}}
253+
],
254+
"usage": {
255+
"total_tokens": 100,
256+
"input_tokens": 50,
257+
"output_tokens": 50
258+
}
259+
}
260+
}
261+
""");
262+
263+
// Deserialize the response
264+
ResponseFinishedUpdate deserializedUpdate = ModelReaderWriter.Read<ResponseFinishedUpdate>(serializedResponse);
265+
266+
// Validate CreatedItems property
267+
Assert.That(deserializedUpdate, Is.Not.Null);
268+
Assert.That(deserializedUpdate.CreatedItems, Is.Not.Null);
269+
Assert.That(deserializedUpdate.CreatedItems, Has.Count.EqualTo(3));
270+
271+
// Validate first item (user message)
272+
Assert.That(deserializedUpdate.CreatedItems[0].Id, Is.EqualTo("item_123"));
273+
Assert.That(deserializedUpdate.CreatedItems[0].MessageRole, Is.EqualTo(ConversationMessageRole.User));
274+
Assert.That(deserializedUpdate.CreatedItems[0].MessageContentParts, Has.Count.EqualTo(1));
275+
Assert.That(deserializedUpdate.CreatedItems[0].MessageContentParts[0].Text, Is.EqualTo("Hello, world!"));
276+
277+
// Validate second item (function call)
278+
Assert.That(deserializedUpdate.CreatedItems[1].Id, Is.EqualTo("item_456"));
279+
Assert.That(deserializedUpdate.CreatedItems[1].FunctionName, Is.EqualTo("test_function"));
280+
Assert.That(deserializedUpdate.CreatedItems[1].FunctionCallId, Is.EqualTo("call_456"));
281+
Assert.That(deserializedUpdate.CreatedItems[1].FunctionArguments, Is.EqualTo("{\"param\":\"value\"}"));
282+
283+
// Validate third item (function output) - just verify it was deserialized
284+
Assert.That(deserializedUpdate.CreatedItems[2].Id, Is.EqualTo("item_789"));
285+
286+
// Serialize back and validate round-trip
287+
BinaryData reserializedResponse = ModelReaderWriter.Write(deserializedUpdate);
288+
var reserializedString = reserializedResponse.ToString();
289+
Assert.That(reserializedString, Does.Contain(@"""object"":""realtime.response"""));
290+
291+
JsonNode reserializedNode = JsonNode.Parse(reserializedString);
292+
Assert.That(reserializedNode["response"]?["output"]?.AsArray()?.Count, Is.EqualTo(3));
293+
Assert.That(reserializedNode["response"]?["output"]?[0]?["id"]?.GetValue<string>(), Is.EqualTo("item_123"));
294+
Assert.That(reserializedNode["response"]?["output"]?[1]?["id"]?.GetValue<string>(), Is.EqualTo("item_456"));
295+
Assert.That(reserializedNode["response"]?["output"]?[2]?["id"]?.GetValue<string>(), Is.EqualTo("item_789"));
296+
}
226297
}

0 commit comments

Comments
 (0)