1717import os
1818import warnings
1919
20+ from google .adk .features ._feature_registry import _FEATURE_OVERRIDES
2021from google .adk .features ._feature_registry import _FEATURE_REGISTRY
2122from google .adk .features ._feature_registry import _get_feature_config
2223from google .adk .features ._feature_registry import _register_feature
2324from google .adk .features ._feature_registry import _WARNED_FEATURES
2425from google .adk .features ._feature_registry import FeatureConfig
2526from google .adk .features ._feature_registry import FeatureStage
2627from google .adk .features ._feature_registry import is_feature_enabled
28+ from google .adk .features ._feature_registry import override_feature_enabled
2729import pytest
2830
2931FEATURE_CONFIG_WIP = FeatureConfig (FeatureStage .WIP , default_on = False )
3840
3941@pytest .fixture (autouse = True )
4042def reset_env_and_registry (monkeypatch ):
41- """Reset environment variables and registry before each test."""
43+ """Reset environment variables, registry and overrides before each test."""
4244 # Clean up environment variables
4345 for key in list (os .environ .keys ()):
4446 if key .startswith ("ADK_ENABLE_" ) or key .startswith ("ADK_DISABLE_" ):
@@ -47,11 +49,17 @@ def reset_env_and_registry(monkeypatch):
4749 # Reset warned features set
4850 _WARNED_FEATURES .clear ()
4951
52+ # Reset feature overrides
53+ _FEATURE_OVERRIDES .clear ()
54+
5055 yield
5156
5257 # Reset warned features set
5358 _WARNED_FEATURES .clear ()
5459
60+ # Reset feature overrides
61+ _FEATURE_OVERRIDES .clear ()
62+
5563
5664class TestGetFeatureConfig :
5765 """Tests for get_feature_config() function."""
@@ -159,3 +167,76 @@ def test_warn_once_per_feature(self, monkeypatch):
159167 assert "[EXPERIMENTAL] feature DISABLED_FEATURE is enabled." in str (
160168 w [0 ].message
161169 )
170+
171+
172+ class TestOverrideFeatureEnabled :
173+ """Tests for override_feature_enabled() function."""
174+
175+ def test_override_not_in_registry_raises_value_error (self ):
176+ """Overriding features not in registry raises ValueError."""
177+ with pytest .raises (ValueError ):
178+ override_feature_enabled ("UNKNOWN_FEATURE" , True )
179+
180+ def test_override_enables_disabled_feature (self ):
181+ """Programmatic override can enable a disabled feature."""
182+ _register_feature ("OVERRIDE_TEST" , FEATURE_CONFIG_EXPERIMENTAL_DISABLED )
183+ assert not is_feature_enabled ("OVERRIDE_TEST" )
184+
185+ override_feature_enabled ("OVERRIDE_TEST" , True )
186+ with warnings .catch_warnings (record = True ) as w :
187+ assert is_feature_enabled ("OVERRIDE_TEST" )
188+ assert len (w ) == 1
189+ assert "[EXPERIMENTAL] feature OVERRIDE_TEST is enabled." in str (
190+ w [0 ].message
191+ )
192+
193+ def test_override_disables_enabled_feature (self ):
194+ """Programmatic override can disable an enabled feature."""
195+ _register_feature ("OVERRIDE_TEST" , FEATURE_CONFIG_EXPERIMENTAL_ENABLED )
196+
197+ override_feature_enabled ("OVERRIDE_TEST" , False )
198+ with warnings .catch_warnings (record = True ) as w :
199+ assert not is_feature_enabled ("OVERRIDE_TEST" )
200+ assert not w
201+
202+ def test_override_takes_precedence_over_env_enable (self , monkeypatch ):
203+ """Programmatic override takes precedence over ADK_ENABLE_* env var."""
204+ _register_feature ("PRIORITY_TEST" , FEATURE_CONFIG_EXPERIMENTAL_DISABLED )
205+
206+ # Set env var to enable
207+ monkeypatch .setenv ("ADK_ENABLE_PRIORITY_TEST" , "true" )
208+ assert is_feature_enabled ("PRIORITY_TEST" )
209+
210+ # But override to disable
211+ override_feature_enabled ("PRIORITY_TEST" , False )
212+
213+ with warnings .catch_warnings (record = True ) as w :
214+ assert not is_feature_enabled ("PRIORITY_TEST" )
215+ assert not w
216+
217+ def test_override_takes_precedence_over_env_disable (self , monkeypatch ):
218+ """Programmatic override takes precedence over ADK_DISABLE_* env var."""
219+ _register_feature ("PRIORITY_TEST" , FEATURE_CONFIG_EXPERIMENTAL_ENABLED )
220+
221+ # Set env var to disable
222+ monkeypatch .setenv ("ADK_DISABLE_PRIORITY_TEST" , "true" )
223+ assert not is_feature_enabled ("PRIORITY_TEST" )
224+
225+ # But override to enable
226+ override_feature_enabled ("PRIORITY_TEST" , True )
227+
228+ with warnings .catch_warnings (record = True ) as w :
229+ assert is_feature_enabled ("PRIORITY_TEST" )
230+ assert len (w ) == 1
231+ assert "[EXPERIMENTAL] feature PRIORITY_TEST is enabled." in str (
232+ w [0 ].message
233+ )
234+
235+ def test_override_stable_feature_no_warning (self ):
236+ """Overriding stable features does not emit warnings."""
237+ _register_feature ("STABLE_OVERRIDE" , FEATURE_CONFIG_STABLE )
238+
239+ override_feature_enabled ("STABLE_OVERRIDE" , True )
240+ with warnings .catch_warnings (record = True ) as w :
241+ assert is_feature_enabled ("STABLE_OVERRIDE" )
242+ assert not w
0 commit comments