From 37562d68fd3f00100104bf4ccb3a2fdb2122934a Mon Sep 17 00:00:00 2001 From: Mika Date: Sun, 25 Jan 2026 17:42:37 +0000 Subject: [PATCH] Add gate_decision/tests/test_core.py --- gate_decision/tests/test_core.py | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 gate_decision/tests/test_core.py diff --git a/gate_decision/tests/test_core.py b/gate_decision/tests/test_core.py new file mode 100644 index 0000000..1c9995e --- /dev/null +++ b/gate_decision/tests/test_core.py @@ -0,0 +1,58 @@ +import pytest +import json +from gate_decision import core + +@pytest.fixture +def valid_summary_pass(): + return { + "mischfenster_p95": 0.8, + "retry_free_in_window_rate": 0.99, + "max_value": 1.2 + } + +@pytest.fixture +def valid_summary_fail(): + return { + "mischfenster_p95": 5.0, + "retry_free_in_window_rate": 0.5, + "max_value": 10.0 + } + +@pytest.fixture +def invalid_summary(): + return { + "mischfenster_p95": "invalid", + "retry_free_in_window_rate": 0.9 + } + +def test_make_decision_pass(valid_summary_pass): + result = core.make_decision(valid_summary_pass) + assert isinstance(result, dict) + assert result.get("decision") == "pass" + assert "explanation" in result + + +def test_make_decision_fail(valid_summary_fail): + result = core.make_decision(valid_summary_fail) + assert isinstance(result, dict) + assert result.get("decision") == "fail" + assert "explanation" in result + + +def test_make_decision_invalid_type(invalid_summary): + with pytest.raises((AssertionError, ValueError, TypeError)): + _ = core.make_decision(invalid_summary) + + +def test_deterministic_behavior(valid_summary_pass): + result1 = core.make_decision(valid_summary_pass) + result2 = core.make_decision(valid_summary_pass) + assert result1 == result2 + + +def test_output_is_json_serializable(valid_summary_pass): + result = core.make_decision(valid_summary_pass) + json_str = json.dumps(result) + assert isinstance(json_str, str) + decoded = json.loads(json_str) + assert decoded == result \ No newline at end of file