1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
23using System . Linq ;
34using System . Net ;
45using System . Net . Http ;
@@ -41,7 +42,7 @@ public async Task WhenCallingUrl_AddsDefaultAblyLibraryVersionHeader()
4142 {
4243 var response = new HttpResponseMessage ( HttpStatusCode . Accepted ) { Content = new StringContent ( "Success" ) } ;
4344 var handler = new FakeHttpMessageHandler ( response ) ;
44- var client = new AblyHttpClient ( new AblyHttpOptions ( ) , handler ) ;
45+ var client = new AblyHttpClient ( new AblyHttpOptions { HttpClient = new HttpClient ( handler ) } ) ;
4546
4647 await client . Execute ( new AblyRequest ( "/test" , HttpMethod . Get ) ) ;
4748 var values = handler . LastRequest . Headers . GetValues ( "X-Ably-Version" ) . ToArray ( ) ;
@@ -55,7 +56,7 @@ public async Task WhenCallingUrl_AddsRequestIdIfSetTrue()
5556 {
5657 var response = new HttpResponseMessage ( HttpStatusCode . Accepted ) { Content = new StringContent ( "Success" ) } ;
5758 var handler = new FakeHttpMessageHandler ( response ) ;
58- var client = new AblyHttpClient ( new AblyHttpOptions { AddRequestIds = true } , handler ) ;
59+ var client = new AblyHttpClient ( new AblyHttpOptions { AddRequestIds = true , HttpClient = new HttpClient ( handler ) } ) ;
5960 var ablyRequest = new AblyRequest ( "/test" , HttpMethod . Get ) ;
6061 ablyRequest . AddHeaders ( new Dictionary < string , string > { { "request_id" , "custom_request_id" } } ) ;
6162 await client . Execute ( ablyRequest ) ;
@@ -69,7 +70,7 @@ public async Task WhenCallingUrlWithPostParamsAndEmptyBody_PassedTheParamsAsUrlE
6970 {
7071 var response = new HttpResponseMessage ( HttpStatusCode . Accepted ) { Content = new StringContent ( "Success" ) } ;
7172 var handler = new FakeHttpMessageHandler ( response ) ;
72- var client = new AblyHttpClient ( new AblyHttpOptions ( ) , handler ) ;
73+ var client = new AblyHttpClient ( new AblyHttpOptions { HttpClient = new HttpClient ( handler ) } ) ;
7374
7475 var ablyRequest = new AblyRequest ( "/test" , HttpMethod . Post )
7576 {
@@ -88,7 +89,7 @@ public async Task WhenCallingUrl_AddsDefaultAblyAgentHeader()
8889 {
8990 var response = new HttpResponseMessage ( HttpStatusCode . Accepted ) { Content = new StringContent ( "Success" ) } ;
9091 var handler = new FakeHttpMessageHandler ( response ) ;
91- var client = new AblyHttpClient ( new AblyHttpOptions ( ) , handler ) ;
92+ var client = new AblyHttpClient ( new AblyHttpOptions { HttpClient = new HttpClient ( handler ) } ) ;
9293
9394 await client . Execute ( new AblyRequest ( "/test" , HttpMethod . Get ) ) ;
9495 string [ ] values = handler . LastRequest . Headers . GetValues ( "Ably-Agent" ) . ToArray ( ) ;
@@ -127,9 +128,10 @@ public async Task WhenCallingUrl_AddsCustomizedAblyAgentHeader()
127128 { "agent1" , "value1" } ,
128129 { "agent2" , "value2" } ,
129130 } ,
131+ HttpClient = new HttpClient ( handler )
130132 } ;
131133
132- var client = new AblyHttpClient ( ablyHttpOptions , handler ) ;
134+ var client = new AblyHttpClient ( ablyHttpOptions ) ;
133135
134136 await client . Execute ( new AblyRequest ( "/test" , HttpMethod . Get ) ) ;
135137 string [ ] values = handler . LastRequest . Headers . GetValues ( "Ably-Agent" ) . ToArray ( ) ;
@@ -190,5 +192,88 @@ public void IsRetryableResponse_WithErrorCode_ShouldReturnExpectedValue(
190192 AblyHttpClient . IsRetryableResponse ( response ) . Should ( ) . Be ( expected ) ;
191193 }
192194 }
195+
196+ public class ExternalHttpClientSpecs
197+ {
198+ [ Fact ]
199+ public void WithExternalHttpClient_ShouldUseProvidedClient ( )
200+ {
201+ // Arrange
202+ var externalHttpClient = new HttpClient ( ) ;
203+ var options = new AblyHttpOptions { HttpClient = externalHttpClient } ;
204+
205+ // Act
206+ var ablyHttpClient = new AblyHttpClient ( options ) ;
207+
208+ // Assert
209+ ablyHttpClient . Client . Should ( ) . BeSameAs ( externalHttpClient ) ;
210+ }
211+
212+ [ Fact ]
213+ public void WithExternalHttpClient_ShouldStillAddAblyHeaders ( )
214+ {
215+ // Arrange
216+ var externalHttpClient = new HttpClient ( ) ;
217+ var options = new AblyHttpOptions { HttpClient = externalHttpClient } ;
218+
219+ // Act
220+ var ablyHttpClient = new AblyHttpClient ( options ) ;
221+
222+ // Assert
223+ ablyHttpClient . Client . DefaultRequestHeaders . Contains ( "X-Ably-Version" ) . Should ( ) . BeTrue ( ) ;
224+ ablyHttpClient . Client . DefaultRequestHeaders . Contains ( "Ably-Agent" ) . Should ( ) . BeTrue ( ) ;
225+ }
226+
227+ [ Fact ]
228+ public void WithExternalHttpClient_ShouldSetTimeout ( )
229+ {
230+ // Arrange
231+ var externalHttpClient = new HttpClient ( ) ;
232+ var timeout = TimeSpan . FromSeconds ( 30 ) ;
233+ var options = new AblyHttpOptions
234+ {
235+ HttpClient = externalHttpClient ,
236+ HttpRequestTimeout = timeout
237+ } ;
238+
239+ // Act
240+ var ablyHttpClient = new AblyHttpClient ( options ) ;
241+
242+ // Assert
243+ ablyHttpClient . Client . Timeout . Should ( ) . Be ( timeout ) ;
244+ }
245+
246+ [ Fact ]
247+ public void WithoutExternalHttpClient_ShouldCreateNewClient ( )
248+ {
249+ // Arrange
250+ var options = new AblyHttpOptions ( ) ;
251+ options . HttpClient . Should ( ) . BeNull ( ) ;
252+
253+ // Act
254+ var ablyHttpClient = new AblyHttpClient ( options ) ;
255+
256+ // Assert
257+ ablyHttpClient . Client . Should ( ) . NotBeNull ( ) ;
258+ }
259+
260+ [ Fact ]
261+ public async Task WithExternalHttpClient_ShouldMakeSuccessfulRequests ( )
262+ {
263+ // Arrange
264+ var response = new HttpResponseMessage ( HttpStatusCode . Accepted ) { Content = new StringContent ( "Success" ) } ;
265+ var handler = new FakeHttpMessageHandler ( response ) ;
266+ var externalHttpClient = new HttpClient ( handler ) ;
267+ var options = new AblyHttpOptions { HttpClient = externalHttpClient } ;
268+ var ablyHttpClient = new AblyHttpClient ( options ) ;
269+
270+ // Act
271+ var result = await ablyHttpClient . Execute ( new AblyRequest ( "/test" , HttpMethod . Get ) ) ;
272+
273+ // Assert
274+ result . StatusCode . Should ( ) . Be ( HttpStatusCode . Accepted ) ;
275+ handler . NumberOfRequests . Should ( ) . Be ( 1 ) ;
276+ }
277+ }
193278 }
194279}
0 commit comments