python-dependency-injector/tests/test_injections.py

360 lines
12 KiB
Python
Raw Normal View History

2015-08-31 16:31:38 +03:00
"""Dependency injector injections unittests."""
2015-03-10 17:12:42 +03:00
2015-12-07 15:31:51 +03:00
import six
2015-03-10 17:12:42 +03:00
import unittest2 as unittest
2015-11-23 22:45:58 +03:00
from dependency_injector import injections
from dependency_injector import catalogs
from dependency_injector import providers
from dependency_injector import errors
2015-03-10 17:12:42 +03:00
class InjectionTests(unittest.TestCase):
2015-03-10 17:12:42 +03:00
"""Injection test cases."""
def test_init(self):
"""Test Injection creation and initialization."""
2015-11-23 22:45:58 +03:00
injection = injections.Injection('some_value')
2015-03-10 17:12:42 +03:00
self.assertEqual(injection.injectable, 'some_value')
2015-03-11 01:23:26 +03:00
def test_value_with_scalar_injectable(self):
2015-03-12 01:10:51 +03:00
"""Test Injection value property with scalar value."""
2015-11-23 22:45:58 +03:00
injection = injections.Injection('some_value')
2015-03-11 01:23:26 +03:00
self.assertEqual(injection.value, 'some_value')
2015-03-12 01:10:51 +03:00
def test_value_with_provider_injectable(self):
"""Test Injection value property with provider."""
2015-11-23 22:45:58 +03:00
injection = injections.Injection(providers.Factory(object))
2015-03-12 01:10:51 +03:00
self.assertIsInstance(injection.value, object)
def test_value_with_catalog_bundle_injectable(self):
"""Test Injection value property with catalog bundle."""
2015-11-23 22:45:58 +03:00
class TestCatalog(catalogs.DeclarativeCatalog):
"""Test catalog."""
2015-11-23 22:45:58 +03:00
provider = providers.Provider()
injection = injections.Injection(
TestCatalog.Bundle(TestCatalog.provider))
self.assertIsInstance(injection.value, TestCatalog.Bundle)
2015-12-07 15:31:51 +03:00
def test_repr_with_scalar_value(self):
"""Test Injection representation with scalar value."""
injection = injections.Injection(123)
self.assertEqual(repr(injection), '<Injection(123)>')
def test_repr_with_provider(self):
"""Test Injection representation with provider."""
injection = injections.Injection(providers.Factory(object))
self.assertEqual(repr(injection),
'<Injection(Factory({0}.object))>'.format(
six.moves.builtins.__name__))
2015-03-12 01:10:51 +03:00
class ArgTests(unittest.TestCase):
"""Positional arg injection test cases."""
def test_init(self):
"""Test Arg creation and initialization."""
2015-11-23 22:45:58 +03:00
injection = injections.Arg('some_value')
self.assertEqual(injection.injectable, 'some_value')
2015-12-07 15:31:51 +03:00
def test_repr_with_scalar_value(self):
"""Test Arg representation with scalar value."""
injection = injections.Arg(123)
self.assertEqual(repr(injection), '<Arg(123)>')
def test_repr_with_provider(self):
"""Test Arg representation with provider."""
injection = injections.Arg(providers.Factory(object))
self.assertEqual(repr(injection),
'<Arg(Factory({0}.object))>'.format(
six.moves.builtins.__name__))
2015-03-23 13:19:58 +03:00
class KwArgTests(unittest.TestCase):
"""Keyword arg injection test cases."""
2015-03-12 01:10:51 +03:00
def test_init(self):
"""Test KwArg creation and initialization."""
2015-11-23 22:45:58 +03:00
injection = injections.KwArg('some_arg_name', 'some_value')
2015-03-12 01:10:51 +03:00
self.assertEqual(injection.name, 'some_arg_name')
self.assertEqual(injection.injectable, 'some_value')
2015-12-07 15:31:51 +03:00
def test_repr_with_scalar_value(self):
"""Test KwArg representation with scalar value."""
injection = injections.KwArg('some_arg_name', 123)
self.assertEqual(repr(injection), '<KwArg(\'some_arg_name\', 123)>')
def test_repr_with_provider(self):
"""Test KwArg representation with provider."""
injection = injections.KwArg('some_arg_name',
providers.Factory(object))
self.assertEqual(repr(injection),
'<KwArg(\'some_arg_name\', '
'Factory({0}.object))>'.format(
six.moves.builtins.__name__))
2015-03-12 01:10:51 +03:00
class AttributeTests(unittest.TestCase):
2015-03-12 01:10:51 +03:00
"""Attribute injection test cases."""
def test_init(self):
"""Test Attribute creation and initialization."""
2015-11-23 22:45:58 +03:00
injection = injections.Attribute('some_arg_name', 'some_value')
2015-03-12 01:10:51 +03:00
self.assertEqual(injection.name, 'some_arg_name')
self.assertEqual(injection.injectable, 'some_value')
2015-12-07 15:31:51 +03:00
def test_repr_with_scalar_value(self):
"""Test Attribute representation with scalar value."""
injection = injections.Attribute('some_arg_name', 123)
self.assertEqual(repr(injection),
'<Attribute(\'some_arg_name\', 123)>')
def test_repr_with_provider(self):
"""Test Attribute representation with provider."""
injection = injections.Attribute('some_arg_name',
providers.Factory(object))
self.assertEqual(repr(injection),
'<Attribute(\'some_arg_name\', '
'Factory({0}.object))>'.format(
six.moves.builtins.__name__))
2015-03-12 01:10:51 +03:00
class MethodTests(unittest.TestCase):
2015-03-12 01:10:51 +03:00
"""Method injection test cases."""
def test_init(self):
"""Test Method creation and initialization."""
2015-11-23 22:45:58 +03:00
injection = injections.Method('some_arg_name', 'some_value')
2015-03-12 01:10:51 +03:00
self.assertEqual(injection.name, 'some_arg_name')
self.assertEqual(injection.injectable, 'some_value')
2015-12-07 15:31:51 +03:00
def test_repr_with_scalar_value(self):
"""Test Method representation with scalar value."""
injection = injections.Method('some_arg_name', 123)
self.assertEqual(repr(injection),
'<Method(\'some_arg_name\', 123)>')
def test_repr_with_provider(self):
"""Test Method representation with provider."""
injection = injections.Method('some_arg_name',
providers.Factory(object))
self.assertEqual(repr(injection),
'<Method(\'some_arg_name\', '
'Factory({0}.object))>'.format(
six.moves.builtins.__name__))
class InjectTests(unittest.TestCase):
"""Inject decorator test cases."""
def test_decorated_args(self):
"""Test `inject()` decoration with args."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
2015-11-23 22:45:58 +03:00
@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_extended_syntax(self):
"""Test `inject()` decoration with args."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
2015-11-23 22:45:58 +03:00
@injections.inject(injections.Arg(provider1),
injections.Arg(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."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
2015-11-23 22:45:58 +03:00
@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."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
2015-11-23 22:45:58 +03:00
@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."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
2015-11-23 22:45:58 +03:00
@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."""
2015-11-23 22:45:58 +03:00
provider1 = providers.Factory(object)
provider2 = providers.Factory(list)
object_a = object()
2015-11-23 22:45:58 +03:00
@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."""
2015-11-23 22:45:58 +03:00
provider = providers.Factory(list)
object_a = object()
2015-11-23 22:45:58 +03:00
@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_injection_kwarg_syntax(self):
"""Test `inject()` decorated callback with "old" style using KwArg."""
2015-11-23 22:45:58 +03:00
provider = providers.Factory(list)
object_a = object()
2015-11-23 22:45:58 +03:00
@injections.inject(injections.KwArg('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."""
2015-11-23 22:45:58 +03:00
@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__."""
2015-11-23 22:45:58 +03:00
@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__."""
2015-11-23 22:45:58 +03:00
with self.assertRaises(errors.Error):
@injections.inject(arg1=123)
class Test(object):
"""Test class."""