From 5c611ca01114bb9ed36e985c53418ac170847638 Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Wed, 13 Oct 2021 22:04:16 -0400 Subject: [PATCH] Refactor container.from_schema() API tests --- tests/unit/schema/test_container_api_py36.py | 150 ++++++++++++++++ tests/unit/schema/test_containers_api_py36.py | 162 ------------------ 2 files changed, 150 insertions(+), 162 deletions(-) create mode 100644 tests/unit/schema/test_container_api_py36.py delete mode 100644 tests/unit/schema/test_containers_api_py36.py diff --git a/tests/unit/schema/test_container_api_py36.py b/tests/unit/schema/test_container_api_py36.py new file mode 100644 index 00000000..f1ce38c5 --- /dev/null +++ b/tests/unit/schema/test_container_api_py36.py @@ -0,0 +1,150 @@ +"""Container API tests for building container from schema.""" + +import contextlib +import json +import pathlib +import re + +import yaml +from dependency_injector import containers, providers, errors +from pytest import fixture, raises + + +@fixture +def container(): + return containers.DynamicContainer() + + +def test_from_schema(container: containers.DynamicContainer): + container.from_schema( + { + "version": "1", + "container": { + "provider1": { + "provider": "Factory", + "provides": "list", + "args": [1, 2, 3], + }, + "provider2": { + "provider": "Factory", + "provides": "dict", + "kwargs": { + "one": "container.provider1", + "two": 2, + }, + }, + }, + }, + ) + + assert isinstance(container.provider1, providers.Factory) + assert container.provider1.provides is list + assert container.provider1.args == (1, 2, 3) + + assert isinstance(container.provider2, providers.Factory) + assert container.provider2.provides is dict + assert container.provider2.kwargs == {"one": container.provider1, "two": 2} + + +def test_from_yaml_schema(container: containers.DynamicContainer, tmp_path: pathlib.Path): + schema_path = tmp_path / "schema.yml" + with open(schema_path, "w") as file: + file.write(""" + version: "1" + container: + provider1: + provider: Factory + provides: list + args: + - 1 + - 2 + - 3 + provider2: + provider: Factory + provides: dict + kwargs: + one: container.provider1 + two: 2 + """) + container.from_yaml_schema(schema_path) + + assert isinstance(container.provider1, providers.Factory) + assert container.provider1.provides == list + assert container.provider1.args == (1, 2, 3) + + assert isinstance(container.provider2, providers.Factory) + assert container.provider2.provides is dict + assert container.provider2.kwargs == {"one": container.provider1, "two": 2} + + +def test_from_yaml_schema_with_loader(container: containers.DynamicContainer, tmp_path: pathlib.Path): + schema_path = tmp_path / "schema.yml" + with open(schema_path, "w") as file: + file.write(""" + version: "1" + container: + provider: + provider: Factory + provides: list + args: [1, 2, 3] + """) + container.from_yaml_schema(schema_path, loader=yaml.Loader) + + assert isinstance(container.provider, providers.Factory) + assert container.provider.provides is list + assert container.provider.args == (1, 2, 3) + + +def test_from_yaml_schema_no_yaml_installed(container: containers.DynamicContainer): + @contextlib.contextmanager + def no_yaml_module(): + containers.yaml = None + yield + containers.yaml = yaml + + error_message = re.escape( + "Unable to load yaml schema - PyYAML is not installed. " + "Install PyYAML or install Dependency Injector with yaml extras: " + "\"pip install dependency-injector[yaml]\"" + ) + + with no_yaml_module(): + with raises(errors.Error, match=error_message): + container.from_yaml_schema("./no-yaml-installed.yml") + + +def test_from_json_schema(container: containers.DynamicContainer, tmp_path: pathlib.Path): + schema_path = tmp_path / "schema.json" + with open(schema_path, "w") as file: + file.write( + json.dumps( + { + "version": "1", + "container": { + "provider1": { + "provider": "Factory", + "provides": "list", + "args": [1, 2, 3], + }, + "provider2": { + "provider": "Factory", + "provides": "dict", + "kwargs": { + "one": "container.provider1", + "two": 2, + }, + }, + }, + }, + indent=4, + ), + ) + container.from_json_schema(schema_path) + + assert isinstance(container.provider1, providers.Factory) + assert container.provider1.provides is list + assert container.provider1.args == (1, 2, 3) + + assert isinstance(container.provider2, providers.Factory) + assert container.provider2.provides is dict + assert container.provider2.kwargs == {"one": container.provider1, "two": 2} diff --git a/tests/unit/schema/test_containers_api_py36.py b/tests/unit/schema/test_containers_api_py36.py deleted file mode 100644 index 1678aabf..00000000 --- a/tests/unit/schema/test_containers_api_py36.py +++ /dev/null @@ -1,162 +0,0 @@ -import contextlib -import json -import os.path -import tempfile -import unittest - -import yaml -from dependency_injector import containers, providers, errors - - -class FromSchemaTests(unittest.TestCase): - - def test(self): - container = containers.DynamicContainer() - container.from_schema( - { - "version": "1", - "container": { - "provider1": { - "provider": "Factory", - "provides": "list", - "args": [1, 2, 3], - }, - "provider2": { - "provider": "Factory", - "provides": "dict", - "kwargs": { - "one": "container.provider1", - "two": 2, - }, - }, - }, - }, - ) - - self.assertIsInstance(container.provider1, providers.Factory) - self.assertIs(container.provider1.provides, list) - self.assertEqual(container.provider1.args, (1, 2, 3)) - - self.assertIsInstance(container.provider2, providers.Factory) - self.assertIs(container.provider2.provides, dict) - self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2}) - - -class FromYamlSchemaTests(unittest.TestCase): - - def test(self): - container = containers.DynamicContainer() - - with tempfile.TemporaryDirectory() as tmp_dir: - schema_path = os.path.join(tmp_dir, "schema.yml") - with open(schema_path, "w") as file: - file.write(""" - version: "1" - container: - provider1: - provider: Factory - provides: list - args: - - 1 - - 2 - - 3 - provider2: - provider: Factory - provides: dict - kwargs: - one: container.provider1 - two: 2 - """) - - container.from_yaml_schema(schema_path) - - self.assertIsInstance(container.provider1, providers.Factory) - self.assertIs(container.provider1.provides, list) - self.assertEqual(container.provider1.args, (1, 2, 3)) - - self.assertIsInstance(container.provider2, providers.Factory) - self.assertIs(container.provider2.provides, dict) - self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2}) - - def test_with_loader(self): - container = containers.DynamicContainer() - - with tempfile.TemporaryDirectory() as tmp_dir: - schema_path = os.path.join(tmp_dir, "schema.yml") - with open(schema_path, "w") as file: - file.write(""" - version: "1" - container: - provider: - provider: Factory - provides: list - args: [1, 2, 3] - """) - - container.from_yaml_schema(schema_path, loader=yaml.Loader) - - self.assertIsInstance(container.provider, providers.Factory) - self.assertIs(container.provider.provides, list) - self.assertEqual(container.provider.args, (1, 2, 3)) - - def test_no_yaml_installed(self): - @contextlib.contextmanager - def no_yaml_module(): - containers.yaml = None - yield - containers.yaml = yaml - - container = containers.DynamicContainer() - with no_yaml_module(): - with self.assertRaises(errors.Error) as error: - container.from_yaml_schema("./no-yaml-installed.yml") - - self.assertEqual( - error.exception.args[0], - "Unable to load yaml schema - PyYAML is not installed. " - "Install PyYAML or install Dependency Injector with yaml extras: " - "\"pip install dependency-injector[yaml]\"", - ) - - -class FromJsonSchemaTests(unittest.TestCase): - - def test(self): - container = containers.DynamicContainer() - - with tempfile.TemporaryDirectory() as tmp_dir: - schema_path = os.path.join(tmp_dir, "schema.json") - with open(schema_path, "w") as file: - file.write( - json.dumps( - { - "version": "1", - "container": { - "provider1": { - "provider": "Factory", - "provides": "list", - "args": [1, 2, 3], - }, - "provider2": { - "provider": "Factory", - "provides": "dict", - "kwargs": { - "one": "container.provider1", - "two": 2, - }, - }, - }, - }, - indent=4, - ), - ) - - container.from_json_schema(schema_path) - - self.assertIsInstance(container.provider1, providers.Factory) - self.assertIs(container.provider1.provides, list) - self.assertEqual(container.provider1.args, (1, 2, 3)) - - self.assertIsInstance(container.provider2, providers.Factory) - self.assertIs(container.provider2.provides, dict) - self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2})