-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathtest_dpath_validator.py
More file actions
137 lines (106 loc) · 4.47 KB
/
test_dpath_validator.py
File metadata and controls
137 lines (106 loc) · 4.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Copyright (c) 2025 Airbyte, Inc., all rights reserved.
from unittest import TestCase
import pytest
from airbyte_cdk.sources.declarative.validators.dpath_validator import DpathValidator
from airbyte_cdk.sources.declarative.validators.validation_strategy import ValidationStrategy
class MockValidationStrategy(ValidationStrategy):
def __init__(self, should_fail=False, error_message="Validation failed"):
self.should_fail = should_fail
self.error_message = error_message
self.validate_called = False
self.validated_value = None
def validate(self, value):
self.validate_called = True
self.validated_value = value
if self.should_fail:
raise ValueError(self.error_message)
class TestDpathValidator(TestCase):
def test_given_valid_path_and_input_validate_is_successful(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=["user", "profile", "email"],
strategy=strategy,
config={},
condition="",
)
test_data = {"user": {"profile": {"email": "test@example.com", "name": "Test User"}}}
validator.validate(test_data)
assert strategy.validate_called
assert strategy.validated_value
def test_given_invalid_path_when_validate_then_raise_key_error(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=["user", "profile", "phone"],
strategy=strategy,
config={},
condition="",
)
test_data = {"user": {"profile": {"email": "test@example.com"}}}
with pytest.raises(ValueError) as context:
validator.validate(test_data)
assert "Error validating path" in str(context.value)
assert not strategy.validate_called
def test_given_strategy_fails_when_validate_then_raise_value_error(self):
error_message = "Invalid email format"
strategy = MockValidationStrategy(should_fail=True, error_message=error_message)
validator = DpathValidator(
field_path=["user", "email"],
strategy=strategy,
config={},
condition="",
)
test_data = {"user": {"email": "invalid-email"}}
with pytest.raises(ValueError) as context:
validator.validate(test_data)
assert strategy.validate_called
assert strategy.validated_value == "invalid-email"
def test_given_empty_path_list_when_validate_then_validate_raises_exception(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=[],
strategy=strategy,
config={},
condition="",
)
test_data = {"key": "value"}
with pytest.raises(ValueError):
validator.validate(test_data)
def test_given_empty_input_data_when_validate_then_validate_raises_exception(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=["data", "field"],
strategy=strategy,
config={},
condition="",
)
test_data = {}
with pytest.raises(ValueError):
validator.validate(test_data)
def test_path_with_wildcard_when_validate_then_validate_is_successful(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=["users", "*", "email"],
strategy=strategy,
config={},
condition="",
)
test_data = {
"users": {
"user1": {"email": "user1@example.com", "name": "User One"},
"user2": {"email": "user2@example.com", "name": "User Two"},
}
}
validator.validate(test_data)
assert strategy.validate_called
assert strategy.validated_value in ["user1@example.com", "user2@example.com"]
self.assertIn(strategy.validated_value, ["user1@example.com", "user2@example.com"])
def test_given_condition_is_false_when_validate_then_validate_is_not_called(self):
strategy = MockValidationStrategy()
validator = DpathValidator(
field_path=["user", "profile", "email"],
strategy=strategy,
config={"test": "test"},
condition="{{ not config.get('test') }}",
)
validator.validate({"user": {"profile": {"email": "test@example.com"}}})
assert not strategy.validate_called