from unittest import mock import pytest from app.adapters.ows_dmp import AudienceShareStatus from app.exceptions import HandlerError from app.handler import ShareAudienceHandler, ShareAudienceRequest from tests.unit.factories import AudienceShareFactory def test_share_audience_update_status_fail( handler: ShareAudienceHandler, ows_dmp_client_mock: mock.MagicMock ) -> None: share = AudienceShareFactory.build() ows_dmp_client_mock.update_audience_share.side_effect = ValueError("error") with pytest.raises(HandlerError) as exc_info: handler.handle( ShareAudienceRequest( bucket="test", key=f"shares/{share.id}/audience.csv", ) ) assert exc_info.value.code == "UPDATE_AUDIENCE_STATUS_ERROR" assert exc_info.value.message == ( f"Failed to update Audience Share `{share.id}` status to `PROCESSING`." ) def test_share_audience_unsupported_platform( handler: ShareAudienceHandler, ows_dmp_client_mock: mock.MagicMock ) -> None: audience_share = AudienceShareFactory.build() audience_share.platform = "UNSUPPORTED" # type: ignore[assignment] ows_dmp_client_mock.update_audience_share.return_value = audience_share with pytest.raises(HandlerError) as exc_info: handler.handle( ShareAudienceRequest( bucket="test", key=f"shares/{audience_share.id}/audience.csv", ) ) assert exc_info.value.code == "UNSUPPORTED_AUDIENCE_PLATFORM" ows_dmp_client_mock.update_audience_share.assert_has_calls( [ mock.call( audience_share.id, status=AudienceShareStatus.FAILED, processed_fans=None, ) ] ) def test_share_audience_download_error( handler: ShareAudienceHandler, ows_dmp_client_mock: mock.MagicMock, s3_client_mock: mock.MagicMock, ) -> None: audience_share = AudienceShareFactory.build() ows_dmp_client_mock.update_audience_share.return_value = audience_share s3_client_mock.download_fileobj.side_effect = Exception("download error") with pytest.raises(HandlerError) as exc_info: handler.handle( ShareAudienceRequest( bucket="test", key=f"shares/{audience_share.id}/{audience_share.id}_audience.csv", ) ) assert exc_info.value.code == "DOWNLOAD_AUDIENCE_FILE_ERROR" ows_dmp_client_mock.update_audience_share.assert_has_calls( [ mock.call( audience_share.id, status=AudienceShareStatus.FAILED, processed_fans=None, ) ] )