Skip to content

Commit b512d51

Browse files
author
Christian Hattemer
committed
Add tests for the create_partial_model(Model, optional=False) case
1 parent 1280bd3 commit b512d51

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

tests/test_optional.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from typing import Any, Union
2+
3+
import pydantic
4+
5+
import pytest
6+
7+
from pydantic_partial import create_partial_model
8+
from pydantic_partial._compat import PYDANTIC_V1, PYDANTIC_V2
9+
10+
11+
if PYDANTIC_V1:
12+
def _field_is_required(
13+
model: Union[type[pydantic.BaseModel], pydantic.BaseModel],
14+
field_name: str,
15+
) -> bool:
16+
"""Check if a field is required on a pydantic V1 model."""
17+
# noinspection PyDeprecation
18+
return model.__fields__[field_name].required
19+
elif PYDANTIC_V2:
20+
def _field_is_required(
21+
model: Union[type[pydantic.BaseModel], pydantic.BaseModel],
22+
field_name: str,
23+
) -> bool:
24+
"""Check if a field is required on a pydantic V2 model."""
25+
return model.model_fields[field_name].is_required()
26+
else:
27+
raise DeprecationWarning("Pydantic has to be in version 1 or 2.")
28+
29+
30+
class Something(pydantic.BaseModel):
31+
name: Union[str, None] = "Joe Doe"
32+
something_else_id: int
33+
34+
35+
PartialSomething = create_partial_model(Something, optional=False)
36+
PartialSomethingOptional = create_partial_model(Something, optional=True)
37+
38+
39+
def _field_get_default(
40+
model: Union[type[pydantic.BaseModel], pydantic.BaseModel],
41+
field_name: str,
42+
) -> tuple[Any, Any]:
43+
"""Return field default info"""
44+
field_info = model.model_fields[field_name]
45+
return field_info.default, field_info.default_factory
46+
47+
48+
def test_fields_not_required():
49+
assert _field_is_required(PartialSomething, "name") is False
50+
assert _field_is_required(PartialSomething, "something_else_id") is False
51+
52+
53+
def test_field_defaults():
54+
assert _field_get_default(PartialSomething, "name") == ("Joe Doe", None)
55+
assert _field_get_default(PartialSomething, "something_else_id") == (None, None)
56+
57+
58+
def test_validate_ok():
59+
# It shouldn't be necessary to check that the right default values end
60+
# up in the models. That should already be done by pydantic's own tests.
61+
# We just check that validation succeeds.
62+
PartialSomething()
63+
PartialSomething(name='Jane Doe')
64+
PartialSomething(name=None)
65+
PartialSomething(something_else_id=42)
66+
PartialSomething(name='Jane Doe', something_else_id=42)
67+
PartialSomething(name=None, something_else_id=42)
68+
69+
70+
def test_validate_fail():
71+
with pytest.raises(pydantic.ValidationError):
72+
PartialSomething(something_else_id=None)
73+
74+
75+
def test_validate_optional():
76+
PartialSomethingOptional(something_else_id=None)

0 commit comments

Comments
 (0)