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)
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)
def test_register_multi_binding_with_override(self): item_binding_1 = ItemBinding(MyType) item_binding_2 = ItemBinding(bound_instance=MyType()) binding_1 = RegisteredMultiBinding( MultiBinding(MyType, [item_binding_1])) binding_2 = RegisteredMultiBinding( MultiBinding(MyType, [item_binding_2], override_bindings=True)) self.binding_registry.register(binding_1) self.binding_registry.register(binding_2) binding = self.binding_registry.get_binding(Target( List[MyType])).raw_binding self.assertIsInstance(binding, MultiBinding) self.assertEqual([item_binding_2], binding.item_bindings)
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_create_from_instance_binding(self): binding = RegisteredMultiBinding( MultiBinding(MyType, [ItemBinding(bound_instance=self.my_instance)]), item_bindings=[ RegisteredBinding(InstanceBinding(MyType, self.my_instance)) ]) provider = self.adapter.create(binding, self.context) list_instance = provider.get() self.assertEqual([self.my_instance], list_instance)
def test_create_from_provider_binding(self): provider = create_autospec(Provider, spec_set=True) instance = MyType() provider.get.return_value = instance binding = RegisteredMultiBinding(MultiBinding(MyType, [ItemBinding(bound_provider=provider)]), item_bindings=[ RegisteredBinding(ProviderBinding(MyType, provider)) ]) provider = self.adapter.create(binding, self.context) list_instance = provider.get() self.assertEqual([instance], list_instance)
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())
def test_create_scoped_provider(self): provider = self.adapter.create(RegisteredMultiBinding( MultiBinding(MyType, [ItemBinding(MyType)], scope=ThreadScope), item_bindings=[ RegisteredBinding(SelfBinding(MyType, scope=ThreadScope)) ] ), self.context) self.assertIsInstance(provider, ThreadScopedProvider) instance = provider.get() self.assertIsInstance(instance, list) self.assertEqual(1, len(instance)) self.assertIsInstance(instance[0], MyType)
def test_register_multi_binding_with_provider_binding_creates_self_binding( self): class MyProvider(Provider[str]): def get(self) -> str: return "hello" provider_binding = RegisteredBinding(ProviderBinding(str, MyProvider)) multi_binding = RegisteredMultiBinding( MultiBinding(str, [provider_binding.raw_binding]), item_bindings=[provider_binding]) self.binding_registry.register(multi_binding) provider_binding = self.binding_registry.get_binding( Target(MyProvider)) self.assertIsInstance(provider_binding.raw_binding, SelfBinding) self.assertEqual(MyProvider, provider_binding.raw_binding.target_type)
def test_list_binding_with_multi_binding(self): self.binding_registry.register( RegisteredMultiBinding( MultiBinding( MyType, [ ItemBinding(bound_instance=self.my_instance), ItemBinding(MyType), ], ), item_bindings=[ RegisteredBinding(InstanceBinding(MyType, self.my_instance)), RegisteredBinding(SelfBinding(MyType)), ])) context = InjectionContext(Target(List[MyType]), self.state) provider = self.provider_creator.get_provider(context) list_instance = provider.get() self.assertEqual([self.my_instance, ANY], list_instance) self.assertIsInstance(list_instance[1], MyType)
def test_set_binding_with_multi_binding(self): self.binding_registry.register( RegisteredMultiBinding( MultiBinding( MyType, [ ItemBinding(bound_instance=self.my_instance), ItemBinding(MyType), ], ), item_bindings=[ RegisteredBinding(InstanceBinding(MyType, self.my_instance)), RegisteredBinding(SelfBinding(MyType)), ])) context = InjectionContext(Target(Set[MyType]), self.state) provider = self.provider_creator.get_provider(context) self.assertIsInstance(provider, FromClassProvider) set_instance = provider.get() self.assertIn(self.my_instance, set_instance) self.assertEqual(2, len(set_instance))
def test_multi_binding_default_parameters(self): self.module.multi_bind( MyType, [ self.module.bind_item(MyType), ], ) self.assertEqual( { FrozenTarget(List[MyType]): RegisteredMultiBinding( MultiBinding( MyType, [ ItemBinding(MyType), ], SingletonScope, None, True, ), item_bindings=[RegisteredBinding(SelfBinding(MyType), )]), }, self.module.binding_registry.get_bindings_by_target())
def test_non_injectable_scope_raises_exception(self): with self.assertRaises(NonInjectableTypeError): self.adapter.create( RegisteredMultiBinding( MultiBinding(MyType, [], scope=ImmediateScope)), self.context)