from copy import deepcopy from typing import Any from unittest import mock from app.handlers import SendgridEventHandler def test_handler_success_without_spamreport( test_handler: SendgridEventHandler, test_request_success: dict[str, Any], s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, ) -> None: result = test_handler.handle(test_request_success) ows_preference_center_client_mock.unsubscribe_from_all.assert_not_called() s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_handler_success_with_spamreport( test_handler: SendgridEventHandler, test_request_success_with_spamreport: dict[str, Any], s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, ) -> None: result = test_handler.handle(test_request_success_with_spamreport) ows_preference_center_client_mock.unsubscribe_from_all.assert_called_once_with( email="test-report@example.com", origin_id="test_campaign_id", origin_type=None, automated_trigger_id=None, ) s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_handler_validation_error( test_handler: SendgridEventHandler, test_request_validation_fail: dict[str, Any], s3_client_mock: mock.MagicMock, ) -> None: result = test_handler.handle(test_request_validation_fail) s3_client_mock.put_object.assert_called_once() assert result == {"statusCode": 400} def test_handler_auth_error( test_handler: SendgridEventHandler, test_request_success: dict[str, Any], s3_client_mock: mock.MagicMock, ) -> None: test_request_auth_error = deepcopy(test_request_success) test_request_auth_error["headers"]["x-twilio-email-event-webhook-signature"] = ( "wrong_signature" ) result = test_handler.handle(test_request_auth_error) s3_client_mock.put_object.assert_called_once() assert result == {"statusCode": 401} def test_handler_subaccount_fail( test_handler: SendgridEventHandler, test_request_success: dict[str, Any], s3_client_mock: mock.MagicMock, ) -> None: test_request_subaccount_fail = deepcopy(test_request_success) test_request_subaccount_fail["path"] = "wrong_path" result = test_handler.handle(test_request_subaccount_fail) s3_client_mock.put_object.assert_called_once() assert result == {"statusCode": 401}