Skip to content

Commit 65cc12d

Browse files
authored
Added unit tests. Added @JsonIgnore annotations for a few classes. (#22)
1 parent 885b904 commit 65cc12d

File tree

4 files changed

+133
-6
lines changed

4 files changed

+133
-6
lines changed

src/main/java/com/bandwidth/sdk/numbers/models/ErrorResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.bandwidth.sdk.numbers.models;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
45
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
56
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
@@ -19,6 +20,7 @@ public abstract class ErrorResponse {
1920
@JacksonXmlProperty(localName = "Description")
2021
public abstract String getDescription();
2122

23+
@JsonIgnore
2224
public boolean isOrderPendingError() {
2325
return getCode().equals(ORDER_PENDING_ERROR_CODE);
2426
}

src/main/java/com/bandwidth/sdk/numbers/models/SearchResult.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.bandwidth.sdk.numbers.models;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
45
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
56
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
@@ -34,6 +35,11 @@ public abstract class SearchResult {
3435
@JacksonXmlProperty(localName = "TelephoneNumberDetail")
3536
public abstract List<TelephoneNumberDetail> getTelephoneNumberDetailList();
3637

38+
/**
39+
* Convenience method which extracts a list of telephone regardless of whether enableTNDetail is enabled
40+
* @return a List of all telephone numbers in the result
41+
*/
42+
@JsonIgnore
3743
public List<String> extractTelephoneNumbers() {
3844

3945
if (getResultCount() != null && getResultCount() == 0) {

src/main/java/com/bandwidth/sdk/numbers/models/orders/OrderResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.bandwidth.sdk.numbers.models.ErrorResponse;
44
import com.bandwidth.sdk.numbers.models.TelephoneNumber;
5+
import com.fasterxml.jackson.annotation.JsonIgnore;
56
import com.fasterxml.jackson.annotation.JsonInclude;
67
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
78
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -87,6 +88,7 @@ public boolean isTerminal() {
8788
}
8889
}
8990

91+
@JsonIgnore
9092
public boolean isTerminal() {
9193
OrderStatus orderStatus = getOrderStatus();
9294
return orderStatus != null && orderStatus.isTerminal();

src/test/java/com/bandwidth/sdk/numbers/NumbersClientImplTest.java

Lines changed: 123 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package com.bandwidth.sdk.numbers;
22

3+
import com.bandwidth.sdk.numbers.exception.NumbersApiException;
4+
import com.bandwidth.sdk.numbers.exception.NumbersClientException;
35
import com.bandwidth.sdk.numbers.models.AvailableNumberSearchRequest;
6+
import com.bandwidth.sdk.numbers.models.ImmutableErrorResponse;
47
import com.bandwidth.sdk.numbers.models.ImmutableSearchResult;
58
import 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;
613
import com.bandwidth.sdk.numbers.serde.NumbersSerde;
14+
import org.assertj.core.api.Assertions;
715
import org.asynchttpclient.AsyncHttpClient;
816
import org.asynchttpclient.BoundRequestBuilder;
917
import org.asynchttpclient.ListenableFuture;
@@ -16,10 +24,14 @@
1624

1725
import java.nio.charset.StandardCharsets;
1826
import java.util.concurrent.CompletableFuture;
27+
import java.util.concurrent.CompletionException;
1928

2029
import static org.assertj.core.api.Assertions.assertThat;
30+
import static org.mockito.ArgumentMatchers.any;
2131
import static org.mockito.ArgumentMatchers.anyList;
2232
import static org.mockito.ArgumentMatchers.anyString;
33+
import static org.mockito.Mockito.times;
34+
import static org.mockito.Mockito.verify;
2335
import 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

Comments
 (0)