@@ -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