Skip to content

Commit 03c6551

Browse files
committed
add generated code test for discriminators
1 parent 1aa1b51 commit 03c6551

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

end_to_end_tests/generated_code_live_tests/test_unions.py

+98
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,101 @@ def test_disambiguate_object_and_non_object(self, ThingA, ModelWithUnion):
6060
{"thingOrString": "x"},
6161
ModelWithUnion(thing_or_string="x"),
6262
)
63+
64+
65+
@with_generated_client_fixture(
66+
"""
67+
paths: {}
68+
components:
69+
schemas:
70+
ThingA:
71+
type: object
72+
properties:
73+
kind: { type: "string" }
74+
name: { type: "string" }
75+
ThingB:
76+
type: object
77+
properties:
78+
kind: { type: "string" }
79+
name: { type: "string" }
80+
ModelWithDiscriminatorImplicitMapping:
81+
type: object
82+
properties:
83+
thing:
84+
oneOf:
85+
- $ref: "#/components/schemas/ThingA"
86+
- $ref: "#/components/schemas/ThingB"
87+
discriminator:
88+
propertyName: kind
89+
ModelWithDiscriminatorExplicitMapping:
90+
type: object
91+
properties:
92+
thing:
93+
oneOf:
94+
- $ref: "#/components/schemas/ThingA"
95+
- $ref: "#/components/schemas/ThingB"
96+
discriminator:
97+
propertyName: kind
98+
mapping:
99+
A: "#/components/schemas/ThingA"
100+
B: "ThingB"
101+
AlsoB: "ThingB"
102+
ModelWithDiscriminatorPartialMapping:
103+
type: object
104+
properties:
105+
thing:
106+
oneOf:
107+
- $ref: "#/components/schemas/ThingA"
108+
- $ref: "#/components/schemas/ThingB"
109+
discriminator:
110+
propertyName: kind
111+
mapping:
112+
A: "#/components/schemas/ThingA"
113+
# there's no mapping for ThingB here, so the value for it defaults to "ThingB"
114+
""")
115+
@with_generated_code_import(".models.ThingA")
116+
@with_generated_code_import(".models.ThingB")
117+
@with_generated_code_import(".models.ModelWithDiscriminatorImplicitMapping")
118+
@with_generated_code_import(".models.ModelWithDiscriminatorExplicitMapping")
119+
@with_generated_code_import(".models.ModelWithDiscriminatorPartialMapping")
120+
class TestDiscriminator:
121+
def test_implicit_mapping(self, ThingA, ThingB, ModelWithDiscriminatorImplicitMapping):
122+
assert_model_decode_encode(
123+
ModelWithDiscriminatorImplicitMapping,
124+
{"thing": {"kind": "ThingA", "name": "x"}},
125+
ModelWithDiscriminatorImplicitMapping(thing=ThingA(kind="ThingA", name="x")),
126+
)
127+
assert_model_decode_encode(
128+
ModelWithDiscriminatorImplicitMapping,
129+
{"thing": {"kind": "ThingB", "name": "x"}},
130+
ModelWithDiscriminatorImplicitMapping(thing=ThingB(kind="ThingB", name="x")),
131+
)
132+
133+
def test_explicit_mapping(self, ThingA, ThingB, ModelWithDiscriminatorExplicitMapping):
134+
assert_model_decode_encode(
135+
ModelWithDiscriminatorExplicitMapping,
136+
{"thing": {"kind": "A", "name": "x"}},
137+
ModelWithDiscriminatorExplicitMapping(thing=ThingA(kind="A", name="x")),
138+
)
139+
assert_model_decode_encode(
140+
ModelWithDiscriminatorExplicitMapping,
141+
{"thing": {"kind": "B", "name": "x"}},
142+
ModelWithDiscriminatorExplicitMapping(thing=ThingB(kind="B", name="x")),
143+
)
144+
assert_model_decode_encode(
145+
ModelWithDiscriminatorExplicitMapping,
146+
{"thing": {"kind": "AlsoB", "name": "x"}},
147+
ModelWithDiscriminatorExplicitMapping(thing=ThingB(kind="AlsoB", name="x")),
148+
)
149+
150+
def test_partial_mapping(self, ThingA, ThingB, ModelWithDiscriminatorPartialMapping):
151+
assert_model_decode_encode(
152+
ModelWithDiscriminatorPartialMapping,
153+
{"thing": {"kind": "A", "name": "x"}},
154+
ModelWithDiscriminatorPartialMapping(thing=ThingA(kind="A", name="x")),
155+
)
156+
assert_model_decode_encode(
157+
ModelWithDiscriminatorPartialMapping,
158+
{"thing": {"kind": "ThingB", "name": "x"}},
159+
ModelWithDiscriminatorPartialMapping(thing=ThingB(kind="ThingB", name="x")),
160+
)

0 commit comments

Comments
 (0)