From b59154d6dc2b0369670e7e062d9ff7c652d3b956 Mon Sep 17 00:00:00 2001 From: Mika Date: Mon, 9 Mar 2026 13:44:30 +0000 Subject: [PATCH] Add artifact.retry_analysis/tests/test_core.py --- artifact.retry_analysis/tests/test_core.py | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 artifact.retry_analysis/tests/test_core.py diff --git a/artifact.retry_analysis/tests/test_core.py b/artifact.retry_analysis/tests/test_core.py new file mode 100644 index 0000000..7f3403f --- /dev/null +++ b/artifact.retry_analysis/tests/test_core.py @@ -0,0 +1,69 @@ +import json +import pytest +from pathlib import Path +from artifact_retry_analysis import core + + +def make_temp_logfile(tmp_path, entries): + file_path = tmp_path / "retry_log.json" + with file_path.open('w', encoding='utf-8') as f: + json.dump(entries, f) + return file_path + + +def test_analyze_retry_data_basic_success(tmp_path): + entries = [ + {"retry_taken": True, "retry_total_overhead_ms": 50.0, "stratum": "pinned", "expires_at_dist_hours": 1.5, "delta_t": 0.1}, + {"retry_taken": True, "retry_total_overhead_ms": 70.0, "stratum": "unpinned", "expires_at_dist_hours": 2.5, "delta_t": 0.2}, + {"retry_taken": False, "retry_total_overhead_ms": 0.0, "stratum": "pinned", "expires_at_dist_hours": 1.0, "delta_t": 0.0} + ] + log_file = make_temp_logfile(tmp_path, entries) + + report = core.analyze_retry_data(str(log_file)) + assert isinstance(report, core.RetryAnalysisReport) + assert report.total_retries == 2 + assert 0.0 <= report.success_rate <= 100.0 + assert 0.0 <= report.failure_rate <= 100.0 + json_out = json.loads(report.to_json()) + assert set(json_out.keys()) == {"total_retries", "success_rate", "failure_rate", "details"} + + +def test_analyze_retry_data_empty_file(tmp_path): + log_file = make_temp_logfile(tmp_path, []) + report = core.analyze_retry_data(str(log_file)) + assert report.total_retries == 0 + assert report.success_rate == 0.0 + assert report.failure_rate == 0.0 + + +def test_analyze_retry_data_invalid_json(tmp_path): + bad_file = tmp_path / "bad.json" + bad_file.write_text('{invalid json}', encoding='utf-8') + with pytest.raises((json.JSONDecodeError, ValueError)): + _ = core.analyze_retry_data(str(bad_file)) + + +def test_report_to_json_roundtrip(): + report = core.RetryAnalysisReport( + total_retries=10, + success_rate=80.0, + failure_rate=20.0, + details="All systems stable" + ) + json_str = report.to_json() + data = json.loads(json_str) + assert data['total_retries'] == 10 + assert abs(data['success_rate'] - 80.0) < 1e-6 + assert 'details' in data + + +def test_edge_case_failure_rate(tmp_path): + entries = [ + {"retry_taken": True, "retry_total_overhead_ms": 30.0, "stratum": "pinned", "expires_at_dist_hours": 1.5, "delta_t": 0.1}, + {"retry_taken": True, "retry_total_overhead_ms": 25.0, "stratum": "unpinned", "expires_at_dist_hours": 2.0, "delta_t": 0.2}, + {"retry_taken": True, "retry_total_overhead_ms": 40.0, "stratum": "unpinned", "expires_at_dist_hours": 3.0, "delta_t": 0.3} + ] + log_file = make_temp_logfile(tmp_path, entries) + report = core.analyze_retry_data(str(log_file)) + assert isinstance(report.total_retries, int) + assert report.success_rate + report.failure_rate <= 100.0 + 1e-6 \ No newline at end of file