@@ -60,3 +60,101 @@ def test_disambiguate_object_and_non_object(self, ThingA, ModelWithUnion):
60
60
{"thingOrString" : "x" },
61
61
ModelWithUnion (thing_or_string = "x" ),
62
62
)
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