1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
from __future__ import annotations
import os
from pathlib import Path
from typing import Any, Dict, List, Optional, Set
import pytest
from tox.config.loader.api import ConfigLoadArgs, Override
from tox.config.loader.memory import MemoryLoader
from tox.config.types import Command, EnvList
def test_memory_loader_repr() -> None:
loader = MemoryLoader(a=1)
assert repr(loader) == "MemoryLoader"
def test_memory_loader_override() -> None:
loader = MemoryLoader(a=1)
loader.overrides["a"] = Override("a=2")
args = ConfigLoadArgs([], "name", None)
loaded = loader.load("a", of_type=int, conf=None, factory=None, args=args)
assert loaded == 2
@pytest.mark.parametrize(
("value", "of_type", "outcome"),
[
(True, bool, True),
(1, int, 1),
("magic", str, "magic"),
({"1"}, Set[str], {"1"}),
([1], List[int], [1]),
({1: 2}, Dict[int, int], {1: 2}),
(Path.cwd(), Path, Path.cwd()),
(Command(["a"]), Command, Command(["a"])),
(EnvList("a,b"), EnvList, EnvList("a,b")),
(1, Optional[int], 1),
("1", Optional[str], "1"),
(0, bool, False),
(1, bool, True),
("1", int, 1),
(1, str, "1"),
({1}, Set[str], {"1"}),
({"1"}, List[int], [1]),
({"1": "2"}, Dict[int, int], {1: 2}),
(os.getcwd(), Path, Path.cwd()),
("pip list", Command, Command(["pip", "list"])),
("a\nb", EnvList, EnvList(["a", "b"])),
("1", Optional[int], 1),
],
)
def test_memory_loader(value: Any, of_type: type[Any], outcome: Any) -> None:
loader = MemoryLoader(**{"a": value}, kwargs={})
args = ConfigLoadArgs([], "name", None)
loaded = loader.load("a", of_type=of_type, conf=None, factory=None, args=args)
assert loaded == outcome
@pytest.mark.parametrize(
("value", "of_type", "exception", "msg"),
[
("m", int, ValueError, "invalid literal for int"),
({"m"}, Set[int], ValueError, "invalid literal for int"),
(["m"], List[int], ValueError, "invalid literal for int"),
({"m": 1}, Dict[int, int], ValueError, "invalid literal for int"),
({1: "m"}, Dict[int, int], ValueError, "invalid literal for int"),
(object, Path, TypeError, "expected str, bytes or os.PathLike object"),
(1, Command, TypeError, "1"),
(1, EnvList, TypeError, "1"),
],
)
def test_memory_loader_fails_invalid(value: Any, of_type: type[Any], exception: Exception, msg: str) -> None:
loader = MemoryLoader(**{"a": value}, kwargs={})
args = ConfigLoadArgs([], "name", None)
with pytest.raises(exception, match=msg): # type: ignore[call-overload]
loader.load("a", of_type=of_type, conf=None, factory=None, args=args)
def test_memory_found_keys() -> None:
loader = MemoryLoader(a=1, c=2)
assert loader.found_keys() == {"a", "c"}
def test_memory_loader_contains() -> None:
loader = MemoryLoader(a=1)
assert "a" in loader
assert "b" not in loader
|