import json from typing import Any from unittest import mock from app.handlers import SendgridWebhooksUnsubHandler from app.models import UnsubRequest def test_unsub_handler_success_v1( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event: dict[str, Any], ) -> None: request = UnsubRequest.model_validate(test_event) result = test_unsub_handler.handle(request, test_event) ows_preference_center_client_mock.unsubscribe.assert_called_once_with( email="sender@example.com", email_type="CAMPAIGN", email_id="test_campaign_id", automated_email_trigger_id=None, ) kafka_producer_mock.produce.assert_called_once() kafka_call_args = kafka_producer_mock.produce.call_args kafka_value = json.loads(kafka_call_args.kwargs["value"]) assert kafka_value["email"] == "sender@example.com" assert kafka_value["email_campaign_id"] == "test_campaign_id" assert kafka_value["email_type"] == "CAMPAIGN" assert kafka_value["email_id"] == "test_campaign_id" assert kafka_value["automated_email_trigger_id"] is None assert "timestamp" in kafka_value assert "recipient_email" in kafka_value s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_unsub_handler_success_v2_campaign( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event_v2_campaign: dict[str, Any], ) -> None: request = UnsubRequest.model_validate(test_event_v2_campaign) result = test_unsub_handler.handle(request, test_event_v2_campaign) ows_preference_center_client_mock.unsubscribe.assert_called_once_with( email="sender@example.com", email_type="CAMPAIGN", email_id="test_email_id", automated_email_trigger_id=None, ) kafka_producer_mock.produce.assert_called_once() kafka_call_args = kafka_producer_mock.produce.call_args kafka_value = json.loads(kafka_call_args.kwargs["value"]) assert kafka_value["email"] == "sender@example.com" assert kafka_value["email_campaign_id"] == "test_email_id" assert kafka_value["email_type"] == "CAMPAIGN" assert kafka_value["email_id"] == "test_email_id" assert kafka_value["automated_email_trigger_id"] is None assert "timestamp" in kafka_value assert "recipient_email" in kafka_value s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_unsub_handler_success_v2_automated( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event_v2_automated: dict[str, Any], ) -> None: request = UnsubRequest.model_validate(test_event_v2_automated) result = test_unsub_handler.handle(request, test_event_v2_automated) ows_preference_center_client_mock.unsubscribe.assert_called_once_with( email="sender@example.com", email_type="AUTOMATED", email_id="test_email_id", automated_email_trigger_id="test_trigger_id", ) kafka_producer_mock.produce.assert_called_once() kafka_call_args = kafka_producer_mock.produce.call_args kafka_value = json.loads(kafka_call_args.kwargs["value"]) assert kafka_value["email"] == "sender@example.com" assert kafka_value["email_campaign_id"] == "test_email_id" assert kafka_value["email_type"] == "AUTOMATED" assert kafka_value["email_id"] == "test_email_id" assert kafka_value["automated_email_trigger_id"] == "test_trigger_id" assert "timestamp" in kafka_value assert "recipient_email" in kafka_value s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_unsub_handler_success_sender_with_display_name( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event_display_name: dict[str, Any], ) -> None: request = UnsubRequest.model_validate(test_event_display_name) result = test_unsub_handler.handle(request, test_event_display_name) ows_preference_center_client_mock.unsubscribe.assert_called_once_with( email="user@example.com", email_type="CAMPAIGN", email_id="test_email_id", automated_email_trigger_id=None, ) kafka_producer_mock.produce.assert_called_once() kafka_call_args = kafka_producer_mock.produce.call_args kafka_value = json.loads(kafka_call_args.kwargs["value"]) assert kafka_value["email"] == "user@example.com" assert kafka_value["email_type"] == "CAMPAIGN" assert kafka_value["email_id"] == "test_email_id" s3_client_mock.put_object.assert_not_called() assert result == {"statusCode": 200} def test_unsub_handler_preference_center_fail( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event: dict[str, Any], ) -> None: ows_preference_center_client_mock.unsubscribe.side_effect = Exception() request = UnsubRequest.model_validate(test_event) result = test_unsub_handler.handle(request, test_event) ows_preference_center_client_mock.unsubscribe.assert_called_once() kafka_producer_mock.produce.assert_not_called() s3_client_mock.put_object.assert_called_once() assert result == {"statusCode": 200} def test_unsub_handler_kafka_producer_fail( test_unsub_handler: SendgridWebhooksUnsubHandler, s3_client_mock: mock.MagicMock, ows_preference_center_client_mock: mock.MagicMock, kafka_producer_mock: mock.MagicMock, test_event: dict[str, Any], ) -> None: kafka_producer_mock.produce.side_effect = Exception() request = UnsubRequest.model_validate(test_event) result = test_unsub_handler.handle(request, test_event) ows_preference_center_client_mock.unsubscribe.assert_called_once() kafka_producer_mock.produce.assert_called_once() s3_client_mock.put_object.assert_called_once() assert result == {"statusCode": 200}