"""Unit tests for the Lambda handler.""" from unittest.mock import patch import pytest from src import app def test_handler_returns_normalized_result_and_s3_url( mock_event: dict, mock_llm_response: dict ) -> None: """Handler loads response from S3, evaluates it, and stores the result.""" with ( patch("src.app.load_from_s3", return_value=mock_llm_response), patch( "src.app.store_result", return_value="s3://bucket/a/b/c/d/x.json" ) as mock_store, ): result = app.handler(mock_event, None) assert result["result_s3_url"] == "s3://bucket/a/b/c/d/x.json" payload = result["result"] assert payload["validationStatus"] == "FAIL" assert payload["releaseId"] == 4537582 assert payload["summary"]["failures"] == 1 assert payload["summary"]["warnings"] == 1 assert payload["summary"]["passed"] == 6 mock_store.assert_called_once_with("73558/95989/4537582/20585", payload) def test_handler_raises_on_missing_output_s3_path() -> None: """Handler raises ValueError when output_s3_path is absent.""" event = {"data": {"llm_response": {"failures": [], "warnings": []}}} with pytest.raises(ValueError, match="output_s3_path"): app.handler(event, None) def test_handler_raises_on_missing_llm_response_s3_path() -> None: """Handler raises ValueError when llm_response_s3_path is absent.""" event = {"data": {"output_s3_path": "a/b/c/d"}} with pytest.raises(ValueError, match="llm_response_s3_path"): app.handler(event, None) def test_handler_raises_on_none_event() -> None: """Handler raises ValueError when event is None.""" with pytest.raises(ValueError, match="output_s3_path"): app.handler(None, None) def test_handler_reraises_storage_exceptions( mock_event: dict, mock_llm_response: dict ) -> None: """Storage failures bubble up to the caller.""" with ( patch("src.app.load_from_s3", return_value=mock_llm_response), patch("src.app.store_result", side_effect=RuntimeError("boom")), ): with pytest.raises(RuntimeError, match="boom"): app.handler(mock_event, None)