def load(container_builder: ContainerBuilder): container_builder.set_definition( Definition("test.resources.test_full.autodiscover2.b.B", "test.resources.test_full.autodiscover2.b.B", [ Argument.no_kw_argument( "@test.resources.test_full.autodiscover1.a.A") ]))
class TestPyLoader(TestCase): def setUp(self) -> None: self._container_builder = ContainerBuilder([]) self.loader = PyLoader(self._container_builder) self.current_dir = os.path.dirname(__file__) def test_load_fails_for_non_absolute_path(self): with self.assertRaises(exceptions.PathNotAbsolute): self.loader.load("relative/path") def test_load_fails_for_non_existing_file(self): with self.assertRaises(exceptions.ResourceNotFound): self.loader.load("/non/existing/path") def test_load_fails_for_loader_without_load_method(self): path = os.path.join(self.current_dir, "..", "resources", "test_di_no_load_method.py") with self.assertRaises(exceptions.MissingLoaderMethod): self.loader.load(path) def test_load_works_as_expected(self): path = os.path.join(self.current_dir, "..", "resources", "test_di.py") self.loader.load(path) c = self._container_builder.get("example.C") self.assertIsInstance(c, C) self.assertIsInstance(c.b, B) self.assertIsInstance(c.a, A) def test_load_by_module_name_fails_for_non_existing_file(self): with self.assertRaises(exceptions.ResourceNotFound): self.loader.load_by_module_name("nonexistingpath") def test_load_by_module_name_fails_for_loader_without_load_method(self): with self.assertRaises(exceptions.MissingLoaderMethod): self.loader.load_by_module_name( "tests.resources.test_di_no_load_method") def test_load_by_module_name_works_as_expected(self): self.loader.load_by_module_name("tests.resources.test_di") c = self._container_builder.get("example.C") self.assertIsInstance(c, C) self.assertIsInstance(c.b, B) self.assertIsInstance(c.a, A) def test_load_dir(self): path = os.path.join(self.current_dir, "..", "resources", "loaders") self.loader.load_dir(path) self.assertIsInstance(self._container_builder.get("same_level_file"), A) self.assertIsInstance(self._container_builder.get("one_level_file"), A) self.assertIsInstance(self._container_builder.get("two_levels_file"), A) def test_load_dir_fails_for_non_absolute_path(self): with self.assertRaises(exceptions.PathNotAbsolute): self.loader.load_dir("tests/resources/loaders")
class TestContainerBuilder(TestCase): def setUp(self) -> None: self.container_builder = ContainerBuilder([]) self.definition_a = Definition("example.A", "tests.resources.class_a.A") self.definition_b = Definition( "example.B", "tests.resources.class_b.B", [Argument.no_kw_argument("@example.A")], ) self.definition_c = Definition( "example.C", "tests.resources.class_c.C", [ Argument.no_kw_argument("@example.A"), Argument("kw_arg", "test_param"), Argument("b", "@example.B"), ], ) def test_get_container_instance_retrieves_the_same_object(self): self.assertIs(ContainerBuilder.get_container_instance(), ContainerBuilder.get_container_instance()) def test_set_definition_fails_if_resolved(self): self.container_builder.resolve() with self.assertRaises(exceptions.ForbiddenChangeOnResolvedContainer): self.container_builder.set_definition(self.definition_a) def test_set_definitions_sets_properly_so_services_can_be_retrieved(self): self.container_builder.set_definition(self.definition_b) self.container_builder.set_definition(self.definition_a) self.container_builder.set_definition(self.definition_c) self.assertIsInstance(self.container_builder.get("example.C"), C)
def setUp(self) -> None: self.container_builder = ContainerBuilder([]) self.definition_a = Definition("example.A", "tests.resources.class_a.A") self.definition_b = Definition( "example.B", "tests.resources.class_b.B", [Argument.no_kw_argument("@example.A")], ) self.definition_c = Definition( "example.C", "tests.resources.class_c.C", [ Argument.no_kw_argument("@example.A"), Argument("kw_arg", "test_param"), Argument("b", "@example.B"), ], )
def _configure(self, app: Flask) -> None: if not hasattr(app, "extensions"): app.extensions = {} app.extensions["pypendency"] = {"container": ContainerBuilder([])} py_loader = PyLoader(app.extensions["pypendency"]["container"]) yaml_loader = YamlLoader(app.extensions["pypendency"]["container"]) di_folder_name = app.config.get("PYPENDENCY_DI_FOLDER_NAME") for registered_place in app.config.get("PYPENDENCY_DISCOVER_PATHS"): for di_folder in glob.glob( f"{registered_place}/**/{di_folder_name}", recursive=True): py_loader.load_dir(di_folder) yaml_loader.load_dir(di_folder)
class TestYamlLoader(TestCase): def setUp(self) -> None: self._container_builder = ContainerBuilder([]) self.loader = YamlLoader(self._container_builder) self.current_dir = os.path.dirname(__file__) def test_load_fails_for_non_absolute_path(self): with self.assertRaises(exceptions.PathNotAbsolute): self.loader.load("relative/path") def test_load_fails_for_non_existing_yaml(self): with self.assertRaises(exceptions.ResourceNotFound): self.loader.load("/non/existing/path") def test_load_fails_for_invalid_yaml(self): path = os.path.join(self.current_dir, "..", "resources", "test_invalid_di.yaml") with self.assertRaises(exceptions.ParsingErrorOnResource): self.loader.load(path) def test_load_does_nothing_for_empty_yaml(self): mocked_container = Mock(spec=ContainerBuilder) path = os.path.join(self.current_dir, "..", "resources", "test_empty.yaml") YamlLoader(mocked_container).load(path) mocked_container.set_definition.assert_not_called() def test_load_works_as_expected(self): path = os.path.join(self.current_dir, "..", "resources", "test_di.yaml") self.loader.load(path) self.assertIsInstance( self._container_builder.get("example.C"), C ) def test_load_dir(self): path = os.path.join(self.current_dir, "..", "resources", "loaders") self.loader.load_dir(path) self.assertIsInstance(self._container_builder.get("same_level_file"), A) self.assertIsInstance(self._container_builder.get("one_level_file"), A) self.assertIsInstance(self._container_builder.get("two_levels_file"), A) with self.assertRaises(ServiceNotFoundInContainer): self._container_builder.get("should_not_exist") def test_load_dir_fails_for_non_absolute_path(self): with self.assertRaises(exceptions.PathNotAbsolute): self.loader.load_dir("tests/resources/loaders")
def load(container_builder: ContainerBuilder): container_builder.set_definition( Definition('example.A', 'tests.resources.class_a.A') ) container_builder.set_definition( Definition( 'example.B', 'tests.resources.class_b.B', [Argument.no_kw_argument("@example.A")] ) ) container_builder.set_definition( Definition( 'example.C', 'tests.resources.class_c.C', [ Argument.no_kw_argument("@example.A"), Argument("b", "@example.B"), Argument("kw_arg", "test_param"), ] ) )
def load(container_builder: ContainerBuilder): container_builder.set_definition( Definition('same_level_file', 'tests.resources.class_a.A'))
def setUp(self) -> None: self._container_builder = ContainerBuilder([]) self.loader = PyLoader(self._container_builder) self.current_dir = os.path.dirname(__file__)
def test_get_container_instance_retrieves_the_same_object(self): self.assertIs(ContainerBuilder.get_container_instance(), ContainerBuilder.get_container_instance())