From 98642f49e4a13628e4c60177e8987fd38d91cca5 Mon Sep 17 00:00:00 2001 From: Mika Date: Thu, 5 Mar 2026 15:48:02 +0000 Subject: [PATCH] Add data_analysis/tests/test_core.py --- data_analysis/tests/test_core.py | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 data_analysis/tests/test_core.py diff --git a/data_analysis/tests/test_core.py b/data_analysis/tests/test_core.py new file mode 100644 index 0000000..05c7d7d --- /dev/null +++ b/data_analysis/tests/test_core.py @@ -0,0 +1,54 @@ +import pytest +from data_analysis import core + + +def test_analyze_data_nominal_case(): + data = [ + {"context": "near_expiry", "pinned_status": "unpinned", "delta_t": -0.5, "warn": True}, + {"context": "near_expiry", "pinned_status": "unpinned", "delta_t": 1.0, "warn": False}, + {"context": "fresh", "pinned_status": "unpinned", "delta_t": 0.5, "warn": False}, + {"context": "fresh", "pinned_status": "pinned", "delta_t": -0.2, "warn": True}, + ] + result = core.analyze_data(data) + assert isinstance(result, dict) + assert set(result.keys()) == {"near_expiry_count", "fresh_count", "warn_rate"} + assert result["near_expiry_count"] == 2 + assert result["fresh_count"] == 1 + total_records = len(data) + expected_warn_rate = 2 / total_records + assert pytest.approx(result["warn_rate"], rel=1e-3) == expected_warn_rate + + +def test_analyze_data_empty_input(): + result = core.analyze_data([]) + assert isinstance(result, dict) + assert result["near_expiry_count"] == 0 + assert result["fresh_count"] == 0 + assert result["warn_rate"] == 0.0 + + +def test_analyze_data_invalid_structure(): + bad_data = [{"context": "near_expiry", "delta_t": -1.0}] # missing keys + with pytest.raises((KeyError, ValueError, TypeError)): + core.analyze_data(bad_data) + + +def test_analyze_data_delta_t_negative_detection(): + data = [ + {"context": "near_expiry", "pinned_status": "unpinned", "delta_t": -0.3, "warn": False}, + {"context": "fresh", "pinned_status": "unpinned", "delta_t": -0.5, "warn": True}, + ] + result = core.analyze_data(data) + # both are unpinned, so should register counts + assert result["near_expiry_count"] == 1 + assert result["fresh_count"] == 1 + expected_warn_rate = 1 / 2 + assert pytest.approx(result["warn_rate"], rel=1e-3) == expected_warn_rate + + +def test_analyze_data_type_validation(): + data = [ + {"context": "fresh", "pinned_status": "unpinned", "delta_t": "NaN", "warn": True} + ] + with pytest.raises((TypeError, ValueError)): + core.analyze_data(data)