diff --git a/schema.graphqls b/schema.graphqls index a7464ee..9c2b390 100644 --- a/schema.graphqls +++ b/schema.graphqls @@ -52,6 +52,7 @@ type Route { id: ID! systemId: ID! orderedStop(forStopId: ID): OrderedStop + orderedStops: [OrderedStop] shuttles: [Shuttle!] polylineCoordinates: [Coordinates!]! color: String! diff --git a/src/resolvers/RouteResolvers.ts b/src/resolvers/RouteResolvers.ts index 43f6c53..0574ed5 100644 --- a/src/resolvers/RouteResolvers.ts +++ b/src/resolvers/RouteResolvers.ts @@ -43,8 +43,21 @@ export const RouteResolvers: Resolvers = { routeId: parent.id, route: parent, systemId: system.id, - updatedTimeMs: orderedStop.updatedTime, + updatedTime: orderedStop.updatedTime, } }, + orderedStops: async (parent, args, contextValue, _info) => { + const system = contextValue.findSystemById(parent.systemId); + if (!system) return null; + + const orderedStops = await system.shuttleRepository.getOrderedStopsByRouteId(parent.id); + return orderedStops.map(({ routeId, stopId, position, systemId, updatedTime }) => ({ + routeId, + stopId, + position, + systemId, + updatedTime, + })); + } }, } diff --git a/src/resolvers/__tests__/RouteResolverTests.test.ts b/src/resolvers/__tests__/RouteResolverTests.test.ts index 5e59b32..7193eae 100644 --- a/src/resolvers/__tests__/RouteResolverTests.test.ts +++ b/src/resolvers/__tests__/RouteResolverTests.test.ts @@ -144,4 +144,60 @@ describe("RouteResolvers", () => { expect(orderedStop).toBeNull(); }); }); + + describe("orderedStops", () => { + async function getResponseForOrderedStopsQuery() { + const query = ` + query GetRouteOrderedStop($systemId: ID!, $routeId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStops { + stopId + } + } + } + } + `; + + return await holder.testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + }, + }, { + contextValue: context, + }); + } + + it("returns ordered stops using provided data", async () => { + let orderedStops = generateMockOrderedStops(); + orderedStops = orderedStops.filter((stop) => stop.routeId === orderedStops[0].routeId); + + await Promise.all(orderedStops.map(async (stop) => { + await context.systems[0].shuttleRepository.addOrUpdateOrderedStop(stop); + })) + + const response = await getResponseForOrderedStopsQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const retrievedOrderedStops = (response.body.singleResult.data as any).system.route.orderedStops; + expect(retrievedOrderedStops).toHaveLength(orderedStops.length); + retrievedOrderedStops.map((retrievedStop: any) => { + expect(orderedStops.find((originalStop) => originalStop.stopId === retrievedStop.stopId)).not.toBeUndefined(); + }); + }); + + it("returns empty array if there are no ordered stops", async () => { + const response = await getResponseForOrderedStopsQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const retrievedOrderedStops = (response.body.singleResult.data as any).system.route.orderedStops; + expect(retrievedOrderedStops).toHaveLength(0); + }); + }); });