openai/openai-python

Public

mirrored fromhttps://github.com/openai/openai-pythonAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
codex/remove-scheduled-release-run

Branches

Tags

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

Clone

HTTPS

Download ZIP

tests/test_utils/test_json.py

126lines · modecode

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