mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
16263bafea
* tweaks to None behaviour * prevent sub_fields for Optional fields by default * rewrite None validation * rename whole > each_item on validators * cleanup processing of the Json type * fix schema coverage and cleanup * tweak validate_model * change and docs * fix validators on optional fields * coverage * remove is_none_validator * minor performance improvements to ErrorWrapper * fix coverage * fix PaymentCardNumber * undo schema changes, fix * tweak validators
111 lines
2.4 KiB
Python
Executable File
111 lines
2.4 KiB
Python
Executable File
from dataclasses import asdict, is_dataclass
|
|
from typing import List
|
|
|
|
import pytest
|
|
|
|
from pydantic import ValidationError, validator
|
|
from pydantic.dataclasses import dataclass
|
|
|
|
|
|
def test_simple():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def change_a(cls, v):
|
|
return v + ' changed'
|
|
|
|
assert MyDataclass(a='this is foobar good').a == 'this is foobar good changed'
|
|
|
|
|
|
def test_validate_pre():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: List[int]
|
|
|
|
@validator('a', pre=True)
|
|
def check_a1(cls, v):
|
|
v.append('123')
|
|
return v
|
|
|
|
@validator('a')
|
|
def check_a2(cls, v):
|
|
v.append(456)
|
|
return v
|
|
|
|
assert MyDataclass(a=[1, 2]).a == [1, 2, 123, 456]
|
|
|
|
|
|
def test_validate_multiple():
|
|
# also test TypeError
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
b: str
|
|
|
|
@validator('a', 'b')
|
|
def check_a_and_b(cls, v, field, **kwargs):
|
|
if len(v) < 4:
|
|
raise TypeError(f'{field.alias} is too short')
|
|
return v + 'x'
|
|
|
|
assert asdict(MyDataclass(a='1234', b='5678')) == {'a': '1234x', 'b': '5678x'}
|
|
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
MyDataclass(a='x', b='x')
|
|
assert exc_info.value.errors() == [
|
|
{'loc': ('a',), 'msg': 'a is too short', 'type': 'type_error'},
|
|
{'loc': ('b',), 'msg': 'b is too short', 'type': 'type_error'},
|
|
]
|
|
|
|
|
|
def test_classmethod():
|
|
@dataclass
|
|
class MyDataclass:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def check_a(cls, v):
|
|
assert cls is MyDataclass and is_dataclass(MyDataclass)
|
|
return v
|
|
|
|
m = MyDataclass(a='this is foobar good')
|
|
assert m.a == 'this is foobar good'
|
|
m.check_a('x')
|
|
|
|
|
|
def test_validate_parent():
|
|
@dataclass
|
|
class Parent:
|
|
a: str
|
|
|
|
@validator('a')
|
|
def change_a(cls, v):
|
|
return v + ' changed'
|
|
|
|
@dataclass
|
|
class Child(Parent):
|
|
pass
|
|
|
|
assert Parent(a='this is foobar good').a == 'this is foobar good changed'
|
|
assert Child(a='this is foobar good').a == 'this is foobar good changed'
|
|
|
|
|
|
def test_inheritance_replace():
|
|
@dataclass
|
|
class Parent:
|
|
a: int
|
|
|
|
@validator('a')
|
|
def add_to_a(cls, v):
|
|
return v + 1
|
|
|
|
@dataclass
|
|
class Child(Parent):
|
|
@validator('a')
|
|
def add_to_a(cls, v):
|
|
return v + 5
|
|
|
|
assert Child(a=0).a == 5
|