1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
from dataclasses import dataclass
import pytest
from pydantic import BaseModel
from polyfactory import ConfigurationException
from polyfactory.factories import DataclassFactory
from polyfactory.factories.pydantic_factory import ModelFactory
from polyfactory.field_meta import Null
def test_factory_raises_config_error_for_unsupported_model_with_supported_factory() -> None:
@dataclass
class DataclassModel:
id: int
with pytest.raises(ConfigurationException):
class MyFactory1(ModelFactory):
__model__ = DataclassModel
class MyFactory2(DataclassFactory):
__model__ = DataclassModel
def test_factory_raises_config_error_for_unsupported_model() -> None:
with pytest.raises(ConfigurationException, match="Model type Null is not supported"):
class MyFactory(ModelFactory):
__model__ = Null
def test_inherit_concrete_factory() -> None:
class Parent(BaseModel):
name: str
class Child(Parent):
n: int
class ParentFactory(ModelFactory):
__model__ = Parent
@classmethod
def name(cls) -> str:
return cls.__model__.__name__
class ChildFactory(ParentFactory):
__model__ = Child # type: ignore[assignment]
assert ParentFactory.build().name == "Parent"
assert ChildFactory.build().name == "Child"
def test_inherit_base_factory() -> None:
class Parent(BaseModel):
name: str
class Child(Parent):
n: int
class ParentFactory(ModelFactory):
__is_base_factory__ = True
@classmethod
def name(cls) -> str:
return cls.__model__.__name__
class ChildFactory(ParentFactory):
__model__ = Child
exc_info = pytest.raises(AttributeError, ParentFactory.build)
assert "'ParentFactory' has no attribute '__model__'" in str(exc_info.value)
assert ChildFactory.build().name == "Child"
# remove the ParentFactory from _base_factories to prevent side effects in other tests
# see https://github.com/litestar-org/polyfactory/issues/198
ModelFactory._base_factories.remove(ParentFactory)
|