openai/openai-python

Public

mirrored from https://github.com/openai/openai-pythonAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
b5e39d936fb26d3afa9d7cbda20d99b58d4b4fa6

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

tests/test_legacy_response.py

103lines · modecode

1import json
2from typing import Any, Union, cast
3from typing_extensions import Annotated
4
5import httpx
6import pytest
7import pydantic
8
9from openai import OpenAI, BaseModel
10from openai._streaming import Stream
11from openai._base_client import FinalRequestOptions
12from openai._legacy_response import LegacyAPIResponse
13
14
15class PydanticModel(pydantic.BaseModel): ...
16
17
18def test_response_parse_mismatched_basemodel(client: OpenAI) -> None:
19 response = LegacyAPIResponse(
20 raw=httpx.Response(200, content=b"foo"),
21 client=client,
22 stream=False,
23 stream_cls=None,
24 cast_to=str,
25 options=FinalRequestOptions.construct(method="get", url="/foo"),
26 )
27
28 with pytest.raises(
29 TypeError,
30 match="Pydantic models must subclass our base model type, e.g. `from openai import BaseModel`",
31 ):
32 response.parse(to=PydanticModel)
33
34
35def test_response_parse_custom_stream(client: OpenAI) -> None:
36 response = LegacyAPIResponse(
37 raw=httpx.Response(200, content=b"foo"),
38 client=client,
39 stream=True,
40 stream_cls=None,
41 cast_to=str,
42 options=FinalRequestOptions.construct(method="get", url="/foo"),
43 )
44
45 stream = response.parse(to=Stream[int])
46 assert stream._cast_to == int
47
48
49class CustomModel(BaseModel):
50 foo: str
51 bar: int
52
53
54def test_response_parse_custom_model(client: OpenAI) -> None:
55 response = LegacyAPIResponse(
56 raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
57 client=client,
58 stream=False,
59 stream_cls=None,
60 cast_to=str,
61 options=FinalRequestOptions.construct(method="get", url="/foo"),
62 )
63
64 obj = response.parse(to=CustomModel)
65 assert obj.foo == "hello!"
66 assert obj.bar == 2
67
68
69def test_response_parse_annotated_type(client: OpenAI) -> None:
70 response = LegacyAPIResponse(
71 raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
72 client=client,
73 stream=False,
74 stream_cls=None,
75 cast_to=str,
76 options=FinalRequestOptions.construct(method="get", url="/foo"),
77 )
78
79 obj = response.parse(
80 to=cast("type[CustomModel]", Annotated[CustomModel, "random metadata"]),
81 )
82 assert obj.foo == "hello!"
83 assert obj.bar == 2
84
85
86class OtherModel(pydantic.BaseModel):
87 a: str
88
89
90@pytest.mark.parametrize("client", [False], indirect=True) # loose validation
91def test_response_parse_expect_model_union_non_json_content(client: OpenAI) -> None:
92 response = LegacyAPIResponse(
93 raw=httpx.Response(200, content=b"foo", headers={"Content-Type": "application/text"}),
94 client=client,
95 stream=False,
96 stream_cls=None,
97 cast_to=str,
98 options=FinalRequestOptions.construct(method="get", url="/foo"),
99 )
100
101 obj = response.parse(to=cast(Any, Union[CustomModel, OtherModel]))
102 assert isinstance(obj, str)
103 assert obj == "foo"
104