Add audit_data_processing/tests/test_core.py

This commit is contained in:
Mika 2026-02-05 13:42:01 +00:00
parent 9c87dd9de4
commit 3a41302cde

View file

@ -0,0 +1,69 @@
import pytest
import pandas as pd
from audit_data_processing import core
@pytest.fixture
def sample_data():
# Beispielhafte Audit-Run-Daten mit warn_rate und unknown_rate
class RunData:
def __init__(self, run_id, warn_rate, unknown_rate, pinned):
self.run_id = run_id
self.warn_rate = warn_rate
self.unknown_rate = unknown_rate
self.pinned = pinned
return [
RunData("r1", 0.1, 0.05, True),
RunData("r2", 0.2, 0.10, False),
RunData("r3", 0.3, 0.15, True),
RunData("r4", 0.4, 0.20, False),
RunData("r5", 0.5, 0.25, True)
]
def test_calculate_percentiles_basic(sample_data):
percentiles = [50, 75, 90, 95]
result = core.calculate_percentiles(sample_data, percentiles)
assert isinstance(result, dict)
assert set(result.keys()) == {"warn_rate", "unknown_rate"}
# Prüfe, dass alle verlangten Prozentile berechnet wurden
for metric in result.values():
for p in percentiles:
assert p in metric
assert isinstance(metric[p], float)
def test_calculate_percentiles_values(sample_data):
# Erwartete Werte via Pandas für Vergleich berechnen
df = pd.DataFrame([
{"warn_rate": d.warn_rate, "unknown_rate": d.unknown_rate}
for d in sample_data
])
percentiles = [50, 75, 90, 95]
expected_warn = {
p: float(df["warn_rate"].quantile(p / 100)) for p in percentiles
}
expected_unknown = {
p: float(df["unknown_rate"].quantile(p / 100)) for p in percentiles
}
result = core.calculate_percentiles(sample_data, percentiles)
for p in percentiles:
assert pytest.approx(result["warn_rate"][p], rel=1e-9) == expected_warn[p]
assert pytest.approx(result["unknown_rate"][p], rel=1e-9) == expected_unknown[p]
def test_calculate_percentiles_empty():
# Fehlerfall: leere Liste sollte leer oder Exception liefern
with pytest.raises((ValueError, ZeroDivisionError, KeyError, IndexError)):
core.calculate_percentiles([], [50])
def test_calculate_percentiles_invalid_input():
# Fehlerfall: Daten ohne erforderliche Attribute
with pytest.raises(Exception):
core.calculate_percentiles([{"warn_rate": 0.1}], [50])