import contextlib import logging.config import os from collections.abc import Iterator from typing import Any from unittest import mock import pytest from aiodynamo.client import Client from anydi import Container from anydi.testing import TestContainer from url_shortener.adapters.aws.s3 import S3Client from url_shortener.adapters.kafka.kafka_client import KafkaClient from url_shortener.config import Settings, settings as _settings from url_shortener.container import container as _container from tests.unit.types import ( OverrideSettings, ) run_with_lint_and_test = os.getenv("RUN_WITH_LINT_AND_TEST") @pytest.fixture(autouse=True) def anyio_backend() -> str: return "asyncio" @pytest.fixture(scope="session") def settings() -> Settings: return _settings @pytest.fixture(scope="session") def kafka_client_mock() -> mock.AsyncMock: return mock.AsyncMock(spec=KafkaClient) @pytest.fixture(autouse=True) def reset_kafka_client_mock(kafka_client_mock: mock.AsyncMock) -> None: kafka_client_mock.reset_mock(return_value=True, side_effect=True) @pytest.fixture(scope="session") def container(kafka_client_mock: mock.AsyncMock) -> Iterator[Container]: _container.register( KafkaClient, lambda: kafka_client_mock, scope="singleton", override=True, ) yield _container @pytest.fixture(scope="function", autouse=True) def dynamodb_client_mock(container: TestContainer) -> Iterator[mock.AsyncMock]: client_mock = mock.AsyncMock(spec=Client) with container.override(Client, client_mock): yield client_mock @pytest.fixture(scope="function", autouse=True) def s3_client_mock(container: TestContainer) -> Iterator[mock.AsyncMock]: client_mock = mock.AsyncMock(spec=S3Client) with container.override(S3Client, client_mock): yield client_mock @pytest.fixture(scope="session", autouse=True) def configure_logging(settings: Settings) -> None: logging.config.dictConfig(settings.logging_config) @pytest.fixture(scope="session") def override_settings(settings: Settings, container: TestContainer) -> OverrideSettings: @contextlib.contextmanager def wrapper(**kwargs: Any) -> Iterator[None]: new_settings = settings.model_copy(update=kwargs) with ( mock.patch("url_shortener.config.settings.__wrapped__", new_settings), container.override(Settings, new_settings), ): yield return wrapper