def test_service_override(): collection = ServiceCollection() collection.add_instance(Base, Impl1()) impl2 = Impl2() collection.add_instance(Base, impl2) collection.add_transient(UsesBase) ub = collection.resolve(UsesBase) assert isinstance(ub._base, Impl2) assert ub._base == impl2
def test_optional_with_dependencies(): collection = ServiceCollection() collection.add_transient(A) collection.add_transient(B) collection.add_transient(C) collection.add_transient(HasOptionalWithDeps) has_optional_with_deps = collection.resolve(HasOptionalWithDeps) assert isinstance(has_optional_with_deps._a, A) assert isinstance(has_optional_with_deps._c, C)
def test_with_args(): collection = ServiceCollection() collection.add_transient(NoTyping, args=["a", "b"]) collection.add_transient(SomeTyping, args=[ServiceResolverFlags.REQUIRED_SERVICE, "b"]) some_typing = collection.resolve(SomeTyping) no_typing = collection.resolve(NoTyping) assert some_typing._no_typing != no_typing
def test_service_override(): collection = ServiceCollection() collection.add_singleton(Base, Impl1) collection.add_singleton(Base, Impl2) collection.add_transient(UsesBase) ub = collection.resolve(UsesBase) base = collection.resolve(Base) assert isinstance(ub._base, Impl2) assert ub._base == base
def test_optional_not_declared(): collection = ServiceCollection() collection.add_transient(A) collection.add_transient(HasOptional) has_optional = collection.resolve(HasOptional) assert isinstance(has_optional._a, A) assert has_optional._b is None
def test_all_transient(): collection = ServiceCollection() collection.add_transient(A) collection.add_transient(B) collection.add_transient(C) a = collection.resolve(A) b = collection.resolve(B) c = collection.resolve(C) assert a != b.a assert b != c.b assert a != c.b.a
def test_multiple(): collection = ServiceCollection() collection.add_transient(Base, Impl1) collection.add_transient(Base, Impl2) collection.add_transient(UsesMultiple) um = collection.resolve(UsesMultiple) assert len(um._multiple) == 2 assert isinstance(um._multiple[0], Impl1) assert isinstance(um._multiple[1], Impl2)
def configure_services(): collection = ServiceCollection() collection.add_transient( IDatabaseService, DatabaseService, args=["my connection string"] ) collection.add_transient(IUserRepository, UserRepository) return collection
def test_subclass(): collection = ServiceCollection() a = A() b = B(a) c = C(a, b) sc = SubClass(c, b) collection.add_instance(ParentClass, sc) collection.add_transient(UsesSubClass) usc = collection.resolve(UsesSubClass) pc = collection.resolve(ParentClass) assert isinstance(usc._pc, SubClass) assert usc._pc == pc
def test_basic_singleton(): collection = ServiceCollection() collection.add_singleton(A) collection.add_transient(B) collection.add_transient(C) b = collection.resolve(B) c = collection.resolve(C) a = collection.resolve(A) assert b != c.b assert b.a == c.a assert b.a == c.b.a assert a == b.a
def test_nested_resolution_error(): collection = ServiceCollection() collection.add_transient(D) collection.add_transient(B) with pytest.raises(ServiceResolutionError): collection.resolve(D)
def test_multiple(): collection = ServiceCollection() collection.add_singleton(Base, Impl1) collection.add_singleton(Base, Impl2) collection.add_transient(UsesMultiple) um1 = collection.resolve(UsesMultiple) um2 = collection.resolve(UsesMultiple) assert len(um1._multiple) == 2 assert len(um2._multiple) == 2 assert um1._multiple[0] == um2._multiple[0] assert um1._multiple[1] == um2._multiple[1]
def test_instance(): collection = ServiceCollection() collection.add_transient(C) collection.add_transient(B) a = A() collection.add_instance(A, a) b = collection.resolve(B) c = collection.resolve(C) assert a == b.a assert a == c.b.a
def test_multiple(): collection = ServiceCollection() impl1 = Impl1() impl2 = Impl2() collection.add_instance(Base, impl1) collection.add_instance(Base, impl2) collection.add_transient(UsesMultiple) um = collection.resolve(UsesMultiple) assert len(um._multiple) == 2 assert um._multiple[0] == impl1 assert um._multiple[1] == impl2
def test_run_function(): collection = ServiceCollection() collection.add_transient(A) collection.add_transient(B) assert collection.call_function(my_fn) == "Called!"
def test_subclass(): collection = ServiceCollection() collection.add_transient(C) collection.add_transient(B) collection.add_transient(A) collection.add_transient(ParentClass, SubClass) collection.add_transient(UsesSubClass) usc = collection.resolve(UsesSubClass) pc = collection.resolve(ParentClass) assert isinstance(usc._pc, SubClass) assert usc._pc != pc
class B: def __init__(self, a: A): self.a = a print("created b") class C: def __init__(self, a: A, b: B): self.a = a self.b = b print("created c") from simple_injection import ServiceCollection collection = ServiceCollection() collection.add_transient(A) collection.add_transient(C) collection.add_transient(B) c = collection.resolve(C) collection2 = ServiceCollection() collection2.add_singleton(A) collection2.add_singleton(C) collection2.add_singleton(B) c = collection2.resolve(C) collection3 = ServiceCollection() b = B(1)