Skip to content

Commit c37ecf4

Browse files
rushitatcursoragent
andcommitted
Use parse_obj for Pydantic v1 compatibility in responses types tests
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent c6dc33b commit c37ecf4

1 file changed

Lines changed: 19 additions & 15 deletions

File tree

tests/types/responses/test_response_create_response.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
from __future__ import annotations
44

5+
from typing import Any
6+
7+
from gradient._compat import parse_obj
58
from gradient.types.responses import (
69
ResponseOutputMessage,
710
ResponseCreateResponse,
811
ResponseOutputFunctionCall,
912
)
1013

1114
# Minimal valid response payload (static, no network).
12-
MINIMAL_RESPONSE = {
15+
MINIMAL_RESPONSE: dict[str, Any] = {
1316
"id": "resp_123",
1417
"output": [],
1518
"status": "completed",
@@ -21,23 +24,23 @@ class TestResponseCreateResponseParse:
2124
"""Test that ResponseCreateResponse parses minimal and extended JSON."""
2225

2326
def test_parse_minimal_response(self) -> None:
24-
parsed = ResponseCreateResponse.model_validate(MINIMAL_RESPONSE)
27+
parsed = parse_obj(ResponseCreateResponse, MINIMAL_RESPONSE)
2528
assert parsed.id == "resp_123"
2629
assert parsed.output == []
2730
assert parsed.status == "completed"
2831
assert parsed.model == "openai-gpt-5.2-pro"
2932
assert parsed.output_text == ""
3033

3134
def test_parse_response_with_usage(self) -> None:
32-
payload = {
35+
payload: dict[str, Any] = {
3336
**MINIMAL_RESPONSE,
3437
"usage": {
3538
"prompt_tokens": 10,
3639
"completion_tokens": 5,
3740
"total_tokens": 15,
3841
},
3942
}
40-
parsed = ResponseCreateResponse.model_validate(payload)
43+
parsed = parse_obj(ResponseCreateResponse, payload)
4144
assert parsed.usage is not None
4245
assert parsed.usage.prompt_tokens == 10
4346
assert parsed.usage.completion_tokens == 5
@@ -48,18 +51,18 @@ class TestResponseCreateResponseOutputText:
4851
"""Test that output_text aggregates text from message items in output."""
4952

5053
def test_output_text_aggregates_content(self) -> None:
51-
payload = {
54+
payload: dict[str, Any] = {
5255
**MINIMAL_RESPONSE,
5356
"output": [
5457
{"type": "message", "role": "assistant", "content": "Hello "},
5558
{"type": "message", "role": "assistant", "content": "world."},
5659
],
5760
}
58-
parsed = ResponseCreateResponse.model_validate(payload)
61+
parsed = parse_obj(ResponseCreateResponse, payload)
5962
assert parsed.output_text == "Hello world."
6063

6164
def test_output_text_prefers_output_text_field(self) -> None:
62-
payload = {
65+
payload: dict[str, Any] = {
6366
**MINIMAL_RESPONSE,
6467
"output": [
6568
{
@@ -70,11 +73,11 @@ def test_output_text_prefers_output_text_field(self) -> None:
7073
},
7174
],
7275
}
73-
parsed = ResponseCreateResponse.model_validate(payload)
76+
parsed = parse_obj(ResponseCreateResponse, payload)
7477
assert parsed.output_text == "aggregated"
7578

7679
def test_output_text_skips_function_call_items(self) -> None:
77-
payload = {
80+
payload: dict[str, Any] = {
7881
**MINIMAL_RESPONSE,
7982
"output": [
8083
{"type": "message", "role": "assistant", "content": "Here is "},
@@ -87,38 +90,39 @@ def test_output_text_skips_function_call_items(self) -> None:
8790
{"type": "message", "role": "assistant", "content": "the result."},
8891
],
8992
}
90-
parsed = ResponseCreateResponse.model_validate(payload)
93+
parsed = parse_obj(ResponseCreateResponse, payload)
9194
assert parsed.output_text == "Here is the result."
9295

9396
def test_output_text_empty_message_content_treated_as_empty(self) -> None:
94-
payload = {
97+
payload: dict[str, Any] = {
9598
**MINIMAL_RESPONSE,
9699
"output": [
97100
{"type": "message", "role": "assistant", "content": None},
98101
{"type": "message", "role": "assistant", "output_text": "only this"},
99102
],
100103
}
101-
parsed = ResponseCreateResponse.model_validate(payload)
104+
parsed = parse_obj(ResponseCreateResponse, payload)
102105
assert parsed.output_text == "only this"
103106

104107

105108
class TestResponseOutputItemTypes:
106109
"""Test that output item types parse correctly."""
107110

108111
def test_message_item_parses(self) -> None:
109-
msg = ResponseOutputMessage.model_validate({"type": "message", "role": "assistant", "content": "Hi"})
112+
msg = parse_obj(ResponseOutputMessage, {"type": "message", "role": "assistant", "content": "Hi"})
110113
assert msg.type == "message"
111114
assert msg.role == "assistant"
112115
assert msg.content == "Hi"
113116

114117
def test_function_call_item_parses(self) -> None:
115-
fc = ResponseOutputFunctionCall.model_validate(
118+
fc = parse_obj(
119+
ResponseOutputFunctionCall,
116120
{
117121
"type": "function_call",
118122
"id": "call_1",
119123
"name": "foo",
120124
"arguments": '{"x": 1}',
121-
}
125+
},
122126
)
123127
assert fc.type == "function_call"
124128
assert fc.id == "call_1"

0 commit comments

Comments
 (0)