def test_list_binding_with_named_arguments(self):
        self.binding_registry.register(
            RegisteredMultiBinding(
                MultiBinding(
                    MyType,
                    [
                        ItemBinding(bound_instance=self.named_instance),
                    ],
                    named="my_name",
                ),
                item_bindings=[
                    RegisteredBinding(InstanceBinding(MyType, self.named_instance, named="my_name"))
                ]
            )
        )
        self.binding_registry.register(
            RegisteredMultiBinding(
                MultiBinding(
                    MyType,
                    [
                        ItemBinding(bound_instance=self.my_instance),
                    ],
                ),
                item_bindings=[
                    RegisteredBinding(InstanceBinding(MyType, self.my_instance))
                ]
            )
        )
        self.binding_registry.register(RegisteredBinding(self.my_named_instance_binding))
        self.binding_registry.register(RegisteredBinding(SelfBinding(MyType)))

        context = InjectionContext(Target(List[MyType], "my_name"), self.state)
        provider = self.provider_creator.get_provider(context)
        list_instance = provider.get()
        self.assertEqual([self.named_instance], list_instance)
Exemple #2
0
 def test_register_multi_binding_saves_binding_to_known_type_in_order(self):
     item_binding_1 = ItemBinding(MyType)
     registered_item_binding_1 = RegisteredBinding(SelfBinding(MyType))
     item_binding_2 = ItemBinding(bound_instance=MyType())
     registered_item_binding_2 = RegisteredBinding(
         InstanceBinding(MyType, item_binding_2.bound_instance))
     binding_1 = RegisteredMultiBinding(MultiBinding(
         MyType, [item_binding_1]),
                                        item_bindings=[
                                            registered_item_binding_1,
                                        ])
     binding_2 = RegisteredMultiBinding(MultiBinding(
         MyType, [item_binding_2], override_bindings=False),
                                        item_bindings=[
                                            registered_item_binding_2,
                                        ])
     self.binding_registry.register(binding_1)
     self.binding_registry.register(binding_2)
     registered_binding = self.binding_registry.get_binding(
         Target(List[MyType]))
     self.assertIsInstance(registered_binding, RegisteredMultiBinding)
     self.assertIsInstance(registered_binding.raw_binding, MultiBinding)
     self.assertEqual(
         [registered_item_binding_1, registered_item_binding_2],
         registered_binding.item_bindings)
Exemple #3
0
    def test_bind_class_to_another_class(self):
        self.module.bind(MyType, OtherType)

        self.assertEqual(
            {
                FrozenTarget(MyType):
                RegisteredBinding(ClassBinding(MyType, OtherType)),
                FrozenTarget(OtherType):
                RegisteredBinding(SelfBinding(OtherType)),
            }, self.module.binding_registry.get_bindings_by_target())
Exemple #4
0
 def test_bind_provider_instance(self):
     self.module.bind(MyType, to_provider=self.my_provider)
     self.assertEqual(
         {
             FrozenTarget(MyType):
             RegisteredBinding(ProviderBinding(MyType, self.my_provider)),
             FrozenTarget(MyProvider):
             RegisteredBinding(InstanceBinding(MyProvider,
                                               self.my_provider)),
         }, self.module.binding_registry.get_bindings_by_target())
Exemple #5
0
    def test_bind_multiple_overrides_binding(self):
        self.module.bind(MyType, to_instance=self.my_instance)
        self.module.bind(MyType, OtherType)

        self.assertEqual(
            {
                FrozenTarget(MyType):
                RegisteredBinding(ClassBinding(MyType, OtherType)),
                FrozenTarget(OtherType):
                RegisteredBinding(SelfBinding(OtherType)),
            }, self.module.binding_registry.get_bindings_by_target())
    def test_type_binding_with_explicit_binding(self):
        class SubType(MyType):
            pass

        self.binding_registry.register(RegisteredBinding(InstanceBinding(Type[MyType], MyType)))
        self.binding_registry.register(RegisteredBinding(ClassBinding(MyType, SubType)))

        context = InjectionContext(Target(Type[MyType]), self.state)
        provider = self.provider_creator.get_provider(context)
        self.assertIsInstance(provider, FromInstanceProvider)
        instance = provider.get()
        self.assertIs(MyType, instance)
    def test_type_binding_without_class_binding(self):
        class MyParentClass:
            def __init__(self, my_param: Type[MyType]):
                self.my_param = my_param

        parent_binding = SelfBinding(MyParentClass)
        self.binding_registry.register(RegisteredBinding(self.my_instance_binding))
        self.binding_registry.register(RegisteredBinding(parent_binding))
        context = InjectionContext(Target(Type[MyType]), self.state)

        with self.assertRaises(NonInjectableTypeError):
            self.provider_creator.get_provider(context)
