Skip to content

Commit c8345ac

Browse files
Allow validators to return ready ValidationResult objects.
1 parent 1530de0 commit c8345ac

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

gladiator/core.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from uuid import uuid4
33
from gettext import NullTranslations
44
from .utils import selector_as_string
5-
from .commons import ValidatorType, Success, Failure, Skip
5+
from .commons import ValidatorType, ValidationResult, Success, Failure, Skip
66

77

88
# logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
@@ -102,6 +102,8 @@ def _parse_primitive_validator_ret(ret_):
102102
return result, msg, msg_ctx
103103

104104
_ret = validator(obj, selector=selector, ctx=ctx)
105+
if isinstance(_ret, ValidationResult):
106+
return _ret
105107
result, msg, msg_ctx = _parse_primitive_validator_ret(_ret)
106108
ret_cls = Success if result is True else Failure
107109
return ret_cls(

tests/test_validation_internals.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from gladiator import validate
2+
from gladiator.commons import Success, Failure, Skip, ValidatorType
3+
4+
5+
# Primitive validation test
6+
7+
def test_positive_result_from_bool_validation_ret_val():
8+
9+
def test_validator(obj, selector, ctx):
10+
return True
11+
12+
result = validate(test_validator, 'obj')
13+
assert isinstance(result, Success)
14+
assert result.error is None
15+
16+
17+
def test_negative_result_from_bool_validation_ret_val():
18+
19+
def test_validator(obj, selector, ctx):
20+
return False
21+
22+
result = validate(test_validator, 'obj')
23+
assert isinstance(result, Failure)
24+
assert result.error == 'None'
25+
26+
27+
def test_negative_result_from_bool_error_validation_ret_val():
28+
29+
def test_validator(obj, selector, ctx):
30+
return False, 'error message'
31+
32+
result = validate(test_validator, 'obj')
33+
assert isinstance(result, Failure)
34+
assert result.error == 'error message'
35+
36+
37+
def test_negative_result_from_bool_error_format_validation_ret_val():
38+
39+
def test_validator(obj, selector, ctx):
40+
return False, 'error {msg}', {'msg': 'message'}
41+
42+
result = validate(test_validator, 'obj')
43+
assert isinstance(result, Failure)
44+
assert result.error == 'error message'
45+
46+
47+
def test_same_result_from_validationresult_ret_val():
48+
49+
for ret_cls in (Success, Failure, Skip):
50+
51+
ret_val = ret_cls(
52+
type_=ValidatorType.primitive,
53+
validator=lambda obj, selector, ctx: True,
54+
obj='obj',
55+
selector='test_selector',
56+
result=ret_cls is Success,
57+
msg='message' if ret_cls is Failure else None,
58+
ctx={})
59+
60+
def test_validator(obj, selector, ctx):
61+
return ret_val
62+
63+
result = validate(test_validator, 'obj')
64+
assert isinstance(result, ret_cls)
65+
assert result is ret_val

0 commit comments

Comments
 (0)