|
1 |
| -from typing import List |
| 1 | +from typing import Any, Dict, List |
2 | 2 |
|
| 3 | +import pydantic as pd |
| 4 | +import pytest |
3 | 5 | from helpers import assert_xml_equal
|
4 | 6 |
|
5 |
| -from pydantic_xml import BaseXmlModel, element, xml_field_serializer, xml_field_validator |
| 7 | +from pydantic_xml import BaseXmlModel, attr, element, xml_field_serializer, xml_field_validator |
6 | 8 | from pydantic_xml.element import XmlElementReader, XmlElementWriter
|
7 | 9 |
|
8 | 10 |
|
@@ -54,3 +56,49 @@ def serialize_element(self, element: XmlElementWriter, value: List[int], field_n
|
54 | 56 |
|
55 | 57 | actual_xml = obj.to_xml()
|
56 | 58 | assert_xml_equal(actual_xml, expected_xml)
|
| 59 | + |
| 60 | + |
| 61 | +def test_pydantic_model_validator(): |
| 62 | + class TestModel(BaseXmlModel, tag='model1'): |
| 63 | + text: str |
| 64 | + attr1: str = attr() |
| 65 | + attr2: str = attr() |
| 66 | + |
| 67 | + @pd.model_validator(mode='before') |
| 68 | + def validate_before_attr1(cls, values: Dict[str, Any]) -> Dict[str, Any]: |
| 69 | + if values.get('attr1') != "expected attr value": |
| 70 | + raise ValueError('attr1') |
| 71 | + |
| 72 | + return values |
| 73 | + |
| 74 | + @pd.model_validator(mode='before') |
| 75 | + def validate_before_attr2(cls, values: Dict[str, Any]) -> Dict[str, Any]: |
| 76 | + if values.get('attr2') != "expected attr value": |
| 77 | + raise ValueError('attr2') |
| 78 | + |
| 79 | + return values |
| 80 | + |
| 81 | + @pd.model_validator(mode='after') |
| 82 | + def validate_model(self) -> 'TestModel': |
| 83 | + if self.text != "expected text value": |
| 84 | + raise ValueError('text') |
| 85 | + |
| 86 | + return self |
| 87 | + |
| 88 | + xml = '<model1 attr1="expected attr value" attr2="expected attr value">expected text value</model1>' |
| 89 | + TestModel.from_xml(xml) |
| 90 | + |
| 91 | + xml = '<model1 attr1="unexpected attr value" attr2="expected attr value">expected text value</model1>' |
| 92 | + with pytest.raises(ValueError) as err: |
| 93 | + TestModel.from_xml(xml) |
| 94 | + assert err.value.errors()[0]['ctx']['orig'] == 'Value error, attr1' |
| 95 | + |
| 96 | + xml = '<model1 attr1="expected attr value" attr2="unexpected attr value">expected text value</model1>' |
| 97 | + with pytest.raises(ValueError) as err: |
| 98 | + TestModel.from_xml(xml) |
| 99 | + assert err.value.errors()[0]['ctx']['orig'] == 'Value error, attr2' |
| 100 | + |
| 101 | + xml = '<model1 attr1="expected attr value" attr2="expected attr value">unexpected text value</model1>' |
| 102 | + with pytest.raises(ValueError) as err: |
| 103 | + TestModel.from_xml(xml) |
| 104 | + assert err.value.errors()[0]['ctx']['orig'] == 'Value error, text' |
0 commit comments