@@ -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