diff --git a/tests/unit/samples/wiringsamples/resourceclosing.py b/tests/unit/samples/wiringsamples/resourceclosing.py new file mode 100644 index 00000000..33a160ca --- /dev/null +++ b/tests/unit/samples/wiringsamples/resourceclosing.py @@ -0,0 +1,31 @@ +from dependency_injector import containers, providers +from dependency_injector.wiring import Provide, Closing + + +class Service: + init_counter: int = 0 + shutdown_counter: int = 0 + + @classmethod + def init(cls): + cls.init_counter += 1 + + @classmethod + def shutdown(cls): + cls.shutdown_counter += 1 + + +def init_service(): + service = Service() + service.init() + yield service + service.shutdown() + + +class Container(containers.DeclarativeContainer): + + service = providers.Resource(init_service) + + +def test_function(service: Service = Closing[Provide[Container.service]]): + return service diff --git a/tests/unit/wiring/test_wiring_py36.py b/tests/unit/wiring/test_wiring_py36.py index 14bdad84..f5b1a509 100644 --- a/tests/unit/wiring/test_wiring_py36.py +++ b/tests/unit/wiring/test_wiring_py36.py @@ -174,3 +174,22 @@ class WiringTest(unittest.TestCase): self.assertIsInstance(service, Service) self.assertEqual(some_value, 1) + + def test_closing_resource(self): + from wiringsamples import resourceclosing + + container = resourceclosing.Container() + container.wire(modules=[resourceclosing]) + self.addCleanup(container.unwire) + + result_1 = resourceclosing.test_function() + self.assertIsInstance(result_1, resourceclosing.Service) + self.assertEqual(result_1.init_counter, 1) + self.assertEqual(result_1.shutdown_counter, 1) + + result_2 = resourceclosing.test_function() + self.assertIsInstance(result_2, resourceclosing.Service) + self.assertEqual(result_2.init_counter, 2) + self.assertEqual(result_2.shutdown_counter, 2) + + self.assertIsNot(result_1, result_2)