mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 01:47:36 +03:00 
			
		
		
		
	* Add pytest and pytest-asyncio to the requirements * Update aiohttp ext test * Update setup.cfg * Update tox.ini * Add pytest to the tox requirements * Update tox.ini * Move configuration to tox.ini * Add pytest configs * Rename pytest-py34-py35.ini -> pytest-py35.ini * Update config file paths * Update makefile * Migrate common tests to pytest * Migrate FastAPI and Flask wiring tests * Rename flask and fastapi wiring test files * Move wiring autoloader tests * Add pytest-asyncio to the tox.ini * Migrate wiring async injection tests * Migrate main wiring tests * Migrate wiring string module and package names tests * Migrate wiring config tests * Migrate misc wiring tests * Update tests structure * Migrate misc wiring tests * Refactor container.from_schema() API tests * Migrate container.from_schema() integration tests * Rename schema samples * Update sample imports * Migrate container tests * Refactor container tests * Migrate container self tests * Migrate container instance tests * Migrate container custom string attribute name tests * Migrate container async resource tests * Fix py2 container tests * Migrate container cls tests * Migrate container class custom string cls as atrribute name tests * Migrate ext.aiohttp tests * Migrate ext.flasks tests * Update ext package tests doc block * Migrate provider utils tests * Migrate Factory async mode tests * Migrate async tests * Rename common test module * Refactor asserts in provider tests * Migrate factory tests * Migrate selector provider tests * Migrate object provider tests * Migrate self provider tests * Migrate delegate provider tests * Migrate provider tests * Migrate dependency provider tests * Migrate dependencies container provider tests * Fix warnings * Migrate list provider tests * Migrate dict provider tests * Migrate callable tests * Migrate injection tests * Migrate container provider tests * Migrate coroutine providers * Migrate traversal tests * Migrate resource tests * Migrate configuration tests * Migrate provided instance provider tests * Update doc blocks and imports * Migrate singleton tests * Update changelog and cosmetic fixes
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""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 raises
 | 
						|
 | 
						|
 | 
						|
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}
 |