mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-23 15:10:49 +03:00
66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
import sys
|
|
from typing import Any, Dict, NoReturn
|
|
|
|
from pytest import raises
|
|
|
|
from dependency_injector.errors import NonCopyableArgumentError
|
|
from dependency_injector.providers import (
|
|
Provider,
|
|
deepcopy,
|
|
deepcopy_args,
|
|
deepcopy_kwargs,
|
|
)
|
|
|
|
|
|
class NonCopiable:
|
|
def __deepcopy__(self, memo: Dict[int, Any]) -> NoReturn:
|
|
raise NotImplementedError
|
|
|
|
|
|
def test_deepcopy_streams_not_copied() -> None:
|
|
l = [sys.stdin, sys.stdout, sys.stderr]
|
|
assert deepcopy(l) == l
|
|
|
|
|
|
def test_deepcopy_args() -> None:
|
|
provider = Provider[None]()
|
|
copiable = NonCopiable()
|
|
memo: Dict[int, Any] = {id(copiable): copiable}
|
|
|
|
assert deepcopy_args(provider, (1, copiable), memo) == (1, copiable)
|
|
|
|
|
|
def test_deepcopy_args_non_copiable() -> None:
|
|
provider = Provider[None]()
|
|
copiable = NonCopiable()
|
|
memo: Dict[int, Any] = {id(copiable): copiable}
|
|
|
|
with raises(
|
|
NonCopyableArgumentError,
|
|
match=r"^Couldn't copy argument at index 3 for provider ",
|
|
):
|
|
deepcopy_args(provider, (1, copiable, object(), NonCopiable()), memo)
|
|
|
|
|
|
def test_deepcopy_kwargs() -> None:
|
|
provider = Provider[None]()
|
|
copiable = NonCopiable()
|
|
memo: Dict[int, Any] = {id(copiable): copiable}
|
|
|
|
assert deepcopy_kwargs(provider, {"x": 1, "y": copiable}, memo) == {
|
|
"x": 1,
|
|
"y": copiable,
|
|
}
|
|
|
|
|
|
def test_deepcopy_kwargs_non_copiable() -> None:
|
|
provider = Provider[None]()
|
|
copiable = NonCopiable()
|
|
memo: Dict[int, Any] = {id(copiable): copiable}
|
|
|
|
with raises(
|
|
NonCopyableArgumentError,
|
|
match=r"^Couldn't copy keyword argument z for provider ",
|
|
):
|
|
deepcopy_kwargs(provider, {"x": 1, "y": copiable, "z": NonCopiable()}, memo)
|