"""Dependency injector injections unittests.""" import warnings import unittest2 as unittest from dependency_injector import injections from dependency_injector import providers from dependency_injector import errors class InjectTests(unittest.TestCase): """Inject decorator test cases.""" def test_decorated_args(self): """Test `inject()` decoration with args.""" provider1 = providers.Factory(object) provider2 = providers.Factory(list) @injections.inject(provider1, provider2) def test(a, b): return a, b a1, b1 = test() a2, b2 = test() self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIsNot(a1, a2) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorated_args_several_times(self): """Test `inject()` decoration with args several times.""" provider1 = providers.Factory(object) provider2 = providers.Factory(list) @injections.inject(provider2) @injections.inject(provider1) def test(a, b): return a, b a1, b1 = test() a2, b2 = test() self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIsNot(a1, a2) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorated_context_args(self): """Test `inject()` decoration with context args.""" provider1 = providers.Factory(object) provider2 = providers.Factory(list) @injections.inject(provider1) def test(a, b): return a, b a1, b1 = test(provider2()) a2, b2 = test(provider2()) self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIsNot(a1, a2) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorated_kwargs(self): """Test `inject()` decoration with kwargs.""" provider1 = providers.Factory(object) provider2 = providers.Factory(list) @injections.inject(a=provider1) @injections.inject(b=provider2) def test(a, b): return a, b a1, b1 = test() a2, b2 = test() self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIsNot(a1, a2) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorated_kwargs_priority(self): """Test `inject()` decorated callback kwargs priority.""" provider1 = providers.Factory(object) provider2 = providers.Factory(list) object_a = object() @injections.inject(a=provider1) @injections.inject(b=provider2) def test(a, b): return a, b a1, b1 = test(a=object_a) a2, b2 = test(a=object_a) self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIs(a1, object_a) self.assertIs(a2, object_a) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorated_with_args(self): """Test `inject()` decorated callback with args.""" provider = providers.Factory(list) object_a = object() @injections.inject(b=provider) def test(a, b): return a, b a1, b1 = test(object_a) a2, b2 = test(object_a) self.assertIsInstance(a1, object) self.assertIsInstance(a2, object) self.assertIs(a1, object_a) self.assertIs(a2, object_a) self.assertIsInstance(b1, list) self.assertIsInstance(b2, list) self.assertIsNot(b1, b2) def test_decorate_class_method(self): """Test `inject()` decorator with class method.""" class Test(object): """Test class.""" @injections.inject(arg1=123) @injections.inject(arg2=456) def some_method(self, arg1, arg2): """Some test method.""" return arg1, arg2 test_object = Test() arg1, arg2 = test_object.some_method() self.assertEquals(arg1, 123) self.assertEquals(arg2, 456) def test_decorate_class_with_init(self): """Test `inject()` decorator that decorate class with __init__.""" @injections.inject(arg1=123) @injections.inject(arg2=456) class Test(object): """Test class.""" def __init__(self, arg1, arg2): """Init.""" self.arg1 = arg1 self.arg2 = arg2 test_object = Test() self.assertEquals(test_object.arg1, 123) self.assertEquals(test_object.arg2, 456) def test_decorate_class_without_init(self): """Test `inject()` decorator that decorate class without __init__.""" with self.assertRaises(errors.Error): @injections.inject(arg1=123) class Test(object): """Test class.""" class InjectDeprecationTests(unittest.TestCase): """Deprecation of `@inject()` tests.""" def test_deprecation_warning_on_usage(self): """Test that DeprecationWarning is produced when `@inject` is used.""" with warnings.catch_warnings(record=True) as caught_warnings: warnings.simplefilter('always') @injections.inject(1) def _example(arg): pass warnings.simplefilter('default') self.assertEquals(len(caught_warnings), 1) self.assertEquals(caught_warnings[-1].category, DeprecationWarning) self.assertIn('Call to a deprecated decorator', str(caught_warnings[-1].message)) self.assertIn('@dependency_injector.injections.inject', str(caught_warnings[-1].message))