@@ -120,6 +120,7 @@ def reset_observability_state() -> None:
120120 observability_enabled = True ,
121121 observability_sink_name = DEFAULT_CONTROL_EVENT_SINK_NAME ,
122122 observability_sink_config = {},
123+ api_key_header = "X-API-Key" ,
123124 )
124125 with obs ._used_custom_event_sinks_lock :
125126 obs ._used_custom_event_sinks .clear ()
@@ -136,6 +137,7 @@ class TestEventBatcherInit:
136137 def test_init_default_values (self ):
137138 """Test EventBatcher initializes with default values."""
138139 batcher = EventBatcher ()
140+ assert batcher .api_key_header == get_settings ().api_key_header
139141 assert batcher .batch_size == get_settings ().batch_size
140142 assert batcher .flush_interval == get_settings ().flush_interval
141143 assert batcher .shutdown_join_timeout == get_settings ().shutdown_join_timeout
@@ -149,32 +151,37 @@ def test_init_custom_values(self):
149151 batcher = EventBatcher (
150152 server_url = "http://custom:9000" ,
151153 api_key = "test-key" ,
154+ api_key_header = "X-Custom-API-Key" ,
152155 batch_size = 50 ,
153156 flush_interval = 5.0 ,
154157 )
155158 assert batcher .server_url == "http://custom:9000"
156159 assert batcher .api_key == "test-key"
160+ assert batcher .api_key_header == "X-Custom-API-Key"
157161 assert batcher .batch_size == 50
158162 assert batcher .flush_interval == 5.0
159163
160164 def test_init_from_settings (self ):
161165 """Test EventBatcher reads from settings."""
162166 from agent_control .settings import configure_settings
163167
164- # Save original values
165- original_url = get_settings ().url
166- original_api_key = get_settings ().api_key
168+ original_settings = get_settings ().model_dump ()
167169
168170 try :
169171 # Configure settings programmatically
170- configure_settings (url = "http://configured-server:8080" , api_key = "configured-api-key" )
172+ configure_settings (
173+ url = "http://configured-server:8080" ,
174+ api_key = "configured-api-key" ,
175+ api_key_header = "X-Custom-API-Key" ,
176+ )
171177
172178 batcher = EventBatcher ()
173179 assert batcher .server_url == "http://configured-server:8080"
174180 assert batcher .api_key == "configured-api-key"
181+ assert batcher .api_key_header == "X-Custom-API-Key"
175182 finally :
176183 # Restore original settings
177- configure_settings (url = original_url , api_key = original_api_key )
184+ configure_settings (** original_settings )
178185
179186
180187class TestEventBatcherStartStop :
@@ -557,6 +564,46 @@ def test_send_batch_sync_returns_true_on_202(self):
557564 assert result is True
558565 client_ctor .assert_called_once_with (timeout = 30.0 )
559566 client .post .assert_called_once ()
567+ assert client .post .call_args .kwargs ["headers" ]["X-API-Key" ] == "test-key"
568+
569+ def test_send_batch_sync_uses_configured_api_key_header (self ):
570+ batcher = EventBatcher (
571+ server_url = "http://test:8000" ,
572+ api_key = "test-key" ,
573+ api_key_header = "X-Custom-API-Key" ,
574+ )
575+ response = MagicMock (status_code = 202 , text = "accepted" )
576+ client = MagicMock ()
577+ client .post .return_value = response
578+ client_context = MagicMock ()
579+ client_context .__enter__ .return_value = client
580+
581+ with patch (
582+ "agent_control.observability.httpx.Client" ,
583+ return_value = client_context ,
584+ ):
585+ result = batcher ._send_batch_sync ([create_mock_event ()])
586+
587+ assert result is True
588+ headers = client .post .call_args .kwargs ["headers" ]
589+ assert headers ["X-Custom-API-Key" ] == "test-key"
590+ assert "X-API-Key" not in headers
591+
592+ def test_build_batch_request_uses_settings_api_key_header (self ):
593+ original_settings = get_settings ().model_dump ()
594+ try :
595+ configure_settings (
596+ api_key = "settings-key" ,
597+ api_key_header = "X-Custom-API-Key" ,
598+ )
599+ batcher = EventBatcher ()
600+
601+ _ , headers , _ = batcher ._build_batch_request ([create_mock_event ()])
602+
603+ assert headers ["X-Custom-API-Key" ] == "settings-key"
604+ assert "X-API-Key" not in headers
605+ finally :
606+ configure_settings (** original_settings )
560607
561608 def test_send_batch_sync_returns_false_on_401_without_retry (self ):
562609 batcher = EventBatcher ()
@@ -1069,10 +1116,12 @@ def test_init_enabled_creates_batcher(self):
10691116 result = init_observability (
10701117 server_url = "http://test:8000" ,
10711118 api_key = "test-key" ,
1119+ api_key_header = "X-Custom-API-Key" ,
10721120 enabled = True ,
10731121 )
10741122 assert result is not None
10751123 assert isinstance (result , EventBatcher )
1124+ assert result .api_key_header == "X-Custom-API-Key"
10761125 assert result ._running is True
10771126 assert get_event_sink () is not None
10781127
0 commit comments