1+ using System ;
2+ using System . Net ;
3+ using System . Net . Http ;
4+ using System . Text ;
5+ using System . Threading ;
6+ using System . Threading . Tasks ;
7+ using Moq ;
8+ using Moq . Protected ;
9+ using Xunit ;
10+
11+ namespace Checkout
12+ {
13+ public class ApiClientTests : UnitTestFixture , IDisposable
14+ {
15+ private readonly ApiClient _apiClient ;
16+ private readonly Mock < HttpMessageHandler > _httpMessageHandlerMock ;
17+ private readonly HttpClient _httpClient ;
18+
19+ public ApiClientTests ( )
20+ {
21+ _httpMessageHandlerMock = new Mock < HttpMessageHandler > ( ) ;
22+ _httpClient = new HttpClient ( _httpMessageHandlerMock . Object ) ;
23+
24+ var httpClientFactoryMock = new Mock < IHttpClientFactory > ( ) ;
25+ httpClientFactoryMock
26+ . Setup ( factory => factory . CreateClient ( ) )
27+ . Returns ( _httpClient ) ;
28+
29+ _apiClient = new ApiClient ( httpClientFactoryMock . Object , new Uri ( "https://api.example.com" ) , false ) ;
30+ }
31+
32+ [ Fact ]
33+ public async Task ShouldGetReturnDeserializedObject ( )
34+ {
35+ // Arrange
36+ var jsonResponse = "{\" message\" :\" success\" }" ;
37+ using var httpResponse = new HttpResponseMessage ( HttpStatusCode . OK ) ;
38+ httpResponse . Content = new StringContent ( jsonResponse , Encoding . UTF8 , "application/json" ) ;
39+
40+ _httpMessageHandlerMock
41+ . Protected ( )
42+ . Setup < Task < HttpResponseMessage > > ( "SendAsync" , ItExpr . IsAny < HttpRequestMessage > ( ) ,
43+ ItExpr . IsAny < CancellationToken > ( ) )
44+ . ReturnsAsync ( httpResponse ) ;
45+
46+ var authorization = new SdkAuthorization ( PlatformType . Default , ValidDefaultSk ) ;
47+
48+ // Act
49+ var result = await _apiClient . Get < FakeResponse > ( "/test" , authorization ) ;
50+
51+ // Assert
52+ Assert . NotNull ( result ) ;
53+ Assert . IsType < FakeResponse > ( result ) ;
54+ Assert . Equal ( "success" , result . Message ) ;
55+ }
56+
57+ [ Fact ]
58+ public async Task ShouldPostReturnDeserializedObject ( )
59+ {
60+ // Arrange
61+ var jsonResponse = "{\" message\" :\" created\" }" ;
62+ using HttpResponseMessage httpResponse = new HttpResponseMessage ( HttpStatusCode . Created )
63+ {
64+ Content = new StringContent ( jsonResponse , Encoding . UTF8 , "application/json" )
65+ } ;
66+
67+ _httpMessageHandlerMock
68+ . Protected ( )
69+ . Setup < Task < HttpResponseMessage > > ( "SendAsync" , ItExpr . IsAny < HttpRequestMessage > ( ) ,
70+ ItExpr . IsAny < CancellationToken > ( ) )
71+ . ReturnsAsync ( httpResponse ) ;
72+
73+ var authorization = new SdkAuthorization ( PlatformType . Default , ValidDefaultSk ) ;
74+ var requestData = new { name = "new item" } ;
75+
76+ // Act
77+ var result = await _apiClient . Post < FakeResponse > ( "/test" , authorization , requestData ) ;
78+
79+ // Assert
80+ Assert . NotNull ( result ) ;
81+ Assert . IsType < FakeResponse > ( result ) ;
82+ Assert . Equal ( "created" , result . Message ) ;
83+ }
84+
85+ [ Fact ]
86+ public async Task ShouldDeleteReturnDeserializedObject ( )
87+ {
88+ // Arrange
89+ var jsonResponse = "{\" message\" :\" deleted\" }" ;
90+ using HttpResponseMessage httpResponse = new HttpResponseMessage ( HttpStatusCode . OK )
91+ {
92+ Content = new StringContent ( jsonResponse , Encoding . UTF8 , "application/json" )
93+ } ;
94+
95+ _httpMessageHandlerMock
96+ . Protected ( )
97+ . Setup < Task < HttpResponseMessage > > ( "SendAsync" , ItExpr . IsAny < HttpRequestMessage > ( ) ,
98+ ItExpr . IsAny < CancellationToken > ( ) )
99+ . ReturnsAsync ( httpResponse ) ;
100+
101+ var authorization = new SdkAuthorization ( PlatformType . Default , ValidDefaultSk ) ;
102+
103+ // Act
104+ var result = await _apiClient . Delete < FakeResponse > ( "/test" , authorization ) ;
105+
106+ // Assert
107+ Assert . NotNull ( result ) ;
108+ Assert . IsType < FakeResponse > ( result ) ;
109+ Assert . Equal ( "deleted" , result . Message ) ;
110+ }
111+
112+ [ Fact ]
113+ public async Task ShouldGetHandleNoContentResponse ( )
114+ {
115+ // Arrange
116+ using var httpResponse = new HttpResponseMessage ( HttpStatusCode . NoContent ) ;
117+ httpResponse . Content = null ;
118+
119+ _httpMessageHandlerMock
120+ . Protected ( )
121+ . Setup < Task < HttpResponseMessage > > ( "SendAsync" , ItExpr . IsAny < HttpRequestMessage > ( ) , ItExpr . IsAny < CancellationToken > ( ) )
122+ . ReturnsAsync ( httpResponse ) ;
123+
124+ var authorization = new SdkAuthorization ( PlatformType . Default , ValidDefaultSk ) ;
125+
126+ // Act
127+ var result = await _apiClient . Get < HttpMetadata > ( "/test" , authorization ) ;
128+
129+ // Assert
130+ Assert . NotNull ( result ) ;
131+ Assert . IsType < HttpMetadata > ( result ) ;
132+ Assert . Equal ( 204 , result . HttpStatusCode ) ;
133+ Assert . NotNull ( result . Body ) ;
134+ Assert . NotNull ( result . ResponseHeaders ) ;
135+ }
136+
137+ public void Dispose ( )
138+ {
139+ _httpClient . Dispose ( ) ;
140+ }
141+ }
142+
143+ public class FakeResponse : HttpMetadata
144+ {
145+ public string Message { get ; set ; }
146+ }
147+ }
0 commit comments