mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 01:47:36 +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._run(container.shutdown_resources())
 | 
				
			||||||
        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
					        self.assertEqual(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(shutdown_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.overridden, tuple())
 | 
				
			||||||
        self.assertEqual(container.p11.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.
 | 
					        """Test init and shutdown resources.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Methods .init_resources() and .shutdown_resources() should respect resources dependencies.
 | 
					        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(initialized_resources, ['r1', 'r2', 'r3', 'r1', 'r2', 'r3'])
 | 
				
			||||||
        self.assertEqual(shutdown_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 test_init_shutdown_nested_resources(self):
 | 
				
			||||||
        def _init1():
 | 
					        def _init1():
 | 
				
			||||||
            _init1.init_counter += 1
 | 
					            _init1.init_counter += 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user