Skip to content

Commit 9b4df5c

Browse files
committed
refactor: remove custom test overrides and use monkeypatch
1 parent 11313ec commit 9b4df5c

2 files changed

Lines changed: 23 additions & 70 deletions

File tree

packages/google-api-core/google/api_core/feature_gating_helpers.py

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@
2424
_TRUTHY_VALUES = ("y", "yes", "t", "true", "on", "1")
2525
_FALSY_VALUES = ("n", "no", "f", "false", "off", "0")
2626

27-
# Test-only overrides for environment variables.
28-
# This is intended ONLY for unit/integration testing to prevent mutating
29-
# os.environ.
30-
_TEST_ENV_OVERRIDES: Dict[str, bool] = {}
31-
3227

3328
def _strtobool(val: str) -> Optional[bool]:
3429
"""Convert a string representation of truth to a boolean."""
@@ -42,28 +37,8 @@ def _strtobool(val: str) -> Optional[bool]:
4237
raise ValueError(f"Invalid truth value: {val!r}")
4338

4439

45-
def set_test_env_override(name: str, value: Optional[bool]) -> None:
46-
"""Sets a test-only override for a specific environment variable.
47-
48-
This is intended ONLY for unit/integration testing to prevent mutating
49-
os.environ.
50-
"""
51-
if value is None:
52-
_TEST_ENV_OVERRIDES.pop(name, None)
53-
else:
54-
_TEST_ENV_OVERRIDES[name] = value
55-
56-
57-
def clear_test_env_overrides() -> None:
58-
"""Clears all test-only overrides."""
59-
_TEST_ENV_OVERRIDES.clear()
60-
61-
6240
def _get_env_bool(name: str) -> Optional[bool]:
6341
"""Retrieve the boolean value of an environment variable."""
64-
if name in _TEST_ENV_OVERRIDES:
65-
return _TEST_ENV_OVERRIDES[name]
66-
6742
val = os.getenv(name)
6843
if val is None:
6944
return None
@@ -108,7 +83,7 @@ def resolve_feature_flags(
10883
Args:
10984
env_var: The name of the environment variable controlling this feature.
11085
provider_key: The key in client_options/attributes for the programmatic provider.
111-
client_options: A dictionary or object containing client configuration.
86+
client_options: Optional. A dictionary or object containing client configuration.
11287
11388
Returns:
11489
bool: True if the feature is resolved to enabled, False otherwise.

packages/google-api-core/tests/unit/test_feature_gating_helpers.py

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,9 @@
1717
from google.api_core.feature_gating_helpers import (
1818
_get_env_bool,
1919
_strtobool,
20-
clear_test_env_overrides,
21-
set_test_env_override,
2220
)
2321

2422

25-
@pytest.fixture(autouse=True)
26-
def clean_overrides():
27-
yield
28-
clear_test_env_overrides()
29-
30-
3123
@pytest.mark.parametrize(
3224
"value,expected",
3325
[
@@ -74,30 +66,12 @@ def test_get_env_bool(monkeypatch):
7466
assert _get_env_bool("TEST_VAR") is None
7567

7668

77-
def test_set_test_env_override_clear_specific():
78-
"""Verify that setting an override to None clears that specific override.
79-
80-
This is important to ensure tests can reset individual environment overrides
81-
without affecting other overrides that might be set for other tests running
82-
concurrently or subsequently.
83-
"""
84-
set_test_env_override("TEST_A", True)
85-
set_test_env_override("TEST_B", True)
86-
assert _get_env_bool("TEST_A") is True
87-
assert _get_env_bool("TEST_B") is True
8869

89-
# Clear only TEST_A
90-
set_test_env_override("TEST_A", None)
9170

92-
# Verify TEST_A is cleared but TEST_B remains
93-
assert _get_env_bool("TEST_A") is None
94-
assert _get_env_bool("TEST_B") is True
95-
96-
97-
def test_resolve_feature_flags_ga_enabled_via_env():
71+
def test_resolve_feature_flags_ga_enabled_via_env(monkeypatch):
9872
"""Verify that a GA feature is enabled if its environment variable is True."""
9973
# Setup: We pass a GA environment variable set to True
100-
set_test_env_override("GOOGLE_SDK_PYTHON_TRACING_ENABLED", True)
74+
monkeypatch.setenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", "true")
10175

10276
# Action
10377
result = feature_gating_helpers.resolve_feature_flags(
@@ -110,13 +84,14 @@ def test_resolve_feature_flags_ga_enabled_via_env():
11084
assert result is True
11185

11286

113-
@pytest.mark.parametrize("exp_env_state", [None, False], ids=["missing", "disabled"])
114-
def test_resolve_feature_flags_exp_blocked_with_provider_fails_fast(exp_env_state):
87+
@pytest.mark.parametrize("exp_env_state", [None, "false"], ids=["missing", "disabled"])
88+
def test_resolve_feature_flags_exp_blocked_with_provider_fails_fast(monkeypatch, exp_env_state):
11589
"""Verify that passing a provider to an experimental feature raises ValueError if the experimental environment variable is disabled or missing."""
11690
# Setup: Experimental env var is set to exp_env_state (None means not set)
117-
set_test_env_override(
118-
"GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", exp_env_state
119-
)
91+
if exp_env_state is not None:
92+
monkeypatch.setenv("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", exp_env_state)
93+
else:
94+
monkeypatch.delenv("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", raising=False)
12095
client_options = {"tracer_provider": object()}
12196

12297
# Action & Assertion
@@ -128,9 +103,9 @@ def test_resolve_feature_flags_exp_blocked_with_provider_fails_fast(exp_env_stat
128103
)
129104

130105

131-
def test_resolve_feature_flags_exp_enabled_with_provider():
106+
def test_resolve_feature_flags_exp_enabled_with_provider(monkeypatch):
132107
"""Verify that experimental feature is enabled if the experimental environment variable is enabled and a provider is provided."""
133-
set_test_env_override("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", True)
108+
monkeypatch.setenv("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", "true")
134109
client_options = {"tracer_provider": object()}
135110

136111
result = feature_gating_helpers.resolve_feature_flags(
@@ -141,9 +116,9 @@ def test_resolve_feature_flags_exp_enabled_with_provider():
141116
assert result is True
142117

143118

144-
def test_resolve_feature_flags_exp_enabled_without_provider():
119+
def test_resolve_feature_flags_exp_enabled_without_provider(monkeypatch):
145120
"""Verify that experimental feature is enabled if the experimental environment variable is enabled and NO provider is provided."""
146-
set_test_env_override("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", True)
121+
monkeypatch.setenv("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", "true")
147122

148123
result = feature_gating_helpers.resolve_feature_flags(
149124
env_var="GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED",
@@ -153,9 +128,9 @@ def test_resolve_feature_flags_exp_enabled_without_provider():
153128
assert result is True
154129

155130

156-
def test_resolve_feature_flags_exp_disabled_without_provider():
131+
def test_resolve_feature_flags_exp_disabled_without_provider(monkeypatch):
157132
"""Verify that experimental feature is disabled if the experimental environment variable is disabled and NO provider is provided."""
158-
set_test_env_override("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", False)
133+
monkeypatch.setenv("GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED", "false")
159134

160135
result = feature_gating_helpers.resolve_feature_flags(
161136
env_var="GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED",
@@ -165,10 +140,10 @@ def test_resolve_feature_flags_exp_disabled_without_provider():
165140
assert result is False
166141

167142

168-
def test_resolve_feature_flags_ga_enabled_via_provider():
143+
def test_resolve_feature_flags_ga_enabled_via_provider(monkeypatch):
169144
"""Verify that a GA feature is enabled if a provider is provided, ignoring the environment variable."""
170145
# Env var is False, but provider is present
171-
set_test_env_override("GOOGLE_SDK_PYTHON_TRACING_ENABLED", False)
146+
monkeypatch.setenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", "false")
172147
client_options = {"tracer_provider": object()}
173148

174149
result = feature_gating_helpers.resolve_feature_flags(
@@ -180,11 +155,14 @@ def test_resolve_feature_flags_ga_enabled_via_provider():
180155

181156

182157
@pytest.mark.parametrize(
183-
"env_val", [None, False], ids=["env_not_set", "env_explicit_false"]
158+
"env_val", [None, "false"], ids=["env_not_set", "env_explicit_false"]
184159
)
185-
def test_resolve_feature_flags_ga_fallback_to_false(env_val):
160+
def test_resolve_feature_flags_ga_fallback_to_false(monkeypatch, env_val):
186161
"""Verify that a GA feature is disabled if neither a provider is provided nor the environment variable is enabled."""
187-
set_test_env_override("GOOGLE_SDK_PYTHON_TRACING_ENABLED", env_val)
162+
if env_val is not None:
163+
monkeypatch.setenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", env_val)
164+
else:
165+
monkeypatch.delenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", raising=False)
188166
result = feature_gating_helpers.resolve_feature_flags(
189167
env_var="GOOGLE_SDK_PYTHON_TRACING_ENABLED",
190168
provider_key="tracer_provider",

0 commit comments

Comments
 (0)