Skip to content

Commit 24d9940

Browse files
test: adding tests for field coverage with tolerance
Signed-off-by: Nilton Junior <ngm.junior@outlook.com>
1 parent d994944 commit 24d9940

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

tests/contrib/scrapy/test_monitors_field_coverage.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,107 @@ def test_monitor_skip_if_no_items_set_false(field_coverage_monitor_suite):
143143
monitor_runner.run(field_coverage_monitor_suite, **data)
144144

145145
assert not monitor_runner.result.wasSuccessful()
146+
147+
148+
def test_monitor_pass_with_tolerance_when_coverage_slightly_below_expected(
149+
field_coverage_monitor_suite,
150+
):
151+
settings = {
152+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
153+
"SPIDERMON_FIELD_COVERAGE_RULES": {
154+
"dict/field": 0.95,
155+
},
156+
"SPIDERMON_FIELD_COVERAGE_TOLERANCE": 0.05,
157+
}
158+
stats = {"spidermon_field_coverage/dict/field": 0.91}
159+
data = make_data_for_monitor(settings=settings, stats=stats)
160+
monitor_runner = data.pop("runner")
161+
monitor_runner.run(field_coverage_monitor_suite, **data)
162+
163+
assert monitor_runner.result.wasSuccessful()
164+
165+
166+
def test_monitor_fail_with_tolerance_when_coverage_too_far_below_expected(
167+
field_coverage_monitor_suite,
168+
):
169+
settings = {
170+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
171+
"SPIDERMON_FIELD_COVERAGE_RULES": {
172+
"dict/field": 0.95,
173+
},
174+
"SPIDERMON_FIELD_COVERAGE_TOLERANCE": 0.05,
175+
}
176+
stats = {"spidermon_field_coverage/dict/field": 0.89}
177+
data = make_data_for_monitor(settings=settings, stats=stats)
178+
monitor_runner = data.pop("runner")
179+
monitor_runner.run(field_coverage_monitor_suite, **data)
180+
181+
assert not monitor_runner.result.wasSuccessful()
182+
183+
184+
def test_monitor_pass_with_tolerance_when_coverage_exactly_at_tolerance_threshold(
185+
field_coverage_monitor_suite,
186+
):
187+
settings = {
188+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
189+
"SPIDERMON_FIELD_COVERAGE_RULES": {
190+
"dict/field": 0.95,
191+
},
192+
"SPIDERMON_FIELD_COVERAGE_TOLERANCE": 0.05,
193+
}
194+
stats = {"spidermon_field_coverage/dict/field": 0.90}
195+
data = make_data_for_monitor(settings=settings, stats=stats)
196+
monitor_runner = data.pop("runner")
197+
monitor_runner.run(field_coverage_monitor_suite, **data)
198+
199+
assert monitor_runner.result.wasSuccessful()
200+
201+
202+
def test_monitor_default_tolerance_is_zero(field_coverage_monitor_suite):
203+
settings = {
204+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
205+
"SPIDERMON_FIELD_COVERAGE_RULES": {
206+
"dict/field": 0.95,
207+
},
208+
# No tolerance setting - should default to 0
209+
}
210+
stats = {"spidermon_field_coverage/dict/field": 0.94}
211+
data = make_data_for_monitor(settings=settings, stats=stats)
212+
monitor_runner = data.pop("runner")
213+
monitor_runner.run(field_coverage_monitor_suite, **data)
214+
215+
assert not monitor_runner.result.wasSuccessful()
216+
217+
218+
def test_monitor_raise_value_error_for_invalid_tolerance_negative(
219+
field_coverage_monitor_suite,
220+
):
221+
settings = {
222+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
223+
"SPIDERMON_FIELD_COVERAGE_RULES": {
224+
"dict/field": 0.8,
225+
},
226+
"SPIDERMON_FIELD_COVERAGE_TOLERANCE": -0.1,
227+
}
228+
stats = {"spidermon_field_coverage/dict/field": 0.8}
229+
data = make_data_for_monitor(settings=settings, stats=stats)
230+
monitor_runner = data.pop("runner")
231+
with pytest.raises(ValueError, match="SPIDERMON_FIELD_COVERAGE_TOLERANCE must be between 0 and 1"):
232+
monitor_runner.run(field_coverage_monitor_suite, **data)
233+
234+
235+
def test_monitor_raise_value_error_for_invalid_tolerance_greater_than_one(
236+
field_coverage_monitor_suite,
237+
):
238+
settings = {
239+
"SPIDERMON_ADD_FIELD_COVERAGE": True,
240+
"SPIDERMON_FIELD_COVERAGE_RULES": {
241+
"dict/field": 0.8,
242+
},
243+
"SPIDERMON_FIELD_COVERAGE_TOLERANCE": 1.1,
244+
}
245+
stats = {"spidermon_field_coverage/dict/field": 0.8}
246+
data = make_data_for_monitor(settings=settings, stats=stats)
247+
monitor_runner = data.pop("runner")
248+
with pytest.raises(ValueError, match="SPIDERMON_FIELD_COVERAGE_TOLERANCE must be between 0 and 1"):
249+
monitor_runner.run(field_coverage_monitor_suite, **data)

0 commit comments

Comments
 (0)