mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Add tests for init and shutdown ordering
This commit is contained in:
		
							parent
							
								
									f5e76aef28
								
							
						
					
					
						commit
						23909d55d6
					
				| 
						 | 
					@ -1,6 +1,5 @@
 | 
				
			||||||
"""Dependency injector dynamic container unit tests for async resources."""
 | 
					"""Dependency injector dynamic container unit tests for async resources."""
 | 
				
			||||||
 | 
					import asyncio
 | 
				
			||||||
import unittest
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Runtime import to get asyncutils module
 | 
					# Runtime import to get asyncutils module
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
| 
						 | 
					@ -23,49 +22,60 @@ from dependency_injector import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AsyncResourcesTest(AsyncTestCase):
 | 
					class AsyncResourcesTest(AsyncTestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @unittest.skipIf(sys.version_info[:2] <= (3, 5), 'Async test')
 | 
					    def test_init_and_shutdown_ordering(self):
 | 
				
			||||||
    def test_async_init_resources(self):
 | 
					        """Test init and shutdown resources.
 | 
				
			||||||
        async def _init1():
 | 
					 | 
				
			||||||
            _init1.init_counter += 1
 | 
					 | 
				
			||||||
            yield
 | 
					 | 
				
			||||||
            _init1.shutdown_counter += 1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _init1.init_counter = 0
 | 
					        Methods .init_resources() and .shutdown_resources() should respect resources dependencies.
 | 
				
			||||||
        _init1.shutdown_counter = 0
 | 
					        Initialization should first initialize resources without dependencies and then provide
 | 
				
			||||||
 | 
					        these resources to other resources. Resources shutdown should follow the same rule: first
 | 
				
			||||||
 | 
					        shutdown resources without initialized dependencies and then continue correspondingly
 | 
				
			||||||
 | 
					        until all resources are shutdown.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        initialized_resources = []
 | 
				
			||||||
 | 
					        shutdown_resources = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        async def _init2():
 | 
					        async def _resource(name, delay, **_):
 | 
				
			||||||
            _init2.init_counter += 1
 | 
					            await asyncio.sleep(delay)
 | 
				
			||||||
            yield
 | 
					            initialized_resources.append(name)
 | 
				
			||||||
            _init2.shutdown_counter += 1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _init2.init_counter = 0
 | 
					            yield name
 | 
				
			||||||
        _init2.shutdown_counter = 0
 | 
					
 | 
				
			||||||
 | 
					            await asyncio.sleep(delay)
 | 
				
			||||||
 | 
					            shutdown_resources.append(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class Container(containers.DeclarativeContainer):
 | 
					        class Container(containers.DeclarativeContainer):
 | 
				
			||||||
            resource1 = providers.Resource(_init1)
 | 
					            resource1 = providers.Resource(
 | 
				
			||||||
            resource2 = providers.Resource(_init2)
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r1',
 | 
				
			||||||
 | 
					                delay=0.03,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            resource2 = providers.Resource(
 | 
				
			||||||
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r2',
 | 
				
			||||||
 | 
					                delay=0.02,
 | 
				
			||||||
 | 
					                r1=resource1,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            resource3 = providers.Resource(
 | 
				
			||||||
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r3',
 | 
				
			||||||
 | 
					                delay=0.01,
 | 
				
			||||||
 | 
					                r2=resource2,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container = Container()
 | 
					        container = Container()
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._run(container.init_resources())
 | 
					        self._run(container.init_resources())
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 1)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 0)
 | 
					        self.assertEqual(shutdown_resources, [])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 1)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._run(container.shutdown_resources())
 | 
					        self._run(container.shutdown_resources())
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 1)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 1)
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 1)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 1)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._run(container.init_resources())
 | 
					        self._run(container.init_resources())
 | 
				
			||||||
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._run(container.shutdown_resources())
 | 
					        self._run(container.shutdown_resources())
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 2)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 2)
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 2)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 2)
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,51 +192,56 @@ class DeclarativeContainerInstanceTests(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(container.overridden, tuple())
 | 
					        self.assertEqual(container.overridden, tuple())
 | 
				
			||||||
        self.assertEqual(container.p11.overridden, tuple())
 | 
					        self.assertEqual(container.p11.overridden, tuple())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_init_shutdown_resources(self):
 | 
					    def test_init_and_shutdown_ordering(self):
 | 
				
			||||||
        def _init1():
 | 
					        """Test init and shutdown resources.
 | 
				
			||||||
            _init1.init_counter += 1
 | 
					 | 
				
			||||||
            yield
 | 
					 | 
				
			||||||
            _init1.shutdown_counter += 1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _init1.init_counter = 0
 | 
					        Methods .init_resources() and .shutdown_resources() should respect resources dependencies.
 | 
				
			||||||
        _init1.shutdown_counter = 0
 | 
					        Initialization should first initialize resources without dependencies and then provide
 | 
				
			||||||
 | 
					        these resources to other resources. Resources shutdown should follow the same rule: first
 | 
				
			||||||
 | 
					        shutdown resources without initialized dependencies and then continue correspondingly
 | 
				
			||||||
 | 
					        until all resources are shutdown.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        initialized_resources = []
 | 
				
			||||||
 | 
					        shutdown_resources = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _init2():
 | 
					        def _resource(name, **_):
 | 
				
			||||||
            _init2.init_counter += 1
 | 
					            initialized_resources.append(name)
 | 
				
			||||||
            yield
 | 
					            yield name
 | 
				
			||||||
            _init2.shutdown_counter += 1
 | 
					            shutdown_resources.append(name)
 | 
				
			||||||
 | 
					 | 
				
			||||||
        _init2.init_counter = 0
 | 
					 | 
				
			||||||
        _init2.shutdown_counter = 0
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class Container(containers.DeclarativeContainer):
 | 
					        class Container(containers.DeclarativeContainer):
 | 
				
			||||||
            resource1 = providers.Resource(_init1)
 | 
					            resource1 = providers.Resource(
 | 
				
			||||||
            resource2 = providers.Resource(_init2)
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r1',
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            resource2 = providers.Resource(
 | 
				
			||||||
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r2',
 | 
				
			||||||
 | 
					                r1=resource1,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            resource3 = providers.Resource(
 | 
				
			||||||
 | 
					                _resource,
 | 
				
			||||||
 | 
					                name='r3',
 | 
				
			||||||
 | 
					                r2=resource2,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container = Container()
 | 
					        container = Container()
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 0)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container.init_resources()
 | 
					        container.init_resources()
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 1)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 0)
 | 
					        self.assertEqual(shutdown_resources, [])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 1)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container.shutdown_resources()
 | 
					        container.shutdown_resources()
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 1)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 1)
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 1)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 1)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container.init_resources()
 | 
					        container.init_resources()
 | 
				
			||||||
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        container.shutdown_resources()
 | 
					        container.shutdown_resources()
 | 
				
			||||||
        self.assertEqual(_init1.init_counter, 2)
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init1.shutdown_counter, 2)
 | 
					        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(_init2.init_counter, 2)
 | 
					 | 
				
			||||||
        self.assertEqual(_init2.shutdown_counter, 2)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_init_shutdown_nested_resources(self):
 | 
					    def test_init_shutdown_nested_resources(self):
 | 
				
			||||||
        def _init1():
 | 
					        def _init1():
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user