66using System . Text ;
77using Elastic . Documentation . Api . Core . AskAi ;
88using Elastic . Documentation . Api . Infrastructure . Adapters . AskAi ;
9- using Elastic . Documentation . Api . Infrastructure . Aws ;
109using Elastic . Documentation . Api . Infrastructure . Gcp ;
1110using FakeItEasy ;
1211using FluentAssertions ;
12+ using Microsoft . Extensions . Configuration ;
1313using Microsoft . Extensions . Logging ;
1414using Xunit ;
1515
@@ -22,32 +22,39 @@ namespace Elastic.Documentation.Api.IntegrationTests;
2222/// </summary>
2323public class AskAiGatewayStreamingTests
2424{
25+ private static IConfiguration CreateTestConfiguration ( Dictionary < string , string ? > values ) =>
26+ new ConfigurationBuilder ( )
27+ . AddInMemoryCollection ( values )
28+ . Build ( ) ;
29+
2530 [ Fact ]
2631 public async Task AgentBuilderGatewayDoesNotDisposeHttpResponsePrematurely ( )
2732 {
2833 // Arrange
2934 var mockHandler = new MockHttpMessageHandler ( ) ;
3035 var sseResponse = """
31- data: {"type":"conversationStart","id":"conv123 ","conversation_id":"conv123 "}
36+ data: {"type":"conversationStart","id":"test ","conversation_id":"test "}
3237
33- data: {"type":"messageChunk","id":"msg1 ","content":"Hello World "}
38+ data: {"type":"messageChunk","id":"m1 ","content":"Hello"}
3439
35- data: {"type":"conversationEnd","id":"conv123"}
40+ data: {"type":"messageChunk","id":"m1","content":" World"}
41+
42+ data: {"type":"conversationEnd","id":"test"}
3643
3744
3845""" ;
3946
4047 mockHandler . SetResponse ( sseResponse , "text/event-stream" ) ;
4148
4249 using var httpClient = new HttpClient ( mockHandler ) ;
43- var mockParameterProvider = A . Fake < IParameterProvider > ( ) ;
44- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-url" , false , A < CancellationToken > . _ ) )
45- . Returns ( Task . FromResult ( " https://test-kibana.example.com") ) ;
46- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-apikey" , true , A < CancellationToken > . _ ) )
47- . Returns ( Task . FromResult ( "test-api-key" ) ) ;
50+ var kibanaOptions = new KibanaOptions ( CreateTestConfiguration ( new Dictionary < string , string ? >
51+ {
52+ [ "DOCUMENTATION_KIBANA_URL" ] = " https://test-kibana.example.com",
53+ [ "DOCUMENTATION_KIBANA_APIKEY" ] = "test-api-key"
54+ } ) ) ;
4855
4956 var mockLogger = A . Fake < ILogger < AgentBuilderAskAiGateway > > ( ) ;
50- var gateway = new AgentBuilderAskAiGateway ( httpClient , mockParameterProvider , mockLogger ) ;
57+ var gateway = new AgentBuilderAskAiGateway ( httpClient , kibanaOptions , mockLogger ) ;
5158
5259 var request = new AskAiRequest ( "Test message" , null ) ;
5360
@@ -95,14 +102,14 @@ public async Task AgentBuilderGatewayAllowsMultipleReadsFromStream()
95102 mockHandler . SetResponse ( sseResponse , "text/event-stream" ) ;
96103
97104 using var httpClient = new HttpClient ( mockHandler ) ;
98- var mockParameterProvider = A . Fake < IParameterProvider > ( ) ;
99- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-url" , A < bool > . _ , A < CancellationToken > . _ ) )
100- . Returns ( Task . FromResult ( " https://test-kibana.example.com") ) ;
101- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-apikey" , A < bool > . _ , A < CancellationToken > . _ ) )
102- . Returns ( Task . FromResult ( "test-api-key" ) ) ;
105+ var kibanaOptions = new KibanaOptions ( CreateTestConfiguration ( new Dictionary < string , string ? >
106+ {
107+ [ "DOCUMENTATION_KIBANA_URL" ] = " https://test-kibana.example.com",
108+ [ "DOCUMENTATION_KIBANA_APIKEY" ] = "test-api-key"
109+ } ) ) ;
103110
104111 var mockLogger = A . Fake < ILogger < AgentBuilderAskAiGateway > > ( ) ;
105- var gateway = new AgentBuilderAskAiGateway ( httpClient , mockParameterProvider , mockLogger ) ;
112+ var gateway = new AgentBuilderAskAiGateway ( httpClient , kibanaOptions , mockLogger ) ;
106113
107114 var request = new AskAiRequest ( "Test" , null ) ;
108115
@@ -128,37 +135,34 @@ public async Task AgentBuilderGatewayAllowsMultipleReadsFromStream()
128135 }
129136
130137 [ Fact ]
131- public async Task LlmGatewayGatewayDoesNotDisposeHttpResponsePrematurely ( )
138+ public async Task LlmGatewayDoesNotDisposeHttpResponsePrematurely ( )
132139 {
133140 // Arrange
134141 var mockHandler = new MockHttpMessageHandler ( ) ;
135142 var sseResponse = """
136- data: {"type":"conversationStart","id":"conv456 ","conversation_id":"conv456 "}
143+ data: {"type":"conversationStart","id":"test ","conversation_id":"test "}
137144
138- data: {"type":"reasoning","id ":"r1","message":"Analyzing question "}
145+ data: {"type":"reasoning","content ":"thinking... "}
139146
140- data: {"type":"messageChunk","id":"msg2 ","content":"Answer "}
147+ data: {"type":"messageChunk","id":"m1 ","content":"Response "}
141148
142- data: {"type":"conversationEnd","id":"conv456 "}
149+ data: {"type":"conversationEnd","id":"test "}
143150
144151
145152""" ;
146153
147154 mockHandler . SetResponse ( sseResponse , "text/event-stream" ) ;
148155
149- // Create mock token provider
150156 using var httpClient = new HttpClient ( mockHandler ) ;
151157 var mockTokenProvider = A . Fake < IGcpIdTokenProvider > ( ) ;
152158 A . CallTo ( ( ) => mockTokenProvider . GenerateIdTokenAsync ( A < string > . _ , A < string > . _ , A < CancellationToken > . _ ) )
153159 . Returns ( Task . FromResult ( "mock-gcp-token" ) ) ;
154160
155- var mockParameterProvider = A . Fake < IParameterProvider > ( ) ;
156- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "llm-gateway-service-account" , A < bool > . _ , A < CancellationToken > . _ ) )
157- . Returns ( Task . FromResult ( "test@example.com" ) ) ;
158- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "llm-gateway-function-url" , A < bool > . _ , A < CancellationToken > . _ ) )
159- . Returns ( Task . FromResult ( "https://test-llm-gateway.example.com" ) ) ;
160-
161- var options = new LlmGatewayOptions ( mockParameterProvider ) ;
161+ var options = new LlmGatewayOptions ( CreateTestConfiguration ( new Dictionary < string , string ? >
162+ {
163+ [ "LLM_GATEWAY_FUNCTION_URL" ] = "https://test-llm-gateway.example.com" ,
164+ [ "LLM_GATEWAY_SERVICE_ACCOUNT" ] = "test@example.com"
165+ } ) ) ;
162166
163167 var gateway = new LlmGatewayAskAiGateway ( httpClient , mockTokenProvider , options ) ;
164168
@@ -214,13 +218,11 @@ public async Task LlmGatewayGatewayAllowsMultipleReadsFromStream()
214218 A . CallTo ( ( ) => mockTokenProvider . GenerateIdTokenAsync ( A < string > . _ , A < string > . _ , A < CancellationToken > . _ ) )
215219 . Returns ( Task . FromResult ( "mock-token" ) ) ;
216220
217- var mockParameterProvider = A . Fake < IParameterProvider > ( ) ;
218- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "llm-gateway-service-account" , A < bool > . _ , A < CancellationToken > . _ ) )
219- . Returns ( Task . FromResult ( "test@example.com" ) ) ;
220- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "llm-gateway-function-url" , A < bool > . _ , A < CancellationToken > . _ ) )
221- . Returns ( Task . FromResult ( "https://test.example.com" ) ) ;
222-
223- var options = new LlmGatewayOptions ( mockParameterProvider ) ;
221+ var options = new LlmGatewayOptions ( CreateTestConfiguration ( new Dictionary < string , string ? >
222+ {
223+ [ "LLM_GATEWAY_FUNCTION_URL" ] = "https://test.example.com" ,
224+ [ "LLM_GATEWAY_SERVICE_ACCOUNT" ] = "test@example.com"
225+ } ) ) ;
224226
225227 var gateway = new LlmGatewayAskAiGateway ( httpClient , mockTokenProvider , options ) ;
226228
@@ -256,14 +258,14 @@ public async Task AgentBuilderGatewayUsesResponseHeadersReadForStreaming()
256258 mockHandler . SetResponse ( sseResponse , "text/event-stream" ) ;
257259
258260 using var httpClient = new HttpClient ( mockHandler ) ;
259- var mockParameterProvider = A . Fake < IParameterProvider > ( ) ;
260- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-url" , A < bool > . _ , A < CancellationToken > . _ ) )
261- . Returns ( Task . FromResult ( " https://test-kibana.example.com") ) ;
262- A . CallTo ( ( ) => mockParameterProvider . GetParam ( "docs-kibana-apikey" , A < bool > . _ , A < CancellationToken > . _ ) )
263- . Returns ( Task . FromResult ( "test-api-key" ) ) ;
261+ var kibanaOptions = new KibanaOptions ( CreateTestConfiguration ( new Dictionary < string , string ? >
262+ {
263+ [ "DOCUMENTATION_KIBANA_URL" ] = " https://test-kibana.example.com",
264+ [ "DOCUMENTATION_KIBANA_APIKEY" ] = "test-api-key"
265+ } ) ) ;
264266
265267 var mockLogger = A . Fake < ILogger < AgentBuilderAskAiGateway > > ( ) ;
266- var gateway = new AgentBuilderAskAiGateway ( httpClient , mockParameterProvider , mockLogger ) ;
268+ var gateway = new AgentBuilderAskAiGateway ( httpClient , kibanaOptions , mockLogger ) ;
267269
268270 var request = new AskAiRequest ( "Test" , null ) ;
269271
0 commit comments