Skip to content

Commit b60bfda

Browse files
committed
NAVAND-873: automatically assign OptimizationResponse#trips#routeIndex and OptimizationResponse#trips#routeOptions
1 parent 1b867fe commit b60bfda

File tree

7 files changed

+482
-10
lines changed

7 files changed

+482
-10
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Mapbox welcomes participation and contributions from everyone.
44

55
### main
66
- Specified supported amenity types via `DirectionsCriteria#AmenityTypeCriteria`. [#1515](https://github.com/mapbox/mapbox-java/pull/1515)
7+
- Fixed an issue where the `OptimizationResponse#trips#routeIndex` and `OptimizationResponse#trips#routeOptions` weren't correctly assigned. [#1517](https://github.com/mapbox/mapbox-java/pull/1517)
78

89
### v6.10.0-beta.2 - November 11, 2022
910
- Added `paymentMethods` parameter for `RouteOptions` and `IntersectionLanes`. [#1449](https://github.com/mapbox/mapbox-java/pull/1449)

gradle/dependencies.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ ext {
88
gson : '2.8.6',
99
retrofit : '2.7.2',
1010
okhttp3 : '4.9.0',
11-
mockito : '2.28.2',
11+
mockito : '4.2.0',
1212
hamcrestJunit : '2.0.0.0',
1313
googleTruth : '1.0.1',
1414
errorprone : '2.3.3',
15+
assertJ : '3.23.1',
1516
]
1617

1718
pluginVersion = [
@@ -41,10 +42,11 @@ ext {
4142
okhttp3 : "com.squareup.okhttp3:okhttp:${version.okhttp3}",
4243
okhttp3Logging : "com.squareup.okhttp3:logging-interceptor:${version.okhttp3}",
4344
okhttp3Mockwebserver: "com.squareup.okhttp3:mockwebserver:${version.okhttp3}",
44-
mockito : "org.mockito:mockito-core:${version.mockito}",
45+
mockito : "org.mockito:mockito-inline:${version.mockito}",
4546
googleTruth : "com.google.truth:truth:${version.googleTruth}",
4647
hamcrestJunit : "org.hamcrest:hamcrest-junit:${version.hamcrestJunit}",
47-
errorprone : "com.google.errorprone:error_prone_core:${version.errorprone}"
48+
errorprone : "com.google.errorprone:error_prone_core:${version.errorprone}",
49+
assertJ : "org.assertj:assertj-core:${version.assertJ}",
4850
]
4951

5052
pluginDependencies = [

services-optimization/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ dependencies {
1515
// Test Dependencies
1616
testImplementation dependenciesList.okhttp3Mockwebserver
1717
testImplementation project(path: ':services-core', configuration: 'testOutput')
18+
testImplementation dependenciesList.assertJ
1819
}

services-optimization/src/main/java/com/mapbox/api/optimization/v1/MapboxOptimization.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
import com.mapbox.core.utils.MapboxUtils;
2424
import com.mapbox.core.utils.TextUtils;
2525
import com.mapbox.geojson.Point;
26+
27+
import java.io.IOException;
2628
import java.util.ArrayList;
2729
import java.util.List;
2830
import java.util.Locale;
2931
import retrofit2.Call;
32+
import retrofit2.Callback;
33+
import retrofit2.Response;
3034

3135
/**
3236
* The Mapbox Optimization API returns a duration-optimized trip between the input coordinates.
@@ -81,6 +85,32 @@ protected Call<OptimizationResponse> initializeCall() {
8185
distributions());
8286
}
8387

88+
@Override
89+
public Response<OptimizationResponse> executeCall() throws IOException {
90+
Response<OptimizationResponse> response = getCall().execute();
91+
OptimizationResponseFactory factory = new OptimizationResponseFactory(MapboxOptimization.this);
92+
return factory.generate(response);
93+
}
94+
95+
@Override
96+
public void enqueueCall(Callback<OptimizationResponse> callback) {
97+
getCall().enqueue(new Callback<OptimizationResponse>() {
98+
@Override
99+
public void onResponse(Call<OptimizationResponse> call,
100+
Response<OptimizationResponse> response) {
101+
OptimizationResponseFactory factory =
102+
new OptimizationResponseFactory(MapboxOptimization.this);
103+
Response<OptimizationResponse> generatedResponse = factory.generate(response);
104+
callback.onResponse(call, generatedResponse);
105+
}
106+
107+
@Override
108+
public void onFailure(Call<OptimizationResponse> call, Throwable throwable) {
109+
callback.onFailure(call, throwable);
110+
}
111+
});
112+
}
113+
84114
@NonNull
85115
abstract String user();
86116

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.mapbox.api.optimization.v1;
2+
3+
import com.mapbox.api.directions.v5.models.DirectionsRoute;
4+
import com.mapbox.api.directions.v5.models.RouteOptions;
5+
import com.mapbox.api.optimization.v1.models.OptimizationResponse;
6+
import retrofit2.Response;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
class OptimizationResponseFactory {
12+
13+
private final MapboxOptimization mapboxOptimization;
14+
15+
OptimizationResponseFactory(MapboxOptimization mapboxOptimization) {
16+
this.mapboxOptimization = mapboxOptimization;
17+
}
18+
19+
Response<OptimizationResponse> generate(Response<OptimizationResponse> response) {
20+
if (isNotSuccessful(response)) {
21+
return response;
22+
} else {
23+
return Response.success(
24+
response
25+
.body()
26+
.toBuilder()
27+
.trips(generateDirectionRoutes(response))
28+
.build(),
29+
new okhttp3.Response.Builder()
30+
.code(200)
31+
.message("OK")
32+
.protocol(response.raw().protocol())
33+
.headers(response.headers())
34+
.request(response.raw().request())
35+
.build());
36+
}
37+
}
38+
39+
private boolean isNotSuccessful(Response<OptimizationResponse> response) {
40+
return !response.isSuccessful()
41+
|| response.body() == null
42+
|| response.body().trips() == null
43+
|| response.body().trips().isEmpty();
44+
}
45+
46+
private List<DirectionsRoute> generateDirectionRoutes(Response<OptimizationResponse> response) {
47+
List<DirectionsRoute> routes = response.body().trips();
48+
List<DirectionsRoute> modifiedRoutes = new ArrayList<>();
49+
for (int i = 0; i < routes.size(); i++) {
50+
DirectionsRoute route = routes.get(i);
51+
modifiedRoutes.add(
52+
route.toBuilder()
53+
.routeOptions(generateRouteOptions())
54+
.routeIndex(String.valueOf(i))
55+
.build()
56+
);
57+
}
58+
return modifiedRoutes;
59+
}
60+
61+
private RouteOptions generateRouteOptions() {
62+
RouteOptions.Builder builder = RouteOptions.builder()
63+
.profile(mapboxOptimization.profile())
64+
.coordinates(mapboxOptimization.coordinates())
65+
.annotations(mapboxOptimization.annotations())
66+
.bearings(mapboxOptimization.bearings())
67+
.language(mapboxOptimization.language())
68+
.radiuses(mapboxOptimization.radiuses())
69+
.user(mapboxOptimization.user())
70+
.overview(mapboxOptimization.overview())
71+
.steps(mapboxOptimization.steps())
72+
.baseUrl(mapboxOptimization.baseUrl());
73+
if (mapboxOptimization.geometries() != null) {
74+
builder.geometries(mapboxOptimization.geometries());
75+
}
76+
return builder.build();
77+
}
78+
}

services-optimization/src/test/java/com/mapbox/api/optimization/v1/MapboxOptimizationTest.java

Lines changed: 96 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package com.mapbox.api.optimization.v1;
22

3-
import static org.hamcrest.CoreMatchers.startsWith;
4-
import static org.junit.Assert.*;
5-
import static org.junit.Assert.assertTrue;
6-
3+
import com.mapbox.api.optimization.v1.models.OptimizationResponse;
74
import com.mapbox.core.TestUtils;
8-
import com.mapbox.geojson.Point;
95
import com.mapbox.core.exceptions.ServicesException;
10-
6+
import com.mapbox.geojson.Point;
117
import okhttp3.HttpUrl;
128
import okhttp3.mockwebserver.MockResponse;
139
import okhttp3.mockwebserver.MockWebServer;
@@ -17,16 +13,31 @@
1713
import org.junit.Before;
1814
import org.junit.Rule;
1915
import org.junit.Test;
16+
import org.mockito.MockedConstruction;
17+
import org.mockito.Mockito;
18+
import retrofit2.Call;
19+
import retrofit2.Callback;
20+
import retrofit2.Response;
2021

2122
import java.io.IOException;
2223
import java.util.ArrayList;
2324
import java.util.List;
25+
import java.util.concurrent.CountDownLatch;
26+
import java.util.concurrent.TimeUnit;
27+
28+
import static org.hamcrest.CoreMatchers.startsWith;
29+
import static org.junit.Assert.assertEquals;
30+
import static org.junit.Assert.assertNotNull;
31+
import static org.junit.Assert.assertTrue;
32+
import static org.mockito.ArgumentMatchers.any;
33+
import static org.mockito.Mockito.mock;
34+
import static org.mockito.Mockito.when;
2435

2536
public class MapboxOptimizationTest extends TestUtils {
2637

2738
private static final String OPTIMIZATION_DISTRIBUTION = "optimized_trip_distributions.json";
2839
private static final String OPTIMIZATION_FIXTURE = "optimization.json";
29-
private static final String OPTIMIZATION_STEPS= "optimized_trip_steps.json";
40+
private static final String OPTIMIZATION_STEPS = "optimized_trip_steps.json";
3041

3142
private MockWebServer server;
3243
private HttpUrl mockUrl;
@@ -120,4 +131,82 @@ public void testUserAgent() throws ServicesException, IOException {
120131
.build();
121132
assertTrue(client.executeCall().raw().request().header("User-Agent").contains("APP"));
122133
}
134+
135+
@Test
136+
public void executeCall_modifiesResponse() throws IOException {
137+
final Response<OptimizationResponse> modifiedResponse = mock(Response.class);
138+
final MockedConstruction.MockInitializer<OptimizationResponseFactory> mockInitializer = (mock, context) ->
139+
when(mock.generate(any())).thenReturn(modifiedResponse);
140+
try (MockedConstruction ignored = Mockito.mockConstruction(OptimizationResponseFactory.class, mockInitializer)) {
141+
MapboxOptimization client = MapboxOptimization.builder()
142+
.clientAppName("APP")
143+
.accessToken(ACCESS_TOKEN)
144+
.coordinate(Point.fromLngLat(1.0, 1.0))
145+
.coordinate(Point.fromLngLat(1.0, 1.0))
146+
.baseUrl(mockUrl.url().toString())
147+
.build();
148+
assertEquals(modifiedResponse, client.executeCall());
149+
}
150+
}
151+
152+
@Test
153+
public void enqueueCall_onSuccess_modifiesResponse() throws Exception {
154+
final CountDownLatch latch = new CountDownLatch(1);
155+
MapboxOptimization client = MapboxOptimization.builder()
156+
.clientAppName("APP")
157+
.accessToken(ACCESS_TOKEN)
158+
.coordinate(Point.fromLngLat(1.0, 1.0))
159+
.coordinate(Point.fromLngLat(1.0, 1.0))
160+
.baseUrl(mockUrl.url().toString())
161+
.build();
162+
List<Response<OptimizationResponse>> actualResponses = new ArrayList<>();
163+
client.enqueueCall(new Callback<OptimizationResponse>() {
164+
@Override
165+
public void onResponse(Call<OptimizationResponse> call, Response<OptimizationResponse> response) {
166+
actualResponses.add(response);
167+
latch.countDown();
168+
}
169+
170+
@Override
171+
public void onFailure(Call<OptimizationResponse> call, Throwable t) {
172+
latch.countDown();
173+
}
174+
});
175+
latch.await(5, TimeUnit.SECONDS);
176+
assertEquals(1, actualResponses.size());
177+
assertEquals("0", actualResponses.get(0).body().trips().get(0).routeIndex());
178+
}
179+
180+
@Test
181+
public void enqueueCall_onFailure() throws InterruptedException {
182+
final CountDownLatch latch = new CountDownLatch(1);
183+
MapboxOptimization client = MapboxOptimization.builder()
184+
.clientAppName("APP")
185+
.accessToken(ACCESS_TOKEN)
186+
.coordinate(Point.fromLngLat(1.0, 1.0))
187+
.coordinate(Point.fromLngLat(1.0, 1.0))
188+
.baseUrl(mockUrl.url().toString())
189+
.build();
190+
server.setDispatcher(new okhttp3.mockwebserver.Dispatcher() {
191+
@Override
192+
public MockResponse dispatch(RecordedRequest request) {
193+
return new MockResponse().setResponseCode(500).setStatus("Error");
194+
}
195+
});
196+
List<Throwable> actualExceptions = new ArrayList<>();
197+
client.enqueueCall(new Callback<OptimizationResponse>() {
198+
@Override
199+
public void onResponse(Call<OptimizationResponse> call, Response<OptimizationResponse> response) {
200+
latch.countDown();
201+
}
202+
203+
@Override
204+
public void onFailure(Call<OptimizationResponse> call, Throwable t) {
205+
actualExceptions.add(t);
206+
latch.countDown();
207+
}
208+
});
209+
latch.await(5, TimeUnit.SECONDS);
210+
assertEquals(1, actualExceptions.size());
211+
}
123212
}

0 commit comments

Comments
 (0)