import base64 import json import pathlib import uuid from typing import Any from unittest import mock import pytest from anydi import Container from cachelib import BaseCache, SimpleCache from fansifter_common.legal_info.services import LegalInfoService from jinja2 import Environment, FileSystemLoader from app.config import Settings from app.connectors.aws.ses.email_client import EmailClient from app.connectors.ows_preference_center import OwsPreferenceCenterClient from app.handlers import SongwhipFanConsentHandler from app.modules import container as global_container from tests.unit.module import TestModule @pytest.fixture(scope="session") def container() -> Container: global_container.register_module(TestModule) return global_container @pytest.fixture(scope="session") def settings(container: Container) -> Settings: return container.resolve(Settings) @pytest.fixture(scope="session") def ows_preference_center_client_mock() -> mock.MagicMock: return mock.MagicMock(spec=OwsPreferenceCenterClient) @pytest.fixture(scope="session") def legal_info_service() -> LegalInfoService: return LegalInfoService() @pytest.fixture(scope="session") def jinja_env() -> Environment: return Environment( loader=FileSystemLoader(pathlib.Path(__file__).parent / "templates") ) @pytest.fixture(scope="function") def handler( email_client_mock: mock.MagicMock, test_email_title_templates: dict[str, str], preference_center_test_url: str, ows_preference_center_client_mock: mock.MagicMock, legal_info_service: LegalInfoService, cache: BaseCache, jinja_env: Environment, settings: Settings, ) -> SongwhipFanConsentHandler: return SongwhipFanConsentHandler( email_client=email_client_mock, email_title_templates=test_email_title_templates, email_content_wording=settings.email_content_wording, preference_center_url=preference_center_test_url, ows_preference_center_client=ows_preference_center_client_mock, legal_info_service=legal_info_service, cache=cache, jinja=jinja_env, ) @pytest.fixture(scope="session") def test_message() -> dict[str, Any]: return { "email": "test@example.com", "doubleOptInRedirectUrl": "https://example.com", "artistName": "Test Artist", "pagePath": "test_path", "country": "GB", } @pytest.fixture(scope="session") def test_email_title_templates() -> dict[str, str]: return {"en": "Test subscription template {artist_name}"} @pytest.fixture(scope="session") def preference_center_test_url() -> str: return "http://example.com" @pytest.fixture(scope="session") def test_message_id() -> str: return str(uuid.uuid4()) @pytest.fixture(scope="session") def test_event(test_message_id: str, test_message: dict[str, Any]) -> Any: event = { "records": { "topic_0": [ { "key": base64.b64encode(test_message_id.encode()), "value": base64.b64encode(json.dumps(test_message).encode()), } ], } } return event @pytest.fixture(scope="function") def email_client_mock() -> mock.MagicMock: client_mock = mock.MagicMock(spec=EmailClient) return client_mock @pytest.fixture(scope="function") def cache() -> BaseCache: return SimpleCache()