"""Simple providers overriding example."""

import dataclasses
import unittest.mock

from dependency_injector import containers, providers


class ApiClient:
    ...


class ApiClientStub(ApiClient):
    ...


@dataclasses.dataclass
class Service:
    api_client: ApiClient


class Container(containers.DeclarativeContainer):

    api_client_factory = providers.Factory(ApiClient)

    service_factory = providers.Factory(
        Service,
        api_client=api_client_factory,
    )


if __name__ == '__main__':
    container = Container()

    # 1. Use .override() to replace the API client with stub
    container.api_client_factory.override(providers.Factory(ApiClientStub))
    service1 = container.service_factory()
    assert isinstance(service1.api_client, ApiClientStub)

    # 2. Use .override() as a context manager to mock the API client in testing
    with container.api_client_factory.override(unittest.mock.Mock(ApiClient)):
        service2 = container.service_factory()
        assert isinstance(service2.api_client, unittest.mock.Mock)

    # 3. Use .reset_override() to get back to normal
    container.api_client_factory.reset_override()
    service3 = container.service_factory()
    assert isinstance(service3.api_client, ApiClient)