"""Unit tests for ContextAwareInterface.""" from __future__ import annotations import pytest from python_repositories.interfaces.context_aware_interface import ContextAwareInterface class FakeContextManager: """Plain class that satisfies ContextAwareInterface without inheritance.""" def __enter__(self) -> FakeContextManager: return self def __exit__( self, exc_type: type | None, exc_val: object | None, exc_tb: object | None ) -> None: pass def accepts_context_aware(context: ContextAwareInterface) -> None: """Type-checking hook for ContextAwareInterface structural subtyping.""" with context: pass def test_instantiation_fails_when_enter_not_implemented() -> None: """Test that instantiation fails if __enter__ is not implemented.""" class Incomplete(ContextAwareInterface): """A class that does not implement __enter__.""" def __exit__( self, exc_type: type | None, exc_val: object | None, exc_tb: object | None ) -> None: pass with pytest.raises(TypeError): _ = Incomplete() # type: ignore def test_instantiation_fails_when_exit_not_implemented() -> None: """Test that instantiation fails if __exit__ is not implemented.""" class Incomplete(ContextAwareInterface): """A class that does not implement __exit__.""" def __enter__(self) -> Incomplete: return self with pytest.raises(TypeError): _ = Incomplete() # type: ignore def test_structural_subtyping() -> None: """Test that a plain class satisfies ContextAwareInterface structurally.""" context: ContextAwareInterface = FakeContextManager() accepts_context_aware(context) assert isinstance(context, ContextAwareInterface)