Add dry_run_mode/tests/test_core.py
This commit is contained in:
parent
01a9ae059e
commit
a6390026e9
1 changed files with 57 additions and 0 deletions
57
dry_run_mode/tests/test_core.py
Normal file
57
dry_run_mode/tests/test_core.py
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
import pytest
|
||||||
|
import types
|
||||||
|
|
||||||
|
from dry_run_mode import core
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def sample_drift_report():
|
||||||
|
# Simulated drift report with pinned and unpinned strata
|
||||||
|
return {
|
||||||
|
'strata': [
|
||||||
|
{'stratum': 'pinned_alpha_low', 'alpha': 0.1, 'offset': 0, 'metrics': {'drift': 0.05}},
|
||||||
|
{'stratum': 'pinned_alpha_high', 'alpha': 0.3, 'offset': 0, 'metrics': {'drift': 0.25}},
|
||||||
|
{'stratum': 'unpinned_positive', 'alpha': 0.1, 'offset': 1.0, 'metrics': {'drift': 0.15}},
|
||||||
|
{'stratum': 'missing_metrics', 'alpha': 0.2, 'offset': 0, 'metrics': {}},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_dry_run_evaluation_basic(sample_drift_report):
|
||||||
|
result = core.dry_run_evaluation(sample_drift_report)
|
||||||
|
assert isinstance(result, dict)
|
||||||
|
assert 'results' in result
|
||||||
|
assert isinstance(result['results'], list)
|
||||||
|
|
||||||
|
expected_strata = {s['stratum'] for s in sample_drift_report['strata']}
|
||||||
|
actual_strata = {r['stratum'] for r in result['results']}
|
||||||
|
assert expected_strata == actual_strata
|
||||||
|
|
||||||
|
|
||||||
|
def test_each_result_has_required_fields(sample_drift_report):
|
||||||
|
result = core.dry_run_evaluation(sample_drift_report)
|
||||||
|
for entry in result['results']:
|
||||||
|
assert {'stratum', 'dry_decision', 'reason'} <= set(entry.keys())
|
||||||
|
assert isinstance(entry['stratum'], str)
|
||||||
|
assert isinstance(entry['dry_decision'], str)
|
||||||
|
assert isinstance(entry['reason'], str)
|
||||||
|
|
||||||
|
|
||||||
|
def test_reason_contains_keywords(sample_drift_report):
|
||||||
|
result = core.dry_run_evaluation(sample_drift_report)
|
||||||
|
for entry in result['results']:
|
||||||
|
# Reason should mention threshold or drift or missing data
|
||||||
|
reason = entry['reason'].lower()
|
||||||
|
assert any(k in reason for k in ['threshold', 'drift', 'missing', 'offset'])
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_input_type_raises():
|
||||||
|
with pytest.raises((AssertionError, TypeError, KeyError)):
|
||||||
|
core.dry_run_evaluation('not_a_dict')
|
||||||
|
|
||||||
|
|
||||||
|
def test_handles_empty_report():
|
||||||
|
empty_report = {'strata': []}
|
||||||
|
result = core.dry_run_evaluation(empty_report)
|
||||||
|
assert isinstance(result, dict)
|
||||||
|
assert result['results'] == []
|
||||||
Loading…
Reference in a new issue