Add additional unittests for full validation of Singleton provider

This commit is contained in:
Roman Mogilatov 2015-10-19 15:20:25 +03:00
parent b61e3ee007
commit 9b4a7bd28c
2 changed files with 246 additions and 57 deletions

View File

@ -175,6 +175,11 @@ class Singleton(Provider):
"""Reset instance.""" """Reset instance."""
self.instance = None self.instance = None
@property
def injections(self):
"""Return tuple of all injections."""
return self.factory.injections
class ExternalDependency(Provider): class ExternalDependency(Provider):
"""External dependency provider. """External dependency provider.

View File

@ -4,6 +4,34 @@ import unittest2 as unittest
import dependency_injector as di import dependency_injector as di
class Example(object):
"""Example class for Factory provider tests."""
def __init__(self, init_arg1=None, init_arg2=None):
"""Initializer.
:param init_arg1:
:param init_arg2:
:return:
"""
self.init_arg1 = init_arg1
self.init_arg2 = init_arg2
self.attribute1 = None
self.attribute2 = None
self.method1_value = None
self.method2_value = None
def method1(self, value):
"""Setter method 1."""
self.method1_value = value
def method2(self, value):
"""Setter method 2."""
self.method2_value = value
class ProviderTests(unittest.TestCase): class ProviderTests(unittest.TestCase):
"""Provider test cases.""" """Provider test cases."""
@ -132,36 +160,9 @@ class DelegateTests(unittest.TestCase):
class FactoryTests(unittest.TestCase): class FactoryTests(unittest.TestCase):
"""Factory test cases.""" """Factory test cases."""
class Example(object):
"""Example class for Factory provider tests."""
def __init__(self, init_arg1=None, init_arg2=None):
"""Initializer.
:param init_arg1:
:param init_arg2:
:return:
"""
self.init_arg1 = init_arg1
self.init_arg2 = init_arg2
self.attribute1 = None
self.attribute2 = None
self.method1_value = None
self.method2_value = None
def method1(self, value):
"""Setter method 1."""
self.method1_value = value
def method2(self, value):
"""Setter method 2."""
self.method2_value = value
def test_is_provider(self): def test_is_provider(self):
"""Test `is_provider` check.""" """Test `is_provider` check."""
self.assertTrue(di.is_provider(di.Factory(self.Example))) self.assertTrue(di.is_provider(di.Factory(Example)))
def test_init_with_callable(self): def test_init_with_callable(self):
"""Test creation of provider with a callable.""" """Test creation of provider with a callable."""
@ -173,20 +174,20 @@ class FactoryTests(unittest.TestCase):
def test_call(self): def test_call(self):
"""Test creation of new instances.""" """Test creation of new instances."""
provider = di.Factory(self.Example) provider = di.Factory(Example)
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_args(self): def test_call_with_init_positional_args(self):
"""Test creation of new instances with init positional args. """Test creation of new instances with init positional args.
New simplified syntax. New simplified syntax.
""" """
provider = di.Factory(self.Example, 'i1', 'i2') provider = di.Factory(Example, 'i1', 'i2')
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
@ -198,15 +199,15 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.init_arg2, 'i2') self.assertEqual(instance2.init_arg2, 'i2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_init_keyword_args(self): def test_call_with_init_keyword_args(self):
"""Test creation of new instances with init keyword args. """Test creation of new instances with init keyword args.
New simplified syntax. New simplified syntax.
""" """
provider = di.Factory(self.Example, init_arg1='i1', init_arg2='i2') provider = di.Factory(Example, init_arg1='i1', init_arg2='i2')
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
@ -218,15 +219,15 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.init_arg2, 'i2') self.assertEqual(instance2.init_arg2, 'i2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_and_keyword_args(self): def test_call_with_init_positional_and_keyword_args(self):
"""Test creation of new instances with init positional and keyword args. """Test creation of new instances with init positional and keyword args.
Simplified syntax of positional and keyword arg injections. Simplified syntax of positional and keyword arg injections.
""" """
provider = di.Factory(self.Example,'i1', init_arg2='i2') provider = di.Factory(Example, 'i1', init_arg2='i2')
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
@ -238,15 +239,15 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.init_arg2, 'i2') self.assertEqual(instance2.init_arg2, 'i2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_and_keyword_args_extended_syntax(self): def test_call_with_init_positional_and_keyword_args_extended_syntax(self):
"""Test creation of new instances with init positional and keyword args. """Test creation of new instances with init positional and keyword args.
Extended syntax of positional and keyword arg injections. Extended syntax of positional and keyword arg injections.
""" """
provider = di.Factory(self.Example, provider = di.Factory(Example,
di.Arg('i1'), di.Arg('i1'),
di.KwArg('init_arg2', 'i2')) di.KwArg('init_arg2', 'i2'))
@ -260,12 +261,12 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.init_arg2, 'i2') self.assertEqual(instance2.init_arg2, 'i2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_attributes(self): def test_call_with_attributes(self):
"""Test creation of new instances with attribute injections.""" """Test creation of new instances with attribute injections."""
provider = di.Factory(self.Example, provider = di.Factory(Example,
di.Attribute('attribute1', 'a1'), di.Attribute('attribute1', 'a1'),
di.Attribute('attribute2', 'a2')) di.Attribute('attribute2', 'a2'))
@ -279,12 +280,12 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.attribute2, 'a2') self.assertEqual(instance2.attribute2, 'a2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_methods(self): def test_call_with_methods(self):
"""Test creation of new instances with method injections.""" """Test creation of new instances with method injections."""
provider = di.Factory(self.Example, provider = di.Factory(Example,
di.Method('method1', 'm1'), di.Method('method1', 'm1'),
di.Method('method2', 'm2')) di.Method('method2', 'm2'))
@ -298,12 +299,12 @@ class FactoryTests(unittest.TestCase):
self.assertEqual(instance2.method2_value, 'm2') self.assertEqual(instance2.method2_value, 'm2')
self.assertIsNot(instance1, instance2) self.assertIsNot(instance1, instance2)
self.assertIsInstance(instance1, self.Example) self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, self.Example) self.assertIsInstance(instance2, Example)
def test_call_with_context_args(self): def test_call_with_context_args(self):
"""Test creation of new instances with context args.""" """Test creation of new instances with context args."""
provider = di.Factory(self.Example) provider = di.Factory(Example)
instance = provider(11, 22) instance = provider(11, 22)
self.assertEqual(instance.init_arg1, 11) self.assertEqual(instance.init_arg1, 11)
@ -311,7 +312,7 @@ class FactoryTests(unittest.TestCase):
def test_call_with_context_kwargs(self): def test_call_with_context_kwargs(self):
"""Test creation of new instances with context kwargs.""" """Test creation of new instances with context kwargs."""
provider = di.Factory(self.Example, provider = di.Factory(Example,
di.KwArg('init_arg1', 1)) di.KwArg('init_arg1', 1))
instance1 = provider(init_arg2=22) instance1 = provider(init_arg2=22)
@ -324,7 +325,7 @@ class FactoryTests(unittest.TestCase):
def test_call_overridden(self): def test_call_overridden(self):
"""Test creation of new instances on overridden provider.""" """Test creation of new instances on overridden provider."""
provider = di.Factory(self.Example) provider = di.Factory(Example)
overriding_provider1 = di.Factory(dict) overriding_provider1 = di.Factory(dict)
overriding_provider2 = di.Factory(list) overriding_provider2 = di.Factory(list)
@ -339,8 +340,8 @@ class FactoryTests(unittest.TestCase):
self.assertIsInstance(instance2, list) self.assertIsInstance(instance2, list)
def test_injections(self): def test_injections(self):
"""Test getting a full list of injections using Factory.injections.""" """Test getting a full list of injections using injections property."""
provider = di.Factory(self.Example, provider = di.Factory(Example,
di.Arg(1), di.Arg(1),
di.KwArg('init_arg2', 2), di.KwArg('init_arg2', 2),
di.Attribute('attribute1', 3), di.Attribute('attribute1', 3),
@ -356,16 +357,199 @@ class FactoryTests(unittest.TestCase):
class SingletonTests(unittest.TestCase): class SingletonTests(unittest.TestCase):
"""Singleton test cases.""" """Singleton test cases."""
def test_is_provider(self):
"""Test `is_provider` check."""
self.assertTrue(di.is_provider(di.Singleton(Example)))
def test_init_with_callable(self):
"""Test creation of provider with a callable."""
self.assertTrue(di.Singleton(credits))
def test_init_with_not_callable(self):
"""Test creation of provider with not a callable."""
self.assertRaises(di.Error, di.Singleton, 123)
def test_call(self): def test_call(self):
"""Test creation and returning of single object.""" """Test getting of instances."""
provider = di.Singleton(object) provider = di.Singleton(Example)
instance1 = provider()
instance2 = provider()
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_args(self):
"""Test getting of instances with init positional args.
New simplified syntax.
"""
provider = di.Singleton(Example, 'i1', 'i2')
instance1 = provider() instance1 = provider()
instance2 = provider() instance2 = provider()
self.assertEqual(instance1.init_arg1, 'i1')
self.assertEqual(instance1.init_arg2, 'i2')
self.assertEqual(instance2.init_arg1, 'i1')
self.assertEqual(instance2.init_arg2, 'i2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_init_keyword_args(self):
"""Test getting of instances with init keyword args.
New simplified syntax.
"""
provider = di.Singleton(Example, init_arg1='i1', init_arg2='i2')
instance1 = provider()
instance2 = provider()
self.assertEqual(instance1.init_arg1, 'i1')
self.assertEqual(instance1.init_arg2, 'i2')
self.assertEqual(instance2.init_arg1, 'i1')
self.assertEqual(instance2.init_arg2, 'i2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_and_keyword_args(self):
"""Test getting of instances with init positional and keyword args.
Simplified syntax of positional and keyword arg injections.
"""
provider = di.Singleton(Example, 'i1', init_arg2='i2')
instance1 = provider()
instance2 = provider()
self.assertEqual(instance1.init_arg1, 'i1')
self.assertEqual(instance1.init_arg2, 'i2')
self.assertEqual(instance2.init_arg1, 'i1')
self.assertEqual(instance2.init_arg2, 'i2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_init_positional_and_keyword_args_extended_syntax(self):
"""Test getting of instances with init positional and keyword args.
Extended syntax of positional and keyword arg injections.
"""
provider = di.Singleton(Example,
di.Arg('i1'),
di.KwArg('init_arg2', 'i2'))
instance1 = provider()
instance2 = provider()
self.assertEqual(instance1.init_arg1, 'i1')
self.assertEqual(instance1.init_arg2, 'i2')
self.assertEqual(instance2.init_arg1, 'i1')
self.assertEqual(instance2.init_arg2, 'i2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_attributes(self):
"""Test getting of instances with attribute injections."""
provider = di.Singleton(Example,
di.Attribute('attribute1', 'a1'),
di.Attribute('attribute2', 'a2'))
instance1 = provider()
instance2 = provider()
self.assertEqual(instance1.attribute1, 'a1')
self.assertEqual(instance1.attribute2, 'a2')
self.assertEqual(instance2.attribute1, 'a1')
self.assertEqual(instance2.attribute2, 'a2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_methods(self):
"""Test getting of instances with method injections."""
provider = di.Singleton(Example,
di.Method('method1', 'm1'),
di.Method('method2', 'm2'))
instance1 = provider()
instance2 = provider()
self.assertEqual(instance1.method1_value, 'm1')
self.assertEqual(instance1.method2_value, 'm2')
self.assertEqual(instance2.method1_value, 'm1')
self.assertEqual(instance2.method2_value, 'm2')
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, Example)
self.assertIsInstance(instance2, Example)
def test_call_with_context_args(self):
"""Test getting of instances with context args."""
provider = di.Singleton(Example)
instance = provider(11, 22)
self.assertEqual(instance.init_arg1, 11)
self.assertEqual(instance.init_arg2, 22)
def test_call_with_context_kwargs(self):
"""Test getting of instances with context kwargs."""
provider = di.Singleton(Example,
di.KwArg('init_arg1', 1))
instance1 = provider(init_arg2=22)
self.assertEqual(instance1.init_arg1, 1)
self.assertEqual(instance1.init_arg2, 22)
# Instance is created earlier
instance1 = provider(init_arg1=11, init_arg2=22)
self.assertEqual(instance1.init_arg1, 1)
self.assertEqual(instance1.init_arg2, 22)
def test_call_overridden(self):
"""Test getting of instances on overridden provider."""
provider = di.Singleton(Example)
overriding_provider1 = di.Singleton(dict)
overriding_provider2 = di.Singleton(object)
provider.override(overriding_provider1)
provider.override(overriding_provider2)
instance1 = provider()
instance2 = provider()
self.assertIs(instance1, instance2)
self.assertIsInstance(instance1, object) self.assertIsInstance(instance1, object)
self.assertIsInstance(instance2, object) self.assertIsInstance(instance2, object)
self.assertIs(instance1, instance2)
def test_injections(self):
"""Test getting a full list of injections using injections property."""
provider = di.Singleton(Example,
di.Arg(1),
di.KwArg('init_arg2', 2),
di.Attribute('attribute1', 3),
di.Attribute('attribute2', 4),
di.Method('method1', 5),
di.Method('method2', 6))
injections = provider.injections
self.assertEquals(len(injections), 6)
def test_reset(self): def test_reset(self):
"""Test creation and reset of single object.""" """Test creation and reset of single object."""