Skip to content

Commit 4d86cc1

Browse files
committed
test: additional tests for none field hints
1 parent baf3817 commit 4d86cc1

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

polyfactory/factories/base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,8 @@ def _check_declared_fields_exist_in_model(cls) -> None:
10371037
def process_kwargs(cls, **kwargs: Any) -> dict[str, Any]:
10381038
"""Process the given kwargs and generate values for the factory's model.
10391039
1040-
If you need to deeply customize field values, you'll want to override this method.
1040+
If you need to deeply customize field values, you'll want to override this method. This is where values are
1041+
generated and assigned for the fields on the model.
10411042
10421043
:param kwargs: Any build kwargs.
10431044
@@ -1049,14 +1050,15 @@ def process_kwargs(cls, **kwargs: Any) -> dict[str, Any]:
10491050
for field_meta in cls.get_model_fields():
10501051
field_build_parameters = cls.extract_field_build_parameters(field_meta=field_meta, build_args=kwargs)
10511052
if cls.should_set_field_value(field_meta, **kwargs) and not cls.should_use_default_value(field_meta):
1052-
field_value = getattr(cls, field_meta.name, None)
1053+
has_field_value = hasattr(cls, field_meta.name)
1054+
field_value = has_field_value and getattr(cls, field_meta.name)
10531055

10541056
# NeverNone & AlwaysNone should be treated as a normally-generated field, since this changes logic
10551057
# within get_field_value.
1056-
excluded_field_value = field_value and isinstance(field_value, (NeverNone, AlwaysNone))
1058+
excluded_field_value = has_field_value and isinstance(field_value, (NeverNone, AlwaysNone))
10571059

10581060
# TODO why do we need the BaseFactory check here, only dunder methods which are ignored would trigger this? # noqa: FIX002
1059-
if field_value and not hasattr(BaseFactory, field_meta.name) and not excluded_field_value:
1061+
if has_field_value and not hasattr(BaseFactory, field_meta.name) and not excluded_field_value:
10601062
if isinstance(field_value, Ignore):
10611063
continue
10621064

tests/test_nones.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from pydantic import BaseModel
2+
3+
from polyfactory.factories.pydantic_factory import ModelFactory
4+
from polyfactory.fields import AlwaysNone, NeverNone
5+
6+
7+
def test_never_none() -> None:
8+
class MyModel(BaseModel):
9+
name: str | None
10+
11+
class MyFactory(ModelFactory[MyModel]):
12+
name = NeverNone()
13+
14+
assert MyFactory.build().name is not None
15+
16+
17+
def test_always_none() -> None:
18+
class MyModel(BaseModel):
19+
name: str | None
20+
21+
class MyFactory(ModelFactory[MyModel]):
22+
name = AlwaysNone()
23+
# NOTE `name = None` does not end up
24+
25+
# field is still accessible even though there is
26+
assert MyFactory.build().name is None

0 commit comments

Comments
 (0)