Exemple #8
0
    def test_multi_binding(self):
        instance = MyType()
        provider = MyProvider
        self.module.multi_bind(
            MyType,
            [
                self.module.bind_item(to_class=MyType),
                self.module.bind_item(to_instance=instance),
                self.module.bind_item(to_provider=provider),
            ],
            scope=PerLookupScope,
            named="my_name",
            override_bindings=False,
        )

        self.assertEqual(
            {
                FrozenTarget(List[MyType], "my_name"):
                RegisteredMultiBinding(
                    MultiBinding(
                        MyType,
                        [
                            ItemBinding(bound_class=MyType),
                            ItemBinding(bound_instance=instance),
                            ItemBinding(bound_provider=provider),
                        ],
                        scope=PerLookupScope,
                        named="my_name",
                        override_bindings=False,
                    ),
                    item_bindings=[
                        RegisteredBinding(
                            SelfBinding(MyType,
                                        scope=PerLookupScope,
                                        named="my_name"), ),
                        RegisteredBinding(
                            InstanceBinding(MyType, instance,
                                            named="my_name"), ),
                        RegisteredBinding(
                            ProviderBinding(MyType,
                                            provider,
                                            scope=PerLookupScope,
                                            named="my_name"), )
                    ]),
                FrozenTarget(MyProvider, "my_name"):
                RegisteredBinding(
                    SelfBinding(
                        MyProvider, scope=PerLookupScope, named="my_name")),
                FrozenTarget(MyType, "my_name"):
                RegisteredBinding(
                    InstanceBinding(MyType, instance, named="my_name"))
            }, self.module.binding_registry.get_bindings_by_target())
Exemple #9
0
 def setUp(self) -> None:
     self.binding_registry = BindingRegistry()
     mock_binding = create_autospec(Binding, spec_set=True)
     mock_binding.target = FrozenTarget(MyType)
     self.my_type_binding = RegisteredBinding(mock_binding)
     mock_named_binding = create_autospec(Binding, spec_set=True)
     mock_named_binding.target = FrozenTarget(MyType, "my_name")
     self.my_type_named_binding = RegisteredBinding(mock_named_binding)
     self.my_type_binding_2 = RegisteredBinding(
         InstanceBinding(MyType, MyType()))
     other_mock_binding = create_autospec(Binding, spec_set=True)
     other_mock_binding.target = FrozenTarget(OtherType)
     self.other_type_binding = RegisteredBinding(other_mock_binding)
 def setUp(self):
     self.binding_registry = BindingRegistry()
     self.binding_registry.register(RegisteredBinding(InstanceBinding(SingletonScope, SingletonScope())))
     self.binding_registry.register(RegisteredBinding(InstanceBinding(ThreadScope, ThreadScope())))
     self.adapter = MultiBindingToProviderAdapter(
         FromRegisteredBindingProviderFactory()
     )
     self.my_instance = MyType()
     self.state = InjectionState(
         ProviderCreator(),
         self.binding_registry,
     )
     self.context = InjectionContext(Target(List[MyType]), self.state)
    def test_get_provider_with_instance_bindings(self):
        self.binding_registry.register(RegisteredBinding(self.my_instance_binding))
        self.binding_registry.register(RegisteredBinding(self.my_other_instance_binding))

        provider = self.provider_creator.get_provider(self.context)
        self.assertIsInstance(provider, FromInstanceProvider)
        instance = provider.get()
        self.assertIsInstance(instance, MyType)

        provider = self.provider_creator.get_provider(self.other_context)
        self.assertIsInstance(provider, FromInstanceProvider)
        instance = provider.get()
        self.assertIsInstance(instance, MyOtherType)
