11package com .bandwidth .sdk .numbers ;
22
3+ import com .bandwidth .sdk .numbers .exception .NumbersApiException ;
4+ import com .bandwidth .sdk .numbers .exception .NumbersClientException ;
35import com .bandwidth .sdk .numbers .models .AvailableNumberSearchRequest ;
6+ import com .bandwidth .sdk .numbers .models .ImmutableErrorResponse ;
47import com .bandwidth .sdk .numbers .models .ImmutableSearchResult ;
58import com .bandwidth .sdk .numbers .models .SearchResult ;
9+ import com .bandwidth .sdk .numbers .models .orders .ExistingTelephoneNumberOrderType ;
10+ import com .bandwidth .sdk .numbers .models .orders .ImmutableOrderResponse ;
11+ import com .bandwidth .sdk .numbers .models .orders .Order ;
12+ import com .bandwidth .sdk .numbers .models .orders .OrderResponse ;
613import com .bandwidth .sdk .numbers .serde .NumbersSerde ;
14+ import org .assertj .core .api .Assertions ;
715import org .asynchttpclient .AsyncHttpClient ;
816import org .asynchttpclient .BoundRequestBuilder ;
917import org .asynchttpclient .ListenableFuture ;
1624
1725import java .nio .charset .StandardCharsets ;
1826import java .util .concurrent .CompletableFuture ;
27+ import java .util .concurrent .CompletionException ;
1928
2029import static org .assertj .core .api .Assertions .assertThat ;
30+ import static org .mockito .ArgumentMatchers .any ;
2131import static org .mockito .ArgumentMatchers .anyList ;
2232import static org .mockito .ArgumentMatchers .anyString ;
33+ import static org .mockito .Mockito .times ;
34+ import static org .mockito .Mockito .verify ;
2335import static org .mockito .Mockito .when ;
2436
2537@ RunWith (MockitoJUnitRunner .class )
@@ -38,10 +50,43 @@ public class NumbersClientImplTest {
3850 .addTelephoneNumberList ("5555555555" )
3951 .build ();
4052
41- @ Mock private AsyncHttpClient asyncHttpClient ;
42- @ Mock private BoundRequestBuilder boundRequestBuilder ;
43- @ Mock private ListenableFuture <Response > listenableFuture ;
44- @ Mock private Response response ;
53+ private ExistingTelephoneNumberOrderType existingTelephoneNumberOrderType = ExistingTelephoneNumberOrderType .builder ()
54+ .addTelephoneNumberList ("5555555555" )
55+ .build ();
56+
57+ private Order order = Order .builder ()
58+ .siteId ("1" )
59+ .peerId ("1" )
60+ .existingTelephoneNumberOrderType (existingTelephoneNumberOrderType )
61+ .id ("foo" )
62+ .build ();
63+
64+ private OrderResponse completedOrderResponse = ImmutableOrderResponse .builder ()
65+ .order (order )
66+ .orderStatus (OrderResponse .OrderStatus .COMPLETE )
67+ .build ();
68+
69+ private OrderResponse incompleteOrderResponse = ImmutableOrderResponse .builder ()
70+ .order (order )
71+ .orderStatus (OrderResponse .OrderStatus .RECEIVED )
72+ .build ();
73+
74+ private OrderResponse errorOrderResponse = ImmutableOrderResponse .builder ()
75+ .addErrorList (ImmutableErrorResponse .builder ()
76+ .code ("1" )
77+ .description ("error" )
78+ .build ())
79+ .order (order )
80+ .build ();
81+
82+ @ Mock
83+ private AsyncHttpClient asyncHttpClient ;
84+ @ Mock
85+ private BoundRequestBuilder boundRequestBuilder ;
86+ @ Mock
87+ private ListenableFuture <Response > listenableFuture ;
88+ @ Mock
89+ private Response response ;
4590
4691 @ Before
4792 public void onBefore () {
@@ -55,10 +100,82 @@ public void searchingForNumbers() {
55100 when (boundRequestBuilder .execute ()).thenReturn (listenableFuture );
56101 when (listenableFuture .toCompletableFuture ()).thenReturn (CompletableFuture .completedFuture (response ));
57102 when (response .getResponseBody (StandardCharsets .UTF_8 )).thenReturn (NumbersSerde .serialize (searchResult ));
103+ assertThat (searchResult ).isEqualTo (numbersClient .getAvailableTelephoneNumbers (availableNumberSearchRequest ));
104+ }
105+
106+ @ Test
107+ public void searchingForNumbersExceptionThrowsClientException () {
108+ when (asyncHttpClient .prepareGet (anyString ())).thenReturn (boundRequestBuilder );
109+ when (boundRequestBuilder .setQueryParams (anyList ())).thenReturn (boundRequestBuilder );
110+ when (boundRequestBuilder .execute ()).thenReturn (listenableFuture );
111+ when (listenableFuture .toCompletableFuture ()).thenReturn (CompletableFuture .completedFuture (response ));
112+ when (response .getResponseBody (StandardCharsets .UTF_8 )).thenReturn (NumbersSerde .serialize ("invalid" ));
58113
59- SearchResult searchResult = numbersClient .getAvailableTelephoneNumbers (availableNumberSearchRequest );
114+ Throwable thrown = Assertions .catchThrowable (() ->
115+ numbersClient .getAvailableTelephoneNumbers (availableNumberSearchRequest ));
60116
61- assertThat (searchResult ).isEqualTo (numbersClient .getAvailableTelephoneNumbers (availableNumberSearchRequest ));
117+ assertThat (thrown ).isInstanceOf (CompletionException .class ).hasCauseInstanceOf (NumbersClientException .class );
118+ }
119+
120+ @ Test
121+ public void searchingForNumbersWithAsyncClientException () {
122+ when (asyncHttpClient .prepareGet (anyString ())).thenThrow (new RuntimeException ());
123+ Throwable thrown = Assertions .catchThrowable (() ->
124+ numbersClient .getAvailableTelephoneNumbers (availableNumberSearchRequest ));
125+
126+ assertThat (thrown ).isInstanceOf (CompletionException .class ).hasCauseInstanceOf (NumbersClientException .class );
127+ }
128+
129+ @ Test
130+ public void orderingNumbers () {
131+ when (asyncHttpClient .preparePost (anyString ())).thenReturn (boundRequestBuilder );
132+ when (boundRequestBuilder .setBody (anyString ())).thenReturn (boundRequestBuilder );
133+ when (boundRequestBuilder .setHeader (any (CharSequence .class ), anyString ())).thenReturn (boundRequestBuilder );
134+ when (boundRequestBuilder .execute ()).thenReturn (listenableFuture );
135+ when (listenableFuture .toCompletableFuture ()).thenReturn (CompletableFuture .completedFuture (response ));
136+ when (response .getResponseBody (StandardCharsets .UTF_8 )).thenReturn (NumbersSerde .serialize (incompleteOrderResponse ), NumbersSerde .serialize (completedOrderResponse ));
137+
138+ when (asyncHttpClient .prepareGet (anyString ())).thenReturn (boundRequestBuilder );
139+
140+ assertThat (completedOrderResponse ).isEqualTo (numbersClient .orderTelephoneNumbers (order ));
141+ verify (asyncHttpClient , times (1 )).preparePost (anyString ());
142+ verify (asyncHttpClient , times (1 )).prepareGet (anyString ());
143+ }
144+
145+ @ Test
146+ public void orderingNumberWithPolling () {
147+ when (asyncHttpClient .preparePost (anyString ())).thenReturn (boundRequestBuilder );
148+ when (asyncHttpClient .prepareGet (anyString ())).thenReturn (boundRequestBuilder );
149+ when (boundRequestBuilder .setBody (anyString ())).thenReturn (boundRequestBuilder );
150+ when (boundRequestBuilder .setHeader (any (CharSequence .class ), anyString ())).thenReturn (boundRequestBuilder );
151+ when (boundRequestBuilder .execute ()).thenReturn (listenableFuture );
152+ when (listenableFuture .toCompletableFuture ()).thenReturn (CompletableFuture .completedFuture (response ));
153+
154+ String incompleteResponseString = NumbersSerde .serialize (incompleteOrderResponse );
155+ when (response .getResponseBody (StandardCharsets .UTF_8 )).thenReturn (
156+ incompleteResponseString ,
157+ incompleteResponseString ,
158+ NumbersSerde .serialize (completedOrderResponse ));
159+
160+ assertThat (completedOrderResponse ).isEqualTo (numbersClient .orderTelephoneNumbers (order ));
161+ verify (asyncHttpClient , times (1 )).preparePost (anyString ());
162+ verify (asyncHttpClient , times (2 )).prepareGet (anyString ());
163+ }
164+
165+ @ Test
166+ public void orderNumbersWithError () {
167+ when (asyncHttpClient .preparePost (anyString ())).thenReturn (boundRequestBuilder );
168+ when (boundRequestBuilder .setBody (anyString ())).thenReturn (boundRequestBuilder );
169+ when (boundRequestBuilder .setHeader (any (CharSequence .class ), anyString ())).thenReturn (boundRequestBuilder );
170+ when (boundRequestBuilder .execute ()).thenReturn (listenableFuture );
171+ when (listenableFuture .toCompletableFuture ()).thenReturn (CompletableFuture .completedFuture (response ));
172+
173+ when (response .getResponseBody (StandardCharsets .UTF_8 )).thenReturn (
174+ NumbersSerde .serialize (errorOrderResponse ));
175+
176+ Throwable thrown = Assertions .catchThrowable (() -> numbersClient .orderTelephoneNumbers (order ));
177+
178+ assertThat (thrown ).isInstanceOf (NumbersApiException .class );
62179 }
63180
64181}
0 commit comments