Skip to content

Commit 1e69121

Browse files
committed
Adds test
1 parent c60d65c commit 1e69121

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

tests/serializers/test_literal.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
from dataclasses import dataclass
2+
from enum import Enum
3+
from typing import Literal, Union
4+
15
import pytest
26

37
from pydantic_core import SchemaError, SchemaSerializer, core_schema
@@ -71,3 +75,75 @@ def test_bool_literal():
7175
assert s.to_python(False, mode='json') is False
7276
assert s.to_python(True) is True
7377
assert s.to_json(False) == b'false'
78+
79+
80+
def test_literal_with_enum() -> None:
81+
class SomeEnum(str, Enum):
82+
CAT = 'cat'
83+
DOG = 'dog'
84+
85+
@dataclass
86+
class Dog:
87+
name: str
88+
type: Literal[SomeEnum.DOG] = SomeEnum.DOG
89+
90+
@dataclass
91+
class Cat:
92+
name: str
93+
type: Literal[SomeEnum.CAT] = SomeEnum.CAT
94+
95+
@dataclass
96+
class Yard:
97+
pet: Union[Dog, Cat]
98+
99+
serializer = SchemaSerializer(
100+
core_schema.model_schema(
101+
cls=Yard,
102+
schema=core_schema.model_fields_schema(
103+
fields={
104+
'pet': core_schema.model_field(
105+
schema=core_schema.tagged_union_schema(
106+
choices={
107+
SomeEnum.DOG: core_schema.model_schema(
108+
cls=Dog,
109+
schema=core_schema.model_fields_schema(
110+
fields={
111+
'type': core_schema.model_field(
112+
schema=core_schema.with_default_schema(
113+
schema=core_schema.literal_schema([SomeEnum.DOG]),
114+
default=SomeEnum.DOG,
115+
)
116+
),
117+
'name': core_schema.model_field(schema=core_schema.str_schema()),
118+
},
119+
model_name='Dog',
120+
),
121+
),
122+
SomeEnum.CAT: core_schema.model_schema(
123+
cls=Cat,
124+
schema=core_schema.model_fields_schema(
125+
fields={
126+
'type': core_schema.model_field(
127+
schema=core_schema.with_default_schema(
128+
schema=core_schema.literal_schema([SomeEnum.CAT]),
129+
default=SomeEnum.CAT,
130+
)
131+
),
132+
'name': core_schema.model_field(schema=core_schema.str_schema()),
133+
},
134+
model_name='Cat',
135+
),
136+
),
137+
},
138+
discriminator='type',
139+
strict=False,
140+
from_attributes=True,
141+
)
142+
)
143+
}
144+
),
145+
)
146+
)
147+
148+
yard = Yard(pet=Dog(name='Rex'))
149+
assert serializer.to_python(yard, mode='json') == {'pet': {'type': 'dog', 'name': 'Rex'}}

0 commit comments

Comments
 (0)