mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-23 01:56:58 +03:00
203 lines
5.9 KiB
Python
203 lines
5.9 KiB
Python
"""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))
|