openai/openai-python

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v2.38.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

tests/test_utils/test_json.py

126lines · modeblame

db4d8719stainless-app[bot]4 months ago1from __future__ import annotations
2
3import datetime
4from typing import Union
5
6import pydantic
7
8from openai import _compat
9from openai._utils._json import openapi_dumps
10
11
12class TestOpenapiDumps:
13def test_basic(self) -> None:
14data = {"key": "value", "number": 42}
15json_bytes = openapi_dumps(data)
16assert json_bytes == b'{"key":"value","number":42}'
17
18def test_datetime_serialization(self) -> None:
19dt = datetime.datetime(2023, 1, 1, 12, 0, 0)
20data = {"datetime": dt}
21json_bytes = openapi_dumps(data)
22assert json_bytes == b'{"datetime":"2023-01-01T12:00:00"}'
23
24def test_pydantic_model_serialization(self) -> None:
25class User(pydantic.BaseModel):
26first_name: str
27last_name: str
28age: int
29
30model_instance = User(first_name="John", last_name="Kramer", age=83)
31data = {"model": model_instance}
32json_bytes = openapi_dumps(data)
33assert json_bytes == b'{"model":{"first_name":"John","last_name":"Kramer","age":83}}'
34
35def test_pydantic_model_with_default_values(self) -> None:
36class User(pydantic.BaseModel):
37name: str
38role: str = "user"
39active: bool = True
40score: int = 0
41
42model_instance = User(name="Alice")
43data = {"model": model_instance}
44json_bytes = openapi_dumps(data)
45assert json_bytes == b'{"model":{"name":"Alice"}}'
46
47def test_pydantic_model_with_default_values_overridden(self) -> None:
48class User(pydantic.BaseModel):
49name: str
50role: str = "user"
51active: bool = True
52
53model_instance = User(name="Bob", role="admin", active=False)
54data = {"model": model_instance}
55json_bytes = openapi_dumps(data)
56assert json_bytes == b'{"model":{"name":"Bob","role":"admin","active":false}}'
57
58def test_pydantic_model_with_alias(self) -> None:
59class User(pydantic.BaseModel):
60first_name: str = pydantic.Field(alias="firstName")
61last_name: str = pydantic.Field(alias="lastName")
62
63model_instance = User(firstName="John", lastName="Doe")
64data = {"model": model_instance}
65json_bytes = openapi_dumps(data)
66assert json_bytes == b'{"model":{"firstName":"John","lastName":"Doe"}}'
67
68def test_pydantic_model_with_alias_and_default(self) -> None:
69class User(pydantic.BaseModel):
70user_name: str = pydantic.Field(alias="userName")
71user_role: str = pydantic.Field(default="member", alias="userRole")
72is_active: bool = pydantic.Field(default=True, alias="isActive")
73
74model_instance = User(userName="charlie")
75data = {"model": model_instance}
76json_bytes = openapi_dumps(data)
77assert json_bytes == b'{"model":{"userName":"charlie"}}'
78
79model_with_overrides = User(userName="diana", userRole="admin", isActive=False)
80data = {"model": model_with_overrides}
81json_bytes = openapi_dumps(data)
82assert json_bytes == b'{"model":{"userName":"diana","userRole":"admin","isActive":false}}'
83
84def test_pydantic_model_with_nested_models_and_defaults(self) -> None:
85class Address(pydantic.BaseModel):
86street: str
87city: str = "Unknown"
88
89class User(pydantic.BaseModel):
90name: str
91address: Address
92verified: bool = False
93
94if _compat.PYDANTIC_V1:
95# to handle forward references in Pydantic v1
96User.update_forward_refs(**locals()) # type: ignore[reportDeprecated]
97
98address = Address(street="123 Main St")
99user = User(name="Diana", address=address)
100data = {"user": user}
101json_bytes = openapi_dumps(data)
102assert json_bytes == b'{"user":{"name":"Diana","address":{"street":"123 Main St"}}}'
103
104address_with_city = Address(street="456 Oak Ave", city="Boston")
105user_verified = User(name="Eve", address=address_with_city, verified=True)
106data = {"user": user_verified}
107json_bytes = openapi_dumps(data)
108assert (
109json_bytes == b'{"user":{"name":"Eve","address":{"street":"456 Oak Ave","city":"Boston"},"verified":true}}'
110)
111
112def test_pydantic_model_with_optional_fields(self) -> None:
113class User(pydantic.BaseModel):
114name: str
115email: Union[str, None]
116phone: Union[str, None]
117
118model_with_none = User(name="Eve", email=None, phone=None)
119data = {"model": model_with_none}
120json_bytes = openapi_dumps(data)
121assert json_bytes == b'{"model":{"name":"Eve","email":null,"phone":null}}'
122
123model_with_values = User(name="Frank", email="frank@example.com", phone=None)
124data = {"model": model_with_values}
125json_bytes = openapi_dumps(data)
126assert json_bytes == b'{"model":{"name":"Frank","email":"frank@example.com","phone":null}}'