66import httpx
77import pytest
88
9- from src .glean .api_client ._hooks .x_glean import XGlean
9+ from src .glean .api_client ._hooks .x_glean import (
10+ XGlean ,
11+ EXCLUDE_DEPRECATED_AFTER_HEADER ,
12+ INCLUDE_EXPERIMENTAL_HEADER ,
13+ EXCLUDE_DEPRECATED_AFTER_ENV_VAR ,
14+ INCLUDE_EXPERIMENTAL_ENV_VAR ,
15+ )
1016from src .glean .api_client ._hooks .types import BeforeRequestContext , HookContext
1117from src .glean .api_client .sdkconfiguration import SDKConfiguration
1218
@@ -43,25 +49,25 @@ class TestXGleanHook:
4349 def clear_env_vars (self ):
4450 """Clear X-Glean environment variables before and after each test."""
4551 # Store original values
46- original_deprecated = os .environ .get ("X_GLEAN_EXCLUDE_DEPRECATED_AFTER" )
47- original_experimental = os .environ .get ("X_GLEAN_INCLUDE_EXPERIMENTAL" )
52+ original_deprecated = os .environ .get (EXCLUDE_DEPRECATED_AFTER_ENV_VAR )
53+ original_experimental = os .environ .get (INCLUDE_EXPERIMENTAL_ENV_VAR )
4854
4955 # Clear for test
50- os .environ .pop ("X_GLEAN_EXCLUDE_DEPRECATED_AFTER" , None )
51- os .environ .pop ("X_GLEAN_INCLUDE_EXPERIMENTAL" , None )
56+ os .environ .pop (EXCLUDE_DEPRECATED_AFTER_ENV_VAR , None )
57+ os .environ .pop (INCLUDE_EXPERIMENTAL_ENV_VAR , None )
5258
5359 yield
5460
5561 # Restore original values
5662 if original_deprecated is not None :
57- os .environ ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER" ] = original_deprecated
63+ os .environ [EXCLUDE_DEPRECATED_AFTER_ENV_VAR ] = original_deprecated
5864 else :
59- os .environ .pop ("X_GLEAN_EXCLUDE_DEPRECATED_AFTER" , None )
65+ os .environ .pop (EXCLUDE_DEPRECATED_AFTER_ENV_VAR , None )
6066
6167 if original_experimental is not None :
62- os .environ ["X_GLEAN_INCLUDE_EXPERIMENTAL" ] = original_experimental
68+ os .environ [INCLUDE_EXPERIMENTAL_ENV_VAR ] = original_experimental
6369 else :
64- os .environ .pop ("X_GLEAN_INCLUDE_EXPERIMENTAL" , None )
70+ os .environ .pop (INCLUDE_EXPERIMENTAL_ENV_VAR , None )
6571
6672 def test_no_headers_when_neither_options_nor_env_vars_set (self ):
6773 """Should not set any X-Glean headers when nothing is configured."""
@@ -71,8 +77,8 @@ def test_no_headers_when_neither_options_nor_env_vars_set(self):
7177
7278 result = hook .before_request (context , request )
7379
74- assert "X-Glean-Exclude-Deprecated-After" not in result .headers
75- assert "X-Glean-Include-Experimental" not in result .headers
80+ assert EXCLUDE_DEPRECATED_AFTER_HEADER not in result .headers
81+ assert INCLUDE_EXPERIMENTAL_HEADER not in result .headers
7682
7783 def test_sets_deprecated_header_from_sdk_option (self ):
7884 """Should set X-Glean-Exclude-Deprecated-After header from SDK option."""
@@ -82,7 +88,7 @@ def test_sets_deprecated_header_from_sdk_option(self):
8288
8389 result = hook .before_request (context , request )
8490
85- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2026-10-15"
91+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2026-10-15"
8692
8793 def test_sets_experimental_header_when_include_experimental_is_true (self ):
8894 """Should set X-Glean-Include-Experimental header when includeExperimental is True."""
@@ -92,7 +98,7 @@ def test_sets_experimental_header_when_include_experimental_is_true(self):
9298
9399 result = hook .before_request (context , request )
94100
95- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
101+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
96102
97103 def test_no_experimental_header_when_include_experimental_is_false (self ):
98104 """Should not set X-Glean-Include-Experimental header when includeExperimental is False."""
@@ -102,7 +108,7 @@ def test_no_experimental_header_when_include_experimental_is_false(self):
102108
103109 result = hook .before_request (context , request )
104110
105- assert "X-Glean-Include-Experimental" not in result .headers
111+ assert INCLUDE_EXPERIMENTAL_HEADER not in result .headers
106112
107113 def test_sets_both_headers_when_both_options_provided (self ):
108114 """Should set both headers when both options are provided."""
@@ -115,75 +121,75 @@ def test_sets_both_headers_when_both_options_provided(self):
115121
116122 result = hook .before_request (context , request )
117123
118- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2026-10-15"
119- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
124+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2026-10-15"
125+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
120126
121127 def test_sets_deprecated_header_from_env_var (self ):
122128 """Should set X-Glean-Exclude-Deprecated-After header from environment variable."""
123- os .environ ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER" ] = "2027-01-01"
129+ os .environ [EXCLUDE_DEPRECATED_AFTER_ENV_VAR ] = "2027-01-01"
124130
125131 hook = XGlean ()
126132 request = create_mock_request ()
127133 context = create_mock_context ()
128134
129135 result = hook .before_request (context , request )
130136
131- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2027-01-01"
137+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2027-01-01"
132138
133139 def test_sets_experimental_header_from_env_var (self ):
134140 """Should set X-Glean-Include-Experimental header from environment variable."""
135- os .environ ["X_GLEAN_INCLUDE_EXPERIMENTAL" ] = "true"
141+ os .environ [INCLUDE_EXPERIMENTAL_ENV_VAR ] = "true"
136142
137143 hook = XGlean ()
138144 request = create_mock_request ()
139145 context = create_mock_context ()
140146
141147 result = hook .before_request (context , request )
142148
143- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
149+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
144150
145151 def test_sets_both_headers_from_env_vars (self ):
146152 """Should set both headers from environment variables."""
147- os .environ ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER" ] = "2027-06-15"
148- os .environ ["X_GLEAN_INCLUDE_EXPERIMENTAL" ] = "true"
153+ os .environ [EXCLUDE_DEPRECATED_AFTER_ENV_VAR ] = "2027-06-15"
154+ os .environ [INCLUDE_EXPERIMENTAL_ENV_VAR ] = "true"
149155
150156 hook = XGlean ()
151157 request = create_mock_request ()
152158 context = create_mock_context ()
153159
154160 result = hook .before_request (context , request )
155161
156- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2027-06-15"
157- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
162+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2027-06-15"
163+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
158164
159165 def test_env_var_takes_precedence_for_deprecated (self ):
160166 """Environment variable should take precedence over SDK option for deprecated."""
161- os .environ ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER" ] = "2027-12-31"
167+ os .environ [EXCLUDE_DEPRECATED_AFTER_ENV_VAR ] = "2027-12-31"
162168
163169 hook = XGlean ()
164170 request = create_mock_request ()
165171 context = create_mock_context (exclude_deprecated_after = "2026-01-01" )
166172
167173 result = hook .before_request (context , request )
168174
169- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2027-12-31"
175+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2027-12-31"
170176
171177 def test_env_var_takes_precedence_for_experimental (self ):
172178 """Environment variable should take precedence over SDK option for experimental."""
173- os .environ ["X_GLEAN_INCLUDE_EXPERIMENTAL" ] = "true"
179+ os .environ [INCLUDE_EXPERIMENTAL_ENV_VAR ] = "true"
174180
175181 hook = XGlean ()
176182 request = create_mock_request ()
177183 context = create_mock_context (include_experimental = False )
178184
179185 result = hook .before_request (context , request )
180186
181- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
187+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
182188
183189 def test_env_vars_take_precedence_for_both_headers (self ):
184190 """Environment variables should take precedence for both headers when all are set."""
185- os .environ ["X_GLEAN_EXCLUDE_DEPRECATED_AFTER" ] = "2028-01-01"
186- os .environ ["X_GLEAN_INCLUDE_EXPERIMENTAL" ] = "true"
191+ os .environ [EXCLUDE_DEPRECATED_AFTER_ENV_VAR ] = "2028-01-01"
192+ os .environ [INCLUDE_EXPERIMENTAL_ENV_VAR ] = "true"
187193
188194 hook = XGlean ()
189195 request = create_mock_request ()
@@ -194,8 +200,8 @@ def test_env_vars_take_precedence_for_both_headers(self):
194200
195201 result = hook .before_request (context , request )
196202
197- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2028-01-01"
198- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
203+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2028-01-01"
204+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
199205
200206 def test_preserves_existing_headers (self ):
201207 """Should preserve existing headers when adding X-Glean headers."""
@@ -214,8 +220,8 @@ def test_preserves_existing_headers(self):
214220
215221 assert result .headers .get ("Authorization" ) == "Bearer token"
216222 assert result .headers .get ("Content-Type" ) == "application/json"
217- assert result .headers .get ("X-Glean-Exclude-Deprecated-After" ) == "2026-10-15"
218- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
223+ assert result .headers .get (EXCLUDE_DEPRECATED_AFTER_HEADER ) == "2026-10-15"
224+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
219225
220226 def test_returns_httpx_request_instance (self ):
221227 """Should return an httpx.Request instance."""
@@ -257,7 +263,7 @@ def test_handles_multipart_streaming_request(self):
257263
258264 result = hook .before_request (context , request )
259265
260- assert result .headers .get ("X-Glean-Include-Experimental" ) == "true"
266+ assert result .headers .get (INCLUDE_EXPERIMENTAL_HEADER ) == "true"
261267 assert result .method == "POST"
262268
263269
0 commit comments