11using Termii ;
2+ using Termii . Tests . Infrastructure ;
23using Microsoft . Extensions . DependencyInjection ;
34using System . Net ;
4- using System . Text . Json ;
55using Xunit ;
66
77namespace Termii . Tests ;
@@ -33,38 +33,22 @@ public void ConstructorAcceptsValidOptions()
3333 [ Fact ]
3434 public async Task SendAsyncAddsApiKeyToQueryString ( )
3535 {
36- using var handler = new RecordingHttpMessageHandler ( ) ;
37- using var httpClient = new HttpClient ( handler )
38- {
39- BaseAddress = new Uri ( "https://example.test" ) ,
40- } ;
41- var client = new TermiiClient ( httpClient , new TermiiOptions
42- {
43- ApiKey = "test key" ,
44- BaseUrl = new Uri ( "https://example.test" ) ,
45- } ) ;
36+ using var handler = new TestHttpMessageHandler ( ) ;
37+ var client = TestTermiiClientFactory . Create ( handler , apiKey : "test key" ) ;
4638
4739 using var response = await client . SendAsync ( HttpMethod . Get , "/api/sms/inbox" , cancellationToken : CancellationToken . None ) ;
4840
4941 Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
50- Assert . Equal ( HttpMethod . Get , handler . Request ! . Method ) ;
51- Assert . Equal ( "https://example.test/api/sms/inbox?api_key=test%20key" , handler . Request . RequestUri ! . AbsoluteUri ) ;
52- Assert . Null ( handler . Request . Content ) ;
42+ Assert . Equal ( HttpMethod . Get , handler . LastRequest ! . Method ) ;
43+ Assert . Equal ( "https://example.test/api/sms/inbox?api_key=test%20key" , handler . LastRequest . RequestUri ! . AbsoluteUri ) ;
44+ Assert . Null ( handler . LastRequest . Content ) ;
5345 }
5446
5547 [ Fact ]
5648 public async Task SendAsyncAddsApiKeyToJsonBody ( )
5749 {
58- using var handler = new RecordingHttpMessageHandler ( ) ;
59- using var httpClient = new HttpClient ( handler )
60- {
61- BaseAddress = new Uri ( "https://example.test" ) ,
62- } ;
63- var client = new TermiiClient ( httpClient , new TermiiOptions
64- {
65- ApiKey = "test-api-key" ,
66- BaseUrl = new Uri ( "https://example.test" ) ,
67- } ) ;
50+ using var handler = new TestHttpMessageHandler ( ) ;
51+ var client = TestTermiiClientFactory . Create ( handler ) ;
6852
6953 using var response = await client . SendAsync (
7054 HttpMethod . Post ,
@@ -73,12 +57,13 @@ public async Task SendAsyncAddsApiKeyToJsonBody()
7357 TermiiAuthenticationLocation . Body ,
7458 CancellationToken . None ) ;
7559
76- var json = await handler . Request ! . Content ! . ReadAsStringAsync ( CancellationToken . None ) ;
77- using var document = JsonDocument . Parse ( json ) ;
60+ var request = handler . LastRequest ;
61+ Assert . NotNull ( request ) ;
62+ using var document = await request . ReadJsonBodyAsync ( CancellationToken . None ) ;
7863
7964 Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
80- Assert . Equal ( HttpMethod . Post , handler . Request . Method ) ;
81- Assert . Equal ( "https://example.test/api/sms/send" , handler . Request . RequestUri ! . ToString ( ) ) ;
65+ Assert . Equal ( HttpMethod . Post , request . Method ) ;
66+ Assert . Equal ( "https://example.test/api/sms/send" , request . RequestUri ! . ToString ( ) ) ;
8267 Assert . Equal ( "test-api-key" , document . RootElement . GetProperty ( "api_key" ) . GetString ( ) ) ;
8368 Assert . Equal ( "2348012345678" , document . RootElement . GetProperty ( "to" ) . GetString ( ) ) ;
8469 Assert . Equal ( "Termii" , document . RootElement . GetProperty ( "from" ) . GetString ( ) ) ;
@@ -88,18 +73,10 @@ public async Task SendAsyncAddsApiKeyToJsonBody()
8873 [ Fact ]
8974 public async Task SendAsyncThrowsTermiiApiExceptionForJsonErrorResponses ( )
9075 {
91- using var handler = new RecordingHttpMessageHandler (
76+ using var handler = new TestHttpMessageHandler (
9277 HttpStatusCode . BadRequest ,
9378 """{"message":"Invalid sender ID","code":"sender_id_invalid"}""" ) ;
94- using var httpClient = new HttpClient ( handler )
95- {
96- BaseAddress = new Uri ( "https://example.test" ) ,
97- } ;
98- var client = new TermiiClient ( httpClient , new TermiiOptions
99- {
100- ApiKey = "secret-api-key" ,
101- BaseUrl = new Uri ( "https://example.test" ) ,
102- } ) ;
79+ var client = TestTermiiClientFactory . Create ( handler , apiKey : "secret-api-key" ) ;
10380
10481 var exception = await Assert . ThrowsAsync < TermiiApiException > ( ( ) => client . SendAsync (
10582 HttpMethod . Post ,
@@ -118,16 +95,8 @@ public async Task SendAsyncThrowsTermiiApiExceptionForJsonErrorResponses()
11895 [ Fact ]
11996 public async Task SendAsyncThrowsTermiiApiExceptionForPlainTextErrorResponses ( )
12097 {
121- using var handler = new RecordingHttpMessageHandler ( HttpStatusCode . InternalServerError , "Service unavailable" ) ;
122- using var httpClient = new HttpClient ( handler )
123- {
124- BaseAddress = new Uri ( "https://example.test" ) ,
125- } ;
126- var client = new TermiiClient ( httpClient , new TermiiOptions
127- {
128- ApiKey = "secret-api-key" ,
129- BaseUrl = new Uri ( "https://example.test" ) ,
130- } ) ;
98+ using var handler = new TestHttpMessageHandler ( HttpStatusCode . InternalServerError , "Service unavailable" ) ;
99+ var client = TestTermiiClientFactory . Create ( handler , apiKey : "secret-api-key" ) ;
131100
132101 var exception = await Assert . ThrowsAsync < TermiiApiException > ( ( ) => client . SendAsync (
133102 HttpMethod . Get ,
@@ -148,16 +117,8 @@ public async Task SendAsyncThrowsTermiiApiExceptionForPlainTextErrorResponses()
148117 [ InlineData ( "https://example.test/api/sms/send" ) ]
149118 public async Task SendAsyncRejectsInvalidPaths ( string path )
150119 {
151- using var handler = new RecordingHttpMessageHandler ( ) ;
152- using var httpClient = new HttpClient ( handler )
153- {
154- BaseAddress = new Uri ( "https://example.test" ) ,
155- } ;
156- var client = new TermiiClient ( httpClient , new TermiiOptions
157- {
158- ApiKey = "test-api-key" ,
159- BaseUrl = new Uri ( "https://example.test" ) ,
160- } ) ;
120+ using var handler = new TestHttpMessageHandler ( ) ;
121+ var client = TestTermiiClientFactory . Create ( handler ) ;
161122
162123 await Assert . ThrowsAnyAsync < ArgumentException > ( ( ) => client . SendAsync (
163124 HttpMethod . Get ,
@@ -185,32 +146,3 @@ public void AddTermiiRegistersConfiguredClient()
185146 Assert . Equal ( TimeSpan . FromSeconds ( 30 ) , client . Options . Timeout ) ;
186147 }
187148}
188-
189- internal sealed class RecordingHttpMessageHandler : HttpMessageHandler , IDisposable
190- {
191- private readonly HttpStatusCode _statusCode ;
192- private readonly string _responseBody ;
193-
194- public RecordingHttpMessageHandler ( )
195- : this ( HttpStatusCode . OK , "{}" )
196- {
197- }
198-
199- public RecordingHttpMessageHandler ( HttpStatusCode statusCode , string responseBody )
200- {
201- _statusCode = statusCode ;
202- _responseBody = responseBody ;
203- }
204-
205- public HttpRequestMessage ? Request { get ; private set ; }
206-
207- protected override Task < HttpResponseMessage > SendAsync ( HttpRequestMessage request , CancellationToken cancellationToken )
208- {
209- Request = request ;
210-
211- return Task . FromResult ( new HttpResponseMessage ( _statusCode )
212- {
213- Content = new StringContent ( _responseBody ) ,
214- } ) ;
215- }
216- }
0 commit comments