@@ -167,6 +167,20 @@ def test_type_hints(self, ModelWithUnion, ModelWithRequiredUnion, ModelWithUnion
167167 modelType: {"type": "string"}
168168 name: {"type": "string"}
169169 required: ["modelType"]
170+ Corgi:
171+ type: object
172+ properties:
173+ modelType: {"type": "string"}
174+ dogType: {"type": "string"}
175+ name: {"type": "string"}
176+ required: ["modelType"]
177+ Schnauzer:
178+ type: object
179+ properties:
180+ modelType: {"type": "string"}
181+ dogType: {"type": "string"}
182+ name: {"type": "string"}
183+ required: ["modelType"]
170184 WithDiscriminatedUnion:
171185 type: object
172186 properties:
@@ -178,8 +192,8 @@ def test_type_hints(self, ModelWithUnion, ModelWithRequiredUnion, ModelWithUnion
178192 propertyName: modelType
179193 mapping:
180194 "type1": "#/components/schemas/ModelType1"
181- "type2": "#/components/schemas/ModelType2"
182- "another-value": "#/components/schemas/ModelType2"
195+ "type2": "ModelType2" # exactly equivalent to " #/components/schemas/ModelType2"
196+ "another-value": "#/components/schemas/ModelType2" # deliberately mapped to same type as previous line
183197 WithDiscriminatedUnionImplicitMapping:
184198 type: object
185199 properties:
@@ -189,12 +203,46 @@ def test_type_hints(self, ModelWithUnion, ModelWithRequiredUnion, ModelWithUnion
189203 - $ref: "#/components/schemas/ModelType2"
190204 discriminator:
191205 propertyName: modelType
206+ WithNestedDiscriminatorsSameProperty:
207+ type: object
208+ properties:
209+ unionProp:
210+ oneOf:
211+ - oneOf:
212+ - $ref: "#/components/schemas/ModelType1"
213+ - $ref: "#/components/schemas/ModelType2"
214+ discriminator:
215+ propertyName: modelType
216+ - oneOf:
217+ - $ref: "#/components/schemas/Corgi"
218+ - $ref: "#/components/schemas/Schnauzer"
219+ discriminator:
220+ propertyName: modelType
221+ WithNestedDiscriminatorsDifferentProperty:
222+ type: object
223+ properties:
224+ unionProp:
225+ oneOf:
226+ - oneOf:
227+ - $ref: "#/components/schemas/ModelType1"
228+ - $ref: "#/components/schemas/ModelType2"
229+ discriminator:
230+ propertyName: modelType
231+ - oneOf:
232+ - $ref: "#/components/schemas/Corgi"
233+ - $ref: "#/components/schemas/Schnauzer"
234+ discriminator:
235+ propertyName: dogType
192236""" )
193237@with_generated_code_imports (
194238 ".models.ModelType1" ,
195239 ".models.ModelType2" ,
240+ ".models.Corgi" ,
241+ ".models.Schnauzer" ,
196242 ".models.WithDiscriminatedUnion" ,
197243 ".models.WithDiscriminatedUnionImplicitMapping" ,
244+ ".models.WithNestedDiscriminatorsSameProperty" ,
245+ ".models.WithNestedDiscriminatorsDifferentProperty" ,
198246)
199247class TestDiscriminators :
200248 def test_with_explicit_mapping (self , ModelType1 , ModelType2 , WithDiscriminatedUnion ):
@@ -231,3 +279,27 @@ def test_with_implicit_mapping(self, ModelType1, ModelType2, WithDiscriminatedUn
231279 )
232280 with pytest .raises (TypeError ):
233281 WithDiscriminatedUnionImplicitMapping .from_dict ({"unionProp" : {"modelType" : "unknown-value" }})
282+
283+ def test_nested_with_same_property (self , ModelType1 , Schnauzer , WithNestedDiscriminatorsSameProperty ):
284+ assert_model_decode_encode (
285+ WithNestedDiscriminatorsSameProperty ,
286+ {"unionProp" : {"modelType" : "ModelType1" , "name" : "a" }},
287+ WithNestedDiscriminatorsSameProperty (union_prop = ModelType1 (model_type = "ModelType1" , name = "a" )),
288+ )
289+ assert_model_decode_encode (
290+ WithNestedDiscriminatorsSameProperty ,
291+ {"unionProp" : {"modelType" : "Schnauzer" , "name" : "a" }},
292+ WithNestedDiscriminatorsSameProperty (union_prop = Schnauzer (model_type = "Schnauzer" , name = "a" )),
293+ )
294+
295+ def test_nested_with_different_property (self , ModelType1 , Schnauzer , WithNestedDiscriminatorsDifferentProperty ):
296+ assert_model_decode_encode (
297+ WithNestedDiscriminatorsDifferentProperty ,
298+ {"unionProp" : {"modelType" : "ModelType1" , "name" : "a" }},
299+ WithNestedDiscriminatorsDifferentProperty (union_prop = ModelType1 (model_type = "ModelType1" , name = "a" )),
300+ )
301+ assert_model_decode_encode (
302+ WithNestedDiscriminatorsDifferentProperty ,
303+ {"unionProp" : {"modelType" : "irrelevant" , "dogType" : "Schnauzer" , "name" : "a" }},
304+ WithNestedDiscriminatorsDifferentProperty (union_prop = Schnauzer (model_type = "irrelevant" , dog_type = "Schnauzer" , name = "a" )),
305+ )
0 commit comments