diff --git a/ci/scripts/publish_test_metrics.py b/ci/scripts/publish_test_metrics.py index 702e4414..6822d4cc 100644 --- a/ci/scripts/publish_test_metrics.py +++ b/ci/scripts/publish_test_metrics.py @@ -422,5 +422,5 @@ def main() -> int: return 0 -if __name__ == "__main__": +if __name__ == "__main__": # pragma: no cover raise SystemExit(main()) diff --git a/services/logging/Jenkinsfile.data-prepper b/services/logging/Jenkinsfile.data-prepper index 88086d21..5af06050 100644 --- a/services/logging/Jenkinsfile.data-prepper +++ b/services/logging/Jenkinsfile.data-prepper @@ -196,6 +196,8 @@ EOF withCredentials([usernamePassword(credentialsId: 'harbor-robot', usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD')]) { sh ''' set -euo pipefail + IMAGE_TAG="${IMAGE_TAG:-2.8.0}" + PUSH_LATEST="${PUSH_LATEST:-true}" if [ -z "${HARBOR_REPO:-}" ] || [ "${HARBOR_REPO}" = "registry.bstein.dev/monitoring/data-prepper" ]; then HARBOR_REPO="registry.bstein.dev/streaming/data-prepper" fi diff --git a/testing/tests/test_publish_test_metrics.py b/testing/tests/test_publish_test_metrics.py index f317eb46..b9863e07 100644 --- a/testing/tests/test_publish_test_metrics.py +++ b/testing/tests/test_publish_test_metrics.py @@ -145,6 +145,55 @@ def test_build_check_statuses_handles_missing_reports(): assert check_statuses["supply_chain"] == "not_applicable" +def test_status_normalization_and_optional_reports(tmp_path: Path): + report_path = tmp_path / "report.json" + report_path.write_text("{bad json", encoding="utf-8") + + assert publish_test_metrics._normalize_result_status(None, default="failed") == "failed" + assert publish_test_metrics._normalize_result_status("n/a") == "not_applicable" + assert publish_test_metrics._normalize_result_status("unexpected", default="ok") == "ok" + + assert publish_test_metrics._load_optional_json(None) == {} + assert publish_test_metrics._load_optional_json(str(tmp_path / "missing.json")) == {} + assert publish_test_metrics._load_optional_json(str(report_path)) == {} + + assert publish_test_metrics._combine_statuses([]) == "not_applicable" + assert publish_test_metrics._combine_statuses(["not_applicable", "not_applicable"]) == "not_applicable" + assert publish_test_metrics._combine_statuses(["unknown"]) == "failed" + + assert publish_test_metrics._infer_supply_chain_status({"compliant": False}, required=True) == "failed" + assert publish_test_metrics._infer_supply_chain_status({"status": None}, required=False) == "not_applicable" + assert publish_test_metrics._infer_supply_chain_status({"status": "not_applicable"}, required=True) == "failed" + + +def test_build_check_statuses_handles_non_dict_results_and_fallbacks(): + check_statuses = publish_test_metrics._build_check_statuses( + summary={ + "results": [ + None, + {"name": "", "status": "ok"}, + {"name": "unit", "status": "warning"}, + {"name": "hygiene", "status": "ok"}, + {"name": "gate", "status": "ok"}, + ] + }, + tests={"tests": 3, "failures": 1, "errors": 0, "skipped": 0}, + workspace_line_coverage_percent=94.0, + source_lines_over_500=0, + sonarqube_report={"status": "ERROR"}, + supply_chain_report={"status": "not_applicable"}, + supply_chain_required=True, + ) + + assert check_statuses["tests"] == "failed" + assert check_statuses["coverage"] == "failed" + assert check_statuses["loc"] == "ok" + assert check_statuses["docs_naming"] == "ok" + assert check_statuses["gate_glue"] == "ok" + assert check_statuses["sonarqube"] == "failed" + assert check_statuses["supply_chain"] == "failed" + + def test_read_text_post_text_and_fetch_existing_counter(monkeypatch): class _FakeResponse: def __init__(self, payload: str, status: int = 200): @@ -257,6 +306,14 @@ def test_post_text_raises_and_counter_handles_bad_metric_lines(monkeypatch): ) == 9.0 ) + assert ( + publish_test_metrics._fetch_existing_counter( + "http://push.invalid", + "platform_quality_gate_runs_total", + {"job": "platform-quality-ci", "suite": "missing-suite", "status": "ok"}, + ) + == 0.0 + ) def test_build_payload_includes_canonical_checks():