litestar-org / polyfactory

Simple and powerful factories for mock data generation
https://polyfactory.litestar.dev/
MIT License
1k stars 78 forks source link

Bug: Strange behavior with self-reference model #583

Open FredrikBakken opened 4 days ago

FredrikBakken commented 4 days ago

Description

Encountering some strange errors with self-referencing models.

In the first case, there seems to be a 50/50 chance for the pytest to work:

from __future__ import annotations
from typing import Optional, Dict

import pydantic as pyd

from polyfactory.factories.pydantic_factory import ModelFactory

class Bar(pyd.BaseModel):
    fields: Dict[str, Foo] = pyd.Field(default_factory=dict)

class Foo(pyd.BaseModel):
    sometimes: Optional[Bar] = pyd.Field(default=None, exclude=True)
    # never: Dict[str, Bar] = pyd.Field(default_factory=dict)

class FooFactory(ModelFactory[Foo]):
    __model__ = Foo

def test_foo():
    foo_instance = FooFactory.build()
    assert isinstance(foo_instance, Foo)

In the second case, the pytest seems to never work:

from __future__ import annotations
from typing import Optional, Dict

import pydantic as pyd

from polyfactory.factories.pydantic_factory import ModelFactory

class Bar(pyd.BaseModel):
    fields: Dict[str, Foo] = pyd.Field(default_factory=dict)

class Foo(pyd.BaseModel):
    # sometimes: Optional[Bar] = pyd.Field(default=None, exclude=True)
    never: Dict[str, Bar] = pyd.Field(default_factory=dict)

class FooFactory(ModelFactory[Foo]):
    __model__ = Foo

def test_foo():
    foo_instance = FooFactory.build()
    assert isinstance(foo_instance, Foo)

Release Version

2.16.2

Platform


[!NOTE]
While we are open for sponsoring on GitHub Sponsors and OpenCollective, we also utilize Polar.sh to engage in pledge-based sponsorship.

Check out all issues funded or available for funding on our Polar.sh dashboard

  • If you would like to see an issue prioritized, make a pledge towards it!
  • We receive the pledge once the issue is completed & verified
  • This, along with engagement in the community, helps us know which features are a priority to our users.

Fund with Polar

adhtruong commented 10 hours ago

Thanks for reporting @FredrikBakken .