mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Add circular dependencies breaker tests
This commit is contained in:
		
							parent
							
								
									23909d55d6
								
							
						
					
					
						commit
						f1073958d4
					
				| 
						 | 
				
			
			@ -79,3 +79,33 @@ class AsyncResourcesTest(AsyncTestCase):
 | 
			
		|||
        self._run(container.shutdown_resources())
 | 
			
		||||
        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
			
		||||
        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
			
		||||
 | 
			
		||||
    def test_shutdown_circular_dependencies_breaker(self):
 | 
			
		||||
        async def _resource(name, **_):
 | 
			
		||||
            yield name
 | 
			
		||||
 | 
			
		||||
        class Container(containers.DeclarativeContainer):
 | 
			
		||||
            resource1 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r1',
 | 
			
		||||
            )
 | 
			
		||||
            resource2 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r2',
 | 
			
		||||
                r1=resource1,
 | 
			
		||||
            )
 | 
			
		||||
            resource3 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r3',
 | 
			
		||||
                r2=resource2,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        container = Container()
 | 
			
		||||
        self._run(container.init_resources())
 | 
			
		||||
 | 
			
		||||
        # Create circular dependency after initialization (r3 -> r2 -> r1 -> r3 -> ...)
 | 
			
		||||
        container.resource1.add_kwargs(r3=container.resource3)
 | 
			
		||||
 | 
			
		||||
        with self.assertRaises(RuntimeError) as context:
 | 
			
		||||
            self._run(container.shutdown_resources())
 | 
			
		||||
        self.assertEqual(str(context.exception), 'Unable to resolve resources shutdown order')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ class DeclarativeContainerInstanceTests(unittest.TestCase):
 | 
			
		|||
        self.assertEqual(container.overridden, tuple())
 | 
			
		||||
        self.assertEqual(container.p11.overridden, tuple())
 | 
			
		||||
 | 
			
		||||
    def test_init_and_shutdown_ordering(self):
 | 
			
		||||
    def test_init_and_shutdown_resources_ordering(self):
 | 
			
		||||
        """Test init and shutdown resources.
 | 
			
		||||
 | 
			
		||||
        Methods .init_resources() and .shutdown_resources() should respect resources dependencies.
 | 
			
		||||
| 
						 | 
				
			
			@ -243,6 +243,36 @@ class DeclarativeContainerInstanceTests(unittest.TestCase):
 | 
			
		|||
        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
			
		||||
        self.assertEqual(shutdown_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
			
		||||
 | 
			
		||||
    def test_shutdown_resources_circular_dependencies_breaker(self):
 | 
			
		||||
        def _resource(name, **_):
 | 
			
		||||
            yield name
 | 
			
		||||
 | 
			
		||||
        class Container(containers.DeclarativeContainer):
 | 
			
		||||
            resource1 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r1',
 | 
			
		||||
            )
 | 
			
		||||
            resource2 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r2',
 | 
			
		||||
                r1=resource1,
 | 
			
		||||
            )
 | 
			
		||||
            resource3 = providers.Resource(
 | 
			
		||||
                _resource,
 | 
			
		||||
                name='r3',
 | 
			
		||||
                r2=resource2,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        container = Container()
 | 
			
		||||
        container.init_resources()
 | 
			
		||||
 | 
			
		||||
        # Create circular dependency after initialization (r3 -> r2 -> r1 -> r3 -> ...)
 | 
			
		||||
        container.resource1.add_kwargs(r3=container.resource3)
 | 
			
		||||
 | 
			
		||||
        with self.assertRaises(RuntimeError) as context:
 | 
			
		||||
            container.shutdown_resources()
 | 
			
		||||
        self.assertEqual(str(context.exception), 'Unable to resolve resources shutdown order')
 | 
			
		||||
 | 
			
		||||
    def test_init_shutdown_nested_resources(self):
 | 
			
		||||
        def _init1():
 | 
			
		||||
            _init1.init_counter += 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user