|
8 | 8 | import pytest |
9 | 9 | from dirty_equals import IsListOrTuple, IsStr |
10 | 10 |
|
11 | | -from pydantic_core import ArgsKwargs, SchemaValidator, ValidationError, core_schema |
| 11 | +from pydantic_core import ArgsKwargs, SchemaError, SchemaValidator, ValidationError, core_schema |
12 | 12 |
|
13 | 13 | from ..conftest import Err, PyAndJson, assert_gc |
14 | 14 |
|
@@ -1708,3 +1708,88 @@ class Foo: |
1708 | 1708 | assert exc_info.value.errors(include_url=False) == expected.errors |
1709 | 1709 | else: |
1710 | 1710 | assert dataclasses.asdict(v.validate_python(input_value)) == expected |
| 1711 | + |
| 1712 | + |
| 1713 | +@dataclasses.dataclass |
| 1714 | +class BasicDataclass: |
| 1715 | + a: str |
| 1716 | + |
| 1717 | + |
| 1718 | +def test_alias_allow_pop(py_and_json: PyAndJson): |
| 1719 | + schema = core_schema.dataclass_schema( |
| 1720 | + BasicDataclass, |
| 1721 | + core_schema.dataclass_args_schema( |
| 1722 | + 'BasicDataclass', |
| 1723 | + [ |
| 1724 | + core_schema.dataclass_field(name='a', schema=core_schema.str_schema(), validation_alias='FieldA'), |
| 1725 | + ], |
| 1726 | + ), |
| 1727 | + ['a'], |
| 1728 | + config=core_schema.CoreConfig(validate_by_name=True, validate_by_alias=True), |
| 1729 | + ) |
| 1730 | + v = py_and_json(schema) |
| 1731 | + assert v.validate_test({'FieldA': 'hello'}) == BasicDataclass(a='hello') |
| 1732 | + assert v.validate_test({'a': 'hello'}) == BasicDataclass(a='hello') |
| 1733 | + assert v.validate_test( |
| 1734 | + { |
| 1735 | + 'FieldA': 'hello', |
| 1736 | + 'a': 'world', |
| 1737 | + } |
| 1738 | + ) == BasicDataclass(a='hello') |
| 1739 | + with pytest.raises(ValidationError, match=r'FieldA\n +Field required \[type=missing,'): |
| 1740 | + assert v.validate_test({'foobar': 'hello'}) |
| 1741 | + |
| 1742 | + |
| 1743 | +def test_only_validate_by_name(py_and_json) -> None: |
| 1744 | + schema = core_schema.dataclass_schema( |
| 1745 | + BasicDataclass, |
| 1746 | + core_schema.dataclass_args_schema( |
| 1747 | + 'BasicDataclass', |
| 1748 | + [ |
| 1749 | + core_schema.dataclass_field(name='a', schema=core_schema.str_schema(), validation_alias='FieldA'), |
| 1750 | + ], |
| 1751 | + ), |
| 1752 | + ['a'], |
| 1753 | + config=core_schema.CoreConfig(validate_by_name=True, validate_by_alias=False), |
| 1754 | + ) |
| 1755 | + v = py_and_json(schema) |
| 1756 | + assert v.validate_test({'a': 'hello'}) == BasicDataclass(a='hello') |
| 1757 | + with pytest.raises(ValidationError, match=r'a\n +Field required \[type=missing,'): |
| 1758 | + assert v.validate_test({'FieldA': 'hello'}) |
| 1759 | + |
| 1760 | + |
| 1761 | +def test_only_allow_alias(py_and_json) -> None: |
| 1762 | + schema = core_schema.dataclass_schema( |
| 1763 | + BasicDataclass, |
| 1764 | + core_schema.dataclass_args_schema( |
| 1765 | + 'BasicDataclass', |
| 1766 | + [ |
| 1767 | + core_schema.dataclass_field(name='a', schema=core_schema.str_schema(), validation_alias='FieldA'), |
| 1768 | + ], |
| 1769 | + ), |
| 1770 | + ['a'], |
| 1771 | + config=core_schema.CoreConfig(validate_by_name=False, validate_by_alias=True), |
| 1772 | + ) |
| 1773 | + v = py_and_json(schema) |
| 1774 | + assert v.validate_test({'FieldA': 'hello'}) == BasicDataclass(a='hello') |
| 1775 | + with pytest.raises(ValidationError, match=r'FieldA\n +Field required \[type=missing,'): |
| 1776 | + assert v.validate_test({'a': 'hello'}) |
| 1777 | + |
| 1778 | + |
| 1779 | +def test_invalid_config_raises() -> None: |
| 1780 | + with pytest.raises(SchemaError, match='`validate_by_name` and `validate_by_alias` cannot both be set to `False`.'): |
| 1781 | + SchemaValidator( |
| 1782 | + core_schema.dataclass_schema( |
| 1783 | + BasicDataclass, |
| 1784 | + core_schema.dataclass_args_schema( |
| 1785 | + 'BasicDataclass', |
| 1786 | + [ |
| 1787 | + core_schema.dataclass_field( |
| 1788 | + name='a', schema=core_schema.str_schema(), validation_alias='FieldA' |
| 1789 | + ), |
| 1790 | + ], |
| 1791 | + ), |
| 1792 | + ['a'], |
| 1793 | + config=core_schema.CoreConfig(validate_by_name=False, validate_by_alias=False), |
| 1794 | + ) |
| 1795 | + ) |
0 commit comments