/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/test_container.py
214 строк
6 KB
User
ci: настроен Black и flake8 для автоматического форматирования кода
04 июл 2026, 08:14
04 июл 2026, 08:14
4778ed6
Код
Авторство
О чём код?
"""Тесты для Container (DI-контейнер).""" import pytest from liquidcode.container import Container, CircularDependencyError class TestContainer: """Тесты для DI-контейнера.""" def test_register_and_get(self): """Регистрация и получение сервиса.""" container = Container() class Service: pass container.register(Service) service = container.get(Service) assert isinstance(service, Service) def test_singleton_behavior(self): """Синглтон: один экземпляр при повторном получении.""" container = Container() class Service: def __init__(self): self.created = True container.register(Service) service1 = container.get(Service) service2 = container.get(Service) assert service1 is service2 def test_autowiring(self): """Автопроводка зависимостей через конструктор.""" container = Container() class Logger: pass class Service: def __init__(self, logger: Logger): self.logger = logger container.register(Logger) container.register(Service) service = container.get(Service) assert isinstance(service, Service) assert isinstance(service.logger, Logger) def test_circular_dependency(self): """Обнаружение циклической зависимости.""" # Используем exec с from __future__ для отложенного разрешения типов code = """ from __future__ import annotations import pytest from liquidcode.container import Container, CircularDependencyError container = Container() class ServiceA: def __init__(self, b: ServiceB): self.b = b class ServiceB: def __init__(self, a: ServiceA): self.a = a container.register(ServiceA) container.register(ServiceB) with pytest.raises(CircularDependencyError): container.get(ServiceA) """ exec( code, { "pytest": pytest, "Container": Container, "CircularDependencyError": CircularDependencyError, }, ) def test_alias_resolution(self): """Разрешение алиасов (интерфейс -> реализация).""" container = Container() class LoggerInterface: pass class LoggerImpl(LoggerInterface): pass container.register(LoggerInterface, LoggerImpl) logger = container.get(LoggerInterface) assert isinstance(logger, LoggerImpl) def test_factory(self): """Фабрика создания сервисов.""" container = Container() class Service: def __init__(self, value: str): self.value = value def factory(): return Service(value="custom") container.factory(Service, factory, shared=False) service1 = container.get(Service) service2 = container.get(Service) assert service1.value == "custom" assert service2.value == "custom" assert service1 is not service2 # Не синглтон def test_factory_shared(self): """Фабрика с shared=True (синглтон).""" container = Container() class Service: pass def factory(): return Service() container.factory(Service, factory, shared=True) service1 = container.get(Service) service2 = container.get(Service) assert service1 is service2 def test_manual_set(self): """Ручная установка готового экземпляра.""" container = Container() class Service: def __init__(self): self.manual = True service = Service() container.set(Service, service) assert container.get(Service) is service def test_default_values(self): """Параметры без аннотаций берут значения по умолчанию.""" container = Container() class Service: def __init__(self, name="default"): self.name = name container.register(Service) service = container.get(Service) assert service.name == "default" def test_resolve_alias_chain(self): """Разрешение цепочки алиасов.""" container = Container() class Interface1: pass class Interface2: pass class Implementation(Interface2): pass container.register(Interface1, Interface2) container.register(Interface2, Implementation) obj = container.get(Interface1) assert isinstance(obj, Implementation) def test_circular_alias_chain(self): """Цикл в цепочке алиасов.""" container = Container() class A: pass class B: pass container.register(A, B) container.register(B, A) with pytest.raises(CircularDependencyError): container.get(A) def test_shared_alias(self): """Синглтон поведение с алиасами.""" container = Container() class Interface: pass class Implementation(Interface): def __init__(self): self.id = id(self) container.register(Interface, Implementation) obj1 = container.get(Interface) obj2 = container.get(Interface) assert obj1 is obj2 assert obj1.id == obj2.id