From 42df6879789a868915b2a4491515de123e0dfaea Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 2 Oct 2024 12:11:16 -0400 Subject: [PATCH 1/5] feat(TripStatus): Add trip completed status. --- .../triptracker/TravelerLocator.java | 8 ++++++++ .../middleware/triptracker/TripStatus.java | 12 ++++++++++- .../api/TrackedTripControllerTest.java | 20 +++++++++++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java b/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java index 87b927333..c11d13a8b 100644 --- a/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java +++ b/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import static org.opentripplanner.middleware.triptracker.instruction.TripInstruction.NO_INSTRUCTION; +import static org.opentripplanner.middleware.triptracker.instruction.TripInstruction.TRIP_INSTRUCTION_IMMEDIATE_RADIUS; import static org.opentripplanner.middleware.triptracker.instruction.TripInstruction.TRIP_INSTRUCTION_UPCOMING_RADIUS; import static org.opentripplanner.middleware.utils.GeometryUtils.getDistance; import static org.opentripplanner.middleware.utils.GeometryUtils.isPointBetween; @@ -210,6 +211,13 @@ private static boolean isApproachingEndOfLeg(TravelerPosition travelerPosition) return getDistanceToEndOfLeg(travelerPosition) <= TRIP_INSTRUCTION_UPCOMING_RADIUS; } + /** + * Is the traveler at the leg destination. + */ + public static boolean isAtEndOfLeg(TravelerPosition travelerPosition) { + return getDistanceToEndOfLeg(travelerPosition) <= TRIP_INSTRUCTION_IMMEDIATE_RADIUS; + } + /** * Make sure the traveler is on schedule or ahead of schedule (but not too far) to be within an operational window * for the bus service. diff --git a/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java b/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java index 0f4f60459..4873f03f6 100644 --- a/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java +++ b/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java @@ -2,6 +2,7 @@ import java.time.Instant; +import static org.opentripplanner.middleware.triptracker.TravelerLocator.isAtEndOfLeg; import static org.opentripplanner.middleware.utils.ConfigUtils.getConfigPropertyAsInt; import static org.opentripplanner.middleware.utils.GeometryUtils.getDistanceFromLine; @@ -34,7 +35,12 @@ public enum TripStatus { /** * The traveler has deviated from the trip route. **/ - DEVIATED; + DEVIATED, + + /** + * The traveler has arrived at the trip's final destination. + **/ + COMPLETED; public static final int TRIP_TRACKING_WALK_ON_TRACK_RADIUS = getConfigPropertyAsInt("TRIP_TRACKING_WALK_ON_TRACK_RADIUS", 5); @@ -58,6 +64,10 @@ public enum TripStatus { * Define the trip status based on the traveler's current position compared to expected and nearest points on the trip. */ public static TripStatus getTripStatus(TravelerPosition travelerPosition) { + if (isAtEndOfLeg(travelerPosition)) { + // TODO: add condition for last leg. + return TripStatus.COMPLETED; + } if (travelerPosition.expectedLeg != null && travelerPosition.legSegmentFromPosition != null && isWithinModeRadius(travelerPosition) diff --git a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java index 27b3dc84b..7c1c0ab9c 100644 --- a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java +++ b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java @@ -203,7 +203,7 @@ void canNotRestartAnOngoingJourney() throws Exception { @ParameterizedTest @MethodSource("createStartThenUpdateCases") - void canStartThenUpdateOngoingJourney(Coordinates coords, String instruction, String message) throws Exception { + void canStartThenUpdateOngoingJourney(Coordinates coords, String instruction, TripStatus status, String message) throws Exception { assumeTrue(IS_END_TO_END); String jsonPayload = JsonUtils.toJson(createTrackPayload(coords)); @@ -220,6 +220,7 @@ void canStartThenUpdateOngoingJourney(Coordinates coords, String instruction, St var trackResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); assertNotEquals(0, trackResponse.frequencySeconds); assertEquals(instruction, trackResponse.instruction, message); + assertEquals(status.name(), trackResponse.tripStatus); assertNotNull(trackResponse.journeyId); trackedJourney = Persistence.trackedJourneys.getById(trackResponse.journeyId); @@ -235,6 +236,7 @@ void canStartThenUpdateOngoingJourney(Coordinates coords, String instruction, St trackResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); assertNotEquals(0, trackResponse.frequencySeconds); assertEquals(instruction, trackResponse.instruction, message); + assertEquals(status.name(), trackResponse.tripStatus); assertNotNull(trackResponse.journeyId); assertEquals(trackedJourney.id, trackResponse.journeyId); } @@ -247,42 +249,56 @@ private static Stream createStartThenUpdateCases() { Leg firstLeg = itinerary.legs.get(0); Coordinates firstStepCoords = new Coordinates(firstLeg.steps.get(0)); Coordinates thirdStepCoords = new Coordinates(firstLeg.steps.get(2)); + Coordinates destinationCoords = new Coordinates(firstLeg.to); return Stream.of( Arguments.of( createPoint(firstStepCoords, 1, NORTH_EAST_BEARING), "IMMEDIATE: Head WEST on Adair Avenue Northeast", + TripStatus.BEHIND_SCHEDULE, "Coords near first step should produce relevant instruction" ), Arguments.of( createPoint(firstStepCoords, 4, NORTH_EAST_BEARING), "UPCOMING: Head WEST on Adair Avenue Northeast", - "Coords near first step should produce relevant instruction" + TripStatus.DEVIATED, + "Coords deviated but near first step should produce relevant instruction" ), Arguments.of( createPoint(firstStepCoords, 30, NORTH_EAST_BEARING), "Head to Adair Avenue Northeast", + TripStatus.DEVIATED, "Deviated coords near first step should produce instruction to head to first step #1" ), Arguments.of( createPoint(firstStepCoords, 15, NORTH_WEST_BEARING), "Head to Adair Avenue Northeast", + TripStatus.DEVIATED, "Deviated coords near first step should produce instruction to head to first step #2" ), Arguments.of( createPoint(firstStepCoords, 20, WEST_BEARING), NO_INSTRUCTION, + TripStatus.BEHIND_SCHEDULE, "Coords along a step should produce no instruction" ), Arguments.of( thirdStepCoords, "IMMEDIATE: LEFT on Ponce de Leon Place Northeast", + TripStatus.BEHIND_SCHEDULE, "Coords near a not-first step should produce relevant instruction" ), Arguments.of( createPoint(thirdStepCoords, 30, NORTH_WEST_BEARING), "Head to Ponce de Leon Place Northeast", + TripStatus.DEVIATED, "Deviated coords near a not-first step should produce instruction to head to step" + ), + Arguments.of( + createPoint(destinationCoords, 1, NORTH_WEST_BEARING), + "ARRIVED: Monroe Dr NE at Cooledge Ave NE", + TripStatus.COMPLETED, + "Instructions for destination coordinate" ) ); } From 2f3e6509cad44982c67618acb8537c815421f911 Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:08:45 -0400 Subject: [PATCH 2/5] refactor(TripStatus): Improve tests. --- .../middleware/triptracker/TripStatus.java | 3 +- .../api/TrackedTripControllerTest.java | 161 ++++++++++++------ .../api/27nb-midtown-to-ansley.json | 2 +- 3 files changed, 108 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java b/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java index 4873f03f6..8ff353a8d 100644 --- a/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java +++ b/src/main/java/org/opentripplanner/middleware/triptracker/TripStatus.java @@ -64,8 +64,7 @@ public enum TripStatus { * Define the trip status based on the traveler's current position compared to expected and nearest points on the trip. */ public static TripStatus getTripStatus(TravelerPosition travelerPosition) { - if (isAtEndOfLeg(travelerPosition)) { - // TODO: add condition for last leg. + if (isAtEndOfLeg(travelerPosition) && travelerPosition.nextLeg == null) { return TripStatus.COMPLETED; } if (travelerPosition.expectedLeg != null && diff --git a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java index 7c1c0ab9c..13a7b9cb4 100644 --- a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java +++ b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java @@ -60,8 +60,10 @@ public class TrackedTripControllerTest extends OtpMiddlewareTestEnvironment { private static OtpUser soloOtpUser; private static MonitoredTrip monitoredTrip; + private static MonitoredTrip multiLegMonitoredTrip; private static TrackedJourney trackedJourney; private static Itinerary itinerary; + private static Itinerary multiLegItinerary; private static final String ROUTE_PATH = "api/secure/monitoredtrip/"; private static final String START_TRACKING_TRIP_PATH = ROUTE_PATH + "starttracking"; @@ -81,6 +83,10 @@ public static void setUp() throws Exception { CommonTestUtils.getTestResourceAsString("controllers/api/adair-avenue-to-monroe-drive.json"), Itinerary.class ); + multiLegItinerary = JsonUtils.getPOJOFromJSON( + CommonTestUtils.getTestResourceAsString("controllers/api/27nb-midtown-to-ansley.json"), + Itinerary.class + ); soloOtpUser = PersistenceTestUtils.createUser(ApiTestUtils.generateEmailAddress("test-solootpuser")); try { @@ -93,12 +99,19 @@ public static void setUp() throws Exception { } catch (Auth0Exception e) { throw new RuntimeException(e); } - monitoredTrip = new MonitoredTrip(); - monitoredTrip.userId = soloOtpUser.id; - monitoredTrip.itinerary = itinerary; - monitoredTrip.journeyState = new JourneyState(); - monitoredTrip.journeyState.matchingItinerary = itinerary; - Persistence.monitoredTrips.create(monitoredTrip); + + monitoredTrip = createMonitoredTrip(itinerary); + multiLegMonitoredTrip = createMonitoredTrip(multiLegItinerary); + } + + private static MonitoredTrip createMonitoredTrip(Itinerary itin) { + MonitoredTrip trip = new MonitoredTrip(); + trip.userId = soloOtpUser.id; + trip.itinerary = itin; + trip.journeyState = new JourneyState(); + trip.journeyState.matchingItinerary = itin; + Persistence.monitoredTrips.create(trip); + return trip; } @AfterAll @@ -109,6 +122,8 @@ public static void tearDown() throws Exception { if (soloOtpUser != null) soloOtpUser.delete(true); monitoredTrip = Persistence.monitoredTrips.getById(monitoredTrip.id); if (monitoredTrip != null) monitoredTrip.delete(); + multiLegMonitoredTrip = Persistence.monitoredTrips.getById(multiLegMonitoredTrip.id); + if (multiLegMonitoredTrip != null) multiLegMonitoredTrip.delete(); } @AfterEach @@ -178,70 +193,75 @@ void canNotRestartAnOngoingJourney() throws Exception { String jsonPayload = JsonUtils.toJson(createStartTrackingPayload()); - var response = makeRequest( - START_TRACKING_TRIP_PATH, - jsonPayload, - headers, - HttpMethod.POST - ); + // Make two identical requests to start and update a journey. The second one should fail. + for (int i = 0; i < 2; i++) { + var response = makeRequest(START_TRACKING_TRIP_PATH, jsonPayload, headers, HttpMethod.POST); + var startTrackingResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); + + if (i == 0) { + assertEquals(HttpStatus.OK_200, response.status); + trackedJourney = Persistence.trackedJourneys.getById(startTrackingResponse.journeyId); + } else { + assertEquals("A journey of this trip has already been started. End the current journey before starting another.", startTrackingResponse.message); + assertEquals(HttpStatus.FORBIDDEN_403, response.status); + } + } + } - var startTrackingResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); - trackedJourney = Persistence.trackedJourneys.getById(startTrackingResponse.journeyId); - assertEquals(HttpStatus.OK_200, response.status); + @Test + void canStartThenUpdateOngoingJourney() throws Exception { + assumeTrue(IS_END_TO_END); - response = makeRequest( - START_TRACKING_TRIP_PATH, - jsonPayload, - headers, - HttpMethod.POST - ); + Leg firstLeg = itinerary.legs.get(0); + Coordinates coords = new Coordinates(firstLeg.steps.get(0)); + String jsonPayload = JsonUtils.toJson(createTrackPayload(coords)); - startTrackingResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); - assertEquals("A journey of this trip has already been started. End the current journey before starting another.", startTrackingResponse.message); - assertEquals(HttpStatus.FORBIDDEN_403, response.status); + // Make two identical requests to start and update a journey. Record outcomes to see if they are same. + TrackingResponse[] trackResponses = new TrackingResponse[2]; + for (int i = 0; i < 2; i++) { + var response = makeRequest(TRACK_TRIP_PATH, jsonPayload, headers, HttpMethod.POST); + assertEquals(HttpStatus.OK_200, response.status); + + var trackResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); + trackResponses[i] = trackResponse; + assertNotEquals(0, trackResponse.frequencySeconds); + assertNotNull(trackResponse.journeyId); + + if (trackedJourney == null) { + trackedJourney = Persistence.trackedJourneys.getById(trackResponse.journeyId); + } + } + + assertEquals(trackResponses[0].instruction, trackResponses[1].instruction); + assertEquals(trackResponses[0].tripStatus, trackResponses[1].tripStatus); + assertEquals(trackResponses[0].journeyId, trackResponses[1].journeyId); } @ParameterizedTest - @MethodSource("createStartThenUpdateCases") - void canStartThenUpdateOngoingJourney(Coordinates coords, String instruction, TripStatus status, String message) throws Exception { + @MethodSource("createInstructionAndStatusCases") + void canGenerateInstructionAndStatus( + MonitoredTrip trip, + Coordinates coords, + String instruction, + TripStatus status, + String message + ) throws Exception { assumeTrue(IS_END_TO_END); - String jsonPayload = JsonUtils.toJson(createTrackPayload(coords)); + String jsonPayload = JsonUtils.toJson(createTrackPayload(trip, coords)); - // First request for starting a journey. - var response = makeRequest( - TRACK_TRIP_PATH, - jsonPayload, - headers, - HttpMethod.POST - ); + // Make a request to start a journey. + var response = makeRequest(TRACK_TRIP_PATH, jsonPayload, headers, HttpMethod.POST); assertEquals(HttpStatus.OK_200, response.status); var trackResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); - assertNotEquals(0, trackResponse.frequencySeconds); assertEquals(instruction, trackResponse.instruction, message); assertEquals(status.name(), trackResponse.tripStatus); assertNotNull(trackResponse.journeyId); trackedJourney = Persistence.trackedJourneys.getById(trackResponse.journeyId); - - // Second request to update a journey - response = makeRequest( - TRACK_TRIP_PATH, - jsonPayload, - headers, - HttpMethod.POST - ); - - assertEquals(HttpStatus.OK_200, response.status); - trackResponse = JsonUtils.getPOJOFromJSON(response.responseBody, TrackingResponse.class); - assertNotEquals(0, trackResponse.frequencySeconds); - assertEquals(instruction, trackResponse.instruction, message); - assertEquals(status.name(), trackResponse.tripStatus); - assertNotNull(trackResponse.journeyId); - assertEquals(trackedJourney.id, trackResponse.journeyId); } - private static Stream createStartThenUpdateCases() { + private static Stream createInstructionAndStatusCases() { final int NORTH_WEST_BEARING = 315; final int NORTH_EAST_BEARING = 45; final int WEST_BEARING = 270; @@ -251,54 +271,81 @@ private static Stream createStartThenUpdateCases() { Coordinates thirdStepCoords = new Coordinates(firstLeg.steps.get(2)); Coordinates destinationCoords = new Coordinates(firstLeg.to); + Leg multiItinFirstLeg = multiLegItinerary.legs.get(1); + Coordinates multiItinSecondLegDestCoords = new Coordinates(multiItinFirstLeg.to); + Leg multiItinLastLeg = multiLegItinerary.legs.get(multiLegItinerary.legs.size() - 1); + Coordinates multiItinLastLegDestCoords = new Coordinates(multiItinLastLeg.to); + return Stream.of( Arguments.of( + monitoredTrip, createPoint(firstStepCoords, 1, NORTH_EAST_BEARING), "IMMEDIATE: Head WEST on Adair Avenue Northeast", TripStatus.BEHIND_SCHEDULE, "Coords near first step should produce relevant instruction" ), Arguments.of( + monitoredTrip, createPoint(firstStepCoords, 4, NORTH_EAST_BEARING), "UPCOMING: Head WEST on Adair Avenue Northeast", TripStatus.DEVIATED, "Coords deviated but near first step should produce relevant instruction" ), Arguments.of( + monitoredTrip, createPoint(firstStepCoords, 30, NORTH_EAST_BEARING), "Head to Adair Avenue Northeast", TripStatus.DEVIATED, "Deviated coords near first step should produce instruction to head to first step #1" ), Arguments.of( + monitoredTrip, createPoint(firstStepCoords, 15, NORTH_WEST_BEARING), "Head to Adair Avenue Northeast", TripStatus.DEVIATED, "Deviated coords near first step should produce instruction to head to first step #2" ), Arguments.of( + monitoredTrip, createPoint(firstStepCoords, 20, WEST_BEARING), NO_INSTRUCTION, TripStatus.BEHIND_SCHEDULE, "Coords along a step should produce no instruction" ), Arguments.of( + monitoredTrip, thirdStepCoords, "IMMEDIATE: LEFT on Ponce de Leon Place Northeast", TripStatus.BEHIND_SCHEDULE, "Coords near a not-first step should produce relevant instruction" ), Arguments.of( + monitoredTrip, createPoint(thirdStepCoords, 30, NORTH_WEST_BEARING), "Head to Ponce de Leon Place Northeast", TripStatus.DEVIATED, "Deviated coords near a not-first step should produce instruction to head to step" ), Arguments.of( + monitoredTrip, createPoint(destinationCoords, 1, NORTH_WEST_BEARING), "ARRIVED: Monroe Dr NE at Cooledge Ave NE", TripStatus.COMPLETED, "Instructions for destination coordinate" + ), + Arguments.of( + multiLegMonitoredTrip, + createPoint(multiItinSecondLegDestCoords, 1, NORTH_WEST_BEARING), + "Get off here (Piedmont Ave NE at Monroe Dr)", + TripStatus.BEHIND_SCHEDULE, + "FIXME: No instruction for bus stop (code assumes we are on the transit leg already)." + ), + Arguments.of( + multiLegMonitoredTrip, + createPoint(multiItinLastLegDestCoords, 1, NORTH_WEST_BEARING), + "ARRIVED: Ansley Mall Pet Shop", + TripStatus.COMPLETED, + "Instructions for destination coordinate of multi-leg trip" ) ); } @@ -425,15 +472,19 @@ private UpdatedTrackingPayload createUpdateTrackingPayload(String journeyId) { return payload; } - private TrackPayload createTrackPayload(List locations) { + private TrackPayload createTrackPayload(MonitoredTrip trip, List locations) { var payload = new TrackPayload(); - payload.tripId = monitoredTrip.id; + payload.tripId = trip.id; payload.locations = locations; return payload; } private TrackPayload createTrackPayload(Coordinates coords) { - return createTrackPayload(List.of(new TrackingLocation(getDateAndConvertToSeconds(), coords.lat, coords.lon))); + return createTrackPayload(monitoredTrip, List.of(new TrackingLocation(getDateAndConvertToSeconds(), coords.lat, coords.lon))); + } + + private TrackPayload createTrackPayload(MonitoredTrip trip, Coordinates coords) { + return createTrackPayload(trip, List.of(new TrackingLocation(getDateAndConvertToSeconds(), coords.lat, coords.lon))); } private EndTrackingPayload createEndTrackingPayload(String journeyId) { diff --git a/src/test/resources/org/opentripplanner/middleware/controllers/api/27nb-midtown-to-ansley.json b/src/test/resources/org/opentripplanner/middleware/controllers/api/27nb-midtown-to-ansley.json index c577b6e03..a646f0de0 100644 --- a/src/test/resources/org/opentripplanner/middleware/controllers/api/27nb-midtown-to-ansley.json +++ b/src/test/resources/org/opentripplanner/middleware/controllers/api/27nb-midtown-to-ansley.json @@ -225,7 +225,7 @@ "stopCode": "213258" }, "to": { - "name": "33.79868, -84.37128", + "name": "Ansley Mall Pet Shop", "lon": -84.371285, "lat": 33.798675, "vertexType": "NORMAL", From b7b1d6383605cafe7cddbbc72902030796aeb11a Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:13:07 -0400 Subject: [PATCH 3/5] docs(swagger): Update snapshots --- src/main/resources/latest-spark-swagger-output.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/latest-spark-swagger-output.yaml b/src/main/resources/latest-spark-swagger-output.yaml index 6b97e4c5f..88ea9b539 100644 --- a/src/main/resources/latest-spark-swagger-output.yaml +++ b/src/main/resources/latest-spark-swagger-output.yaml @@ -2772,6 +2772,7 @@ definitions: - "AHEAD_OF_SCHEDULE" - "ENDED" - "DEVIATED" + - "COMPLETED" TrackingResponse: type: "object" properties: From 4655a26a3f462925ebcdf033b7f8a2036b48bf1f Mon Sep 17 00:00:00 2001 From: binh-dam-ibigroup <56846598+binh-dam-ibigroup@users.noreply.github.com> Date: Tue, 8 Oct 2024 10:43:00 -0400 Subject: [PATCH 4/5] test(TrackedTripController): Fix expected instr at end of first walk leg. --- .../controllers/api/TrackedTripControllerTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java index 13a7b9cb4..b1cb21bad 100644 --- a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java +++ b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java @@ -271,8 +271,8 @@ private static Stream createInstructionAndStatusCases() { Coordinates thirdStepCoords = new Coordinates(firstLeg.steps.get(2)); Coordinates destinationCoords = new Coordinates(firstLeg.to); - Leg multiItinFirstLeg = multiLegItinerary.legs.get(1); - Coordinates multiItinSecondLegDestCoords = new Coordinates(multiItinFirstLeg.to); + Leg multiItinFirstLeg = multiLegItinerary.legs.get(0); + Coordinates multiItinFirstLegDestCoords = new Coordinates(multiItinFirstLeg.to); Leg multiItinLastLeg = multiLegItinerary.legs.get(multiLegItinerary.legs.size() - 1); Coordinates multiItinLastLegDestCoords = new Coordinates(multiItinLastLeg.to); @@ -335,10 +335,10 @@ private static Stream createInstructionAndStatusCases() { ), Arguments.of( multiLegMonitoredTrip, - createPoint(multiItinSecondLegDestCoords, 1, NORTH_WEST_BEARING), - "Get off here (Piedmont Ave NE at Monroe Dr)", + createPoint(multiItinFirstLegDestCoords, 1.5, WEST_BEARING), + "ARRIVED: 14th St at Juniper St", TripStatus.BEHIND_SCHEDULE, - "FIXME: No instruction for bus stop (code assumes we are on the transit leg already)." + "Arriving behind schedule at the end of first leg." ), Arguments.of( multiLegMonitoredTrip, @@ -480,11 +480,11 @@ private TrackPayload createTrackPayload(MonitoredTrip trip, List Date: Tue, 8 Oct 2024 11:15:54 -0400 Subject: [PATCH 5/5] test(TrackedTripController): Fix expected instr and timing at end of first walk leg. --- .../api/TrackedTripControllerTest.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java index b1cb21bad..30748a075 100644 --- a/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java +++ b/src/test/java/org/opentripplanner/middleware/controllers/api/TrackedTripControllerTest.java @@ -39,6 +39,7 @@ import org.opentripplanner.middleware.utils.HttpResponseValues; import org.opentripplanner.middleware.utils.JsonUtils; +import java.time.Instant; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -248,7 +249,9 @@ void canGenerateInstructionAndStatus( ) throws Exception { assumeTrue(IS_END_TO_END); - String jsonPayload = JsonUtils.toJson(createTrackPayload(trip, coords)); + String jsonPayload = JsonUtils.toJson( + createTrackPayload(trip, coords, Date.from(Instant.ofEpochMilli(trip.itinerary.startTime.getTime() / 1000))) + ); // Make a request to start a journey. var response = makeRequest(TRACK_TRIP_PATH, jsonPayload, headers, HttpMethod.POST); @@ -281,7 +284,7 @@ private static Stream createInstructionAndStatusCases() { monitoredTrip, createPoint(firstStepCoords, 1, NORTH_EAST_BEARING), "IMMEDIATE: Head WEST on Adair Avenue Northeast", - TripStatus.BEHIND_SCHEDULE, + TripStatus.ON_SCHEDULE, "Coords near first step should produce relevant instruction" ), Arguments.of( @@ -309,14 +312,14 @@ private static Stream createInstructionAndStatusCases() { monitoredTrip, createPoint(firstStepCoords, 20, WEST_BEARING), NO_INSTRUCTION, - TripStatus.BEHIND_SCHEDULE, + TripStatus.ON_SCHEDULE, "Coords along a step should produce no instruction" ), Arguments.of( monitoredTrip, thirdStepCoords, "IMMEDIATE: LEFT on Ponce de Leon Place Northeast", - TripStatus.BEHIND_SCHEDULE, + TripStatus.AHEAD_OF_SCHEDULE, "Coords near a not-first step should produce relevant instruction" ), Arguments.of( @@ -336,9 +339,10 @@ private static Stream createInstructionAndStatusCases() { Arguments.of( multiLegMonitoredTrip, createPoint(multiItinFirstLegDestCoords, 1.5, WEST_BEARING), - "ARRIVED: 14th St at Juniper St", - TripStatus.BEHIND_SCHEDULE, - "Arriving behind schedule at the end of first leg." + // Time is in US Pacific time zone (instead of US Eastern) by configuration for other E2E tests. + "Wait 6 minutes for your bus, route 27, scheduled at 9:18 AM, on time", + TripStatus.AHEAD_OF_SCHEDULE, + "Arriving ahead of schedule to a bus stop at the end of first leg." ), Arguments.of( multiLegMonitoredTrip, @@ -487,6 +491,10 @@ private TrackPayload createTrackPayload(MonitoredTrip trip, Coordinates coords) return createTrackPayload(trip, coords, getDateAndConvertToSeconds()); } + private TrackPayload createTrackPayload(MonitoredTrip trip, Coordinates coords, Date date) { + return createTrackPayload(trip, List.of(new TrackingLocation(date, coords.lat, coords.lon))); + } + private EndTrackingPayload createEndTrackingPayload(String journeyId) { var payload = new EndTrackingPayload(); payload.journeyId = journeyId;