Exemple #12
0
    def test_register_class_binding_does_not_create_self_binding_if_target_exists(
            self):
        class MySubType(MyType):
            pass

        my_instance = MySubType()
        class_binding = RegisteredBinding(ClassBinding(MyType, MySubType))
        instance_binding = RegisteredBinding(
            InstanceBinding(MySubType, my_instance))
        self.binding_registry.register(instance_binding)
        self.binding_registry.register(class_binding)
        self.assertIs(class_binding,
                      self.binding_registry.get_binding(Target(MyType)))
        self.assertIs(instance_binding,
                      self.binding_registry.get_binding(Target(MySubType)))
Exemple #13
0
    def test_install(self):
        class OtherModule(Module):
            def configure(self) -> None:
                self.bind(MyType)
                self.bind(OtherType, named="my_name")

        module = OtherModule()
        self.module.install(module)
        self.assertEqual(
            {
                FrozenTarget(MyType):
                RegisteredBinding(SelfBinding(MyType)),
                FrozenTarget(OtherType, "my_name"):
                RegisteredBinding(SelfBinding(OtherType, named="my_name")),
            }, self.module.binding_registry.get_bindings_by_target())
Exemple #14
0
 def test_unknown_binding_type_raises_binding_error(self):
     mock_binding = create_autospec(Binding, spec_set=True)
     self.binding_registry.get_binding.return_value = RegisteredBinding(
         mock_binding)
     self.binding_registry.__contains__.return_value = True
     with self.assertRaises(BindingError):
         self.provider_factory.create(self.str_context)
    def test_get_provider_caches_providers(self):
        self.binding_registry.register(
            RegisteredBinding(self.my_instance_binding))

        provider_1 = self.provider_creator.get_provider(self.context)
        provider_2 = self.provider_creator.get_provider(self.context)
        self.assertIs(provider_1, provider_2)
Exemple #16
0
    def test_create_returns_provider(self):
        provider = self.adapter.create(
            RegisteredBinding(InstanceBinding(MyType, self.instance)),
            self.providers_creator)

        instance = provider.get()
        self.assertIs(instance, self.instance)
Exemple #17
0
 def test_bind_with_scope(self):
     self.module.bind(MyType, scope=PerLookupScope)
     self.assertEqual(
         {
             FrozenTarget(MyType):
             RegisteredBinding(SelfBinding(MyType, PerLookupScope)),
         }, self.module.binding_registry.get_bindings_by_target())
    def test_create_provider_with_named_args(self):
        class MyOtherType:
            @named_arg("arg", "my_name")
            def __init__(self, *arg: str):
                self.arg = arg

        mock_provider_1 = create_autospec(Provider)
        mock_provider_1.get.return_value = ["my_arg_1"]

        self.state.provider_creator.get_provider.side_effect = [
            mock_provider_1,
            self.mock_scope_provider,
        ]

        provider = self.adapter.create(
            RegisteredBinding(SelfBinding(MyOtherType)), self.context)
        instance = provider.get()
        self.assertIsInstance(instance, MyOtherType)
        self.assertEqual(("my_arg_1", ), instance.arg)
        self.assertEqual([
            call(
                self.context.get_child_context(Target(List[str], "my_name"),
                                               allow_jit_provider=True)),
            call(
                self.context.get_child_context(Target(SingletonScope),
                                               allow_jit_provider=True)),
        ], self.state.provider_creator.get_provider.call_args_list)
    def test_create_provider_from_named_binding(self):
        class MyOtherType:
            def __init__(self, arg: str):
                self.arg = arg

        mock_provider_1 = create_autospec(Provider)
        mock_provider_1.get.return_value = "my_arg_1"

        self.state.provider_creator.get_provider.side_effect = [
            NoBindingFound,
            mock_provider_1,
            self.mock_scope_provider,
        ]

        provider = self.adapter.create(
            RegisteredBinding(SelfBinding(MyOtherType, named="my_name")),
            self.context)
        instance = provider.get()
        self.assertIsInstance(instance, MyOtherType)
        self.assertEqual("my_arg_1", instance.arg)
        self.assertEqual([
            call(self.context.get_child_context(Target(str, "arg"))),
            call(self.context.get_child_context(Target(str))),
            call(self.context.get_child_context(Target(SingletonScope))),
        ], self.state.provider_creator.get_provider.call_args_list)
Exemple #20
0
    def test_bind_class_to_itself(self):
        self.module.bind(MyType)

        self.assertEqual(
            {
                FrozenTarget(MyType): RegisteredBinding(SelfBinding(MyType)),
            }, self.module.binding_registry.get_bindings_by_target())
