|
| 1 | +import sys |
1 | 2 | from typing import List, Tuple, Union |
2 | 3 |
|
3 | 4 | import pytest |
@@ -156,3 +157,61 @@ class SubModel(BaseXmlModel): |
156 | 157 |
|
157 | 158 | class TestModel(BaseXmlModel): |
158 | 159 | field1: Union[int, SubModel] |
| 160 | + |
| 161 | + |
| 162 | +@pytest.mark.skipif(sys.version_info < (3, 10), reason="requires python 3.10 and above") |
| 163 | +def test_union_type(): |
| 164 | + class TestModel(BaseXmlModel, tag='model'): |
| 165 | + text: int | float | str |
| 166 | + |
| 167 | + xml = ''' |
| 168 | + <model>text</model> |
| 169 | + ''' |
| 170 | + |
| 171 | + actual_obj = TestModel.from_xml(xml) |
| 172 | + expected_obj = TestModel(text='text') |
| 173 | + |
| 174 | + assert actual_obj == expected_obj |
| 175 | + |
| 176 | + actual_xml = actual_obj.to_xml() |
| 177 | + assert_xml_equal(actual_xml, xml) |
| 178 | + |
| 179 | + |
| 180 | +@pytest.mark.skipif(sys.version_info < (3, 10), reason="requires python 3.10 and above") |
| 181 | +def test_model_union_type(): |
| 182 | + class SubModel1(BaseXmlModel, tag='model1'): |
| 183 | + attr1: int = attr() |
| 184 | + |
| 185 | + class SubModel2(BaseXmlModel, tag='model2'): |
| 186 | + text: float |
| 187 | + |
| 188 | + class TestModel(BaseXmlModel, tag='model'): |
| 189 | + field1: SubModel1 | SubModel2 = element() |
| 190 | + |
| 191 | + xml = ''' |
| 192 | + <model><model1 attr1="1"></model1></model> |
| 193 | + ''' |
| 194 | + |
| 195 | + actual_obj = TestModel.from_xml(xml) |
| 196 | + expected_obj = TestModel( |
| 197 | + field1=SubModel1(attr1=1), |
| 198 | + ) |
| 199 | + |
| 200 | + assert actual_obj == expected_obj |
| 201 | + |
| 202 | + actual_xml = actual_obj.to_xml() |
| 203 | + assert_xml_equal(actual_xml, xml) |
| 204 | + |
| 205 | + xml = ''' |
| 206 | + <model><model2>inf</model2></model> |
| 207 | + ''' |
| 208 | + |
| 209 | + actual_obj = TestModel.from_xml(xml) |
| 210 | + expected_obj = TestModel( |
| 211 | + field1=SubModel2(text=float('inf')), |
| 212 | + ) |
| 213 | + |
| 214 | + assert actual_obj == expected_obj |
| 215 | + |
| 216 | + actual_xml = actual_obj.to_xml() |
| 217 | + assert_xml_equal(actual_xml, xml) |
0 commit comments