6
6
import pytest
7
7
8
8
from tests .config .loader .ini .replace .conftest import ReplaceOne
9
- from tox .pytest import MonkeyPatch
9
+ from tox .pytest import LogCaptureFixture , MonkeyPatch
10
10
11
11
12
12
def test_replace_env_set (replace_one : ReplaceOne , monkeypatch : MonkeyPatch ) -> None :
@@ -75,6 +75,20 @@ def test_replace_env_missing_default_from_env(replace_one: ReplaceOne, monkeypat
75
75
assert result == "yes"
76
76
77
77
78
+ def test_replace_env_var_multiple (replace_one : ReplaceOne , monkeypatch : MonkeyPatch ) -> None :
79
+ """Multiple env substitutions on a single line."""
80
+ monkeypatch .setenv ("MAGIC" , "MAGIC" )
81
+ monkeypatch .setenv ("TRAGIC" , "TRAGIC" )
82
+ result = replace_one ("{env:MAGIC} {env:TRAGIC} {env:MAGIC}" )
83
+ assert result == "MAGIC TRAGIC MAGIC"
84
+
85
+
86
+ def test_replace_env_var_multiple_default (replace_one : ReplaceOne ) -> None :
87
+ """Multiple env substitutions on a single line with default values."""
88
+ result = replace_one ("{env:MAGIC:foo} {env:TRAGIC:bar} {env:MAGIC:baz}" )
89
+ assert result == "foo bar baz"
90
+
91
+
78
92
def test_replace_env_var_circular (replace_one : ReplaceOne , monkeypatch : MonkeyPatch ) -> None :
79
93
"""Replacement values will not infinitely loop"""
80
94
monkeypatch .setenv ("MAGIC" , "{env:MAGIC}" )
@@ -97,12 +111,34 @@ def avoid_infinite_loop() -> None: # pragma: no cover
97
111
98
112
99
113
@pytest .mark .usefixtures ("reset_env_var_after_delay" )
100
- def test_replace_env_var_circular_flip_flop (replace_one : ReplaceOne , monkeypatch : MonkeyPatch ) -> None :
114
+ def test_replace_env_var_circular_flip_flop (
115
+ replace_one : ReplaceOne ,
116
+ monkeypatch : MonkeyPatch ,
117
+ caplog : LogCaptureFixture ,
118
+ ) -> None :
101
119
"""Replacement values will not infinitely loop back and forth"""
102
120
monkeypatch .setenv ("TRAGIC" , "{env:MAGIC}" )
103
121
monkeypatch .setenv ("MAGIC" , "{env:TRAGIC}" )
104
122
result = replace_one ("{env:MAGIC}" )
105
123
assert result == "{env:MAGIC}"
124
+ assert "circular chain between set env MAGIC, TRAGIC" in caplog .messages
125
+
126
+
127
+ @pytest .mark .usefixtures ("reset_env_var_after_delay" )
128
+ def test_replace_env_var_circular_flip_flop_5 (
129
+ replace_one : ReplaceOne ,
130
+ monkeypatch : MonkeyPatch ,
131
+ caplog : LogCaptureFixture ,
132
+ ) -> None :
133
+ """Replacement values will not infinitely loop back and forth (longer chain)"""
134
+ monkeypatch .setenv ("MAGIC" , "{env:TRAGIC}" )
135
+ monkeypatch .setenv ("TRAGIC" , "{env:RABBIT}" )
136
+ monkeypatch .setenv ("RABBIT" , "{env:HAT}" )
137
+ monkeypatch .setenv ("HAT" , "{env:TRICK}" )
138
+ monkeypatch .setenv ("TRICK" , "{env:MAGIC}" )
139
+ result = replace_one ("{env:MAGIC}" )
140
+ assert result == "{env:MAGIC}"
141
+ assert "circular chain between set env MAGIC, TRAGIC, RABBIT, HAT, TRICK" in caplog .messages
106
142
107
143
108
144
@pytest .mark .parametrize ("fallback" , [True , False ])
0 commit comments