File: test_generics.py

package info (click to toggle)
python-polyfactory 2.22.2-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 1,892 kB
  • sloc: python: 11,338; makefile: 103; sh: 37
file content (91 lines) | stat: -rw-r--r-- 2,096 bytes parent folder | download
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
79
80
81
82
83
84
85
86
87
88
89
90
91
from typing import Generic, List, Optional, TypeVar, Union

from pydantic import BaseModel

from polyfactory.factories.pydantic_factory import ModelFactory

try:
    from pydantic.generics import GenericModel
except ImportError:
    GenericModel = BaseModel


Inner = TypeVar("Inner")
APIResponseData = TypeVar("APIResponseData")


class Attributes(GenericModel, Generic[Inner]):  # type: ignore
    attributes: Inner


class OneInner(BaseModel):
    one: str
    id: Optional[int]
    description: Optional[str]


class OneResponse(BaseModel):
    one: Attributes[OneInner]


class TwoInner(BaseModel):
    two: str
    id: Optional[int]
    description: Optional[str]


class TwoResponse(BaseModel):
    two: Attributes[TwoInner]


class ThreeInner(BaseModel):
    three: str
    relation: int


class ThreeResponse(BaseModel):
    three: Attributes[ThreeInner]


class APIResponse(GenericModel, Generic[APIResponseData]):  # type: ignore
    data: List[APIResponseData]


def test_generic_factory_one_response() -> None:
    class APIResponseFactory(ModelFactory[APIResponse[OneResponse]]):
        __model__ = APIResponse[OneResponse]

    result = APIResponseFactory.build()

    assert result.data
    assert isinstance(result.data[0], OneResponse)


def test_generic_factory_two_response() -> None:
    class APIResponseFactory(ModelFactory):
        __model__ = APIResponse[TwoResponse]

    result = APIResponseFactory.build()

    assert result.data
    assert isinstance(result.data[0], TwoResponse)


def test_generic_factory_three_response() -> None:
    class APIResponseFactory(ModelFactory):
        __model__ = APIResponse[ThreeResponse]

    result = APIResponseFactory.build()

    assert result.data
    assert isinstance(result.data[0], ThreeResponse)


def test_generic_factory_union_response() -> None:
    class APIResponseFactory(ModelFactory):
        __model__ = APIResponse[Union[OneResponse, TwoResponse, ThreeResponse]]

    result = APIResponseFactory.build()

    assert result.data
    assert isinstance(result.data[0], (OneResponse, TwoResponse, ThreeResponse))