Exemple #21
0
 def test_bind_provider_class(self):
     self.module.bind(MyType,
                      to_provider=MyProvider,
                      scope=PerLookupScope,
                      named="my_name")
     self.assertEqual(
         {
             FrozenTarget(MyType, "my_name"):
             RegisteredBinding(
                 ProviderBinding(MyType, MyProvider, PerLookupScope,
                                 "my_name")),
             FrozenTarget(MyProvider, "my_name"):
             RegisteredBinding(
                 SelfBinding(
                     MyProvider, scope=PerLookupScope, named="my_name")),
         }, self.module.binding_registry.get_bindings_by_target())
 def test_list_implicit_binding(self):
     instance = MyType()
     self.binding_registry.register(RegisteredBinding(InstanceBinding(MyType, instance)))
     context = InjectionContext(Target(List[MyType]), self.state)
     provider = self.provider_creator.get_provider(context)
     self.assertIsInstance(provider, ListProvider)
     list_instance = provider.get()
     self.assertEqual([instance], list_instance)
    def test_provider_binding(self):
        class MyInjectee:
            pass

        class MyProvider(Provider[MyInjectee]):
            def __init__(self, my_param: MyType):
                self.my_param = my_param

            def get(self) -> MyInjectee:
                return MyInjectee()

        provider_binding = ProviderBinding(MyInjectee, MyProvider)
        self.binding_registry.register(RegisteredBinding(self.my_instance_binding))
        self.binding_registry.register(RegisteredBinding(provider_binding))
        context = InjectionContext(Target(MyInjectee), self.state)

        self.provider_creator.get_provider(context)
    def test_optional_binding(self):
        self.binding_registry.register(RegisteredBinding(self.my_instance_binding))

        context = InjectionContext(Target(Optional[MyType]), self.state)
        provider = self.provider_creator.get_provider(context)
        self.assertIsInstance(provider, FromInstanceProvider)
        instance = provider.get()
        self.assertIs(self.my_instance, instance)
    def test_non_injectable_scope_raises_exception(self):
        self.state.provider_creator.get_provider.side_effect = [
            self.provider_provider,
            NoBindingFound(),
        ]

        with self.assertRaises(NonInjectableTypeError):
            self.adapter.create(RegisteredBinding(ProviderBinding(MyType, Provider)), self.context)
Exemple #26
0
    def test_bind_instance(self):
        my_instance = MyType()
        self.module.bind(MyType, to_instance=my_instance)

        self.assertEqual(
            {
                FrozenTarget(MyType):
                RegisteredBinding(InstanceBinding(MyType, my_instance)),
            }, self.module.binding_registry.get_bindings_by_target())
    def test_create_returns_provider_from_provider_instance_binding(self):
        provider = self.adapter.create(
            RegisteredBinding(ProviderBinding(MyType, self.provider)),
            self.context)

        instance = provider.get()
        self.assertIs(instance, self.instance)
        self.assertEqual(
            [], self.state.provider_creator.get_provider.call_args_list)
Exemple #28
0
    def test_create_creates_provider_for_instance_binding(self):
        binding = InstanceBinding(MyType, MyType())
        self.binding_registry.get_binding.return_value = RegisteredBinding(
            binding)
        self.binding_registry.__contains__.return_value = True

        provider = self.provider_factory.create(self.context)
        instance = provider.get()
        self.assertIs(binding.bound_instance, instance)
Exemple #29
0
    def test_create_from_class_binding(self):
        binding = RegisteredMultiBinding(
            MultiBinding(MyType, [ItemBinding(bound_class=MyType)]),
            item_bindings=[RegisteredBinding(SelfBinding(MyType))])

        provider = self.adapter.create(binding, self.context)

        list_instance = provider.get()
        self.assertEqual(1, len(list_instance))
        self.assertIsInstance(list_instance[0], MyType)
    def test_get_provider_with_named_bindings(self):
        self.binding_registry.register(RegisteredBinding(self.my_named_instance_binding))

        with self.assertRaises(NoBindingFound):
            self.provider_creator.get_provider(self.context)

        provider = self.provider_creator.get_provider(self.named_context)
        self.assertIsInstance(provider, FromInstanceProvider)
        instance = provider.get()
        self.assertIs(self.named_instance, instance)