import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { ServerContext } from "../../src/ServerContext"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import { generateMockOrderedStops, generateMockRoutes, generateMockShuttles, generateMockStops, generateMockSystems } from "../generators"; import assert = require("node:assert"); describe("OrderedStopResolvers", () => { let testServer: ApolloServer; let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { testServer = setUpTestServer(); repository = new UnoptimizedInMemoryRepository(); }); let mockSystem: ISystem; let mockRoute: IRoute; let mockStops: IStop[]; beforeEach(async () => { const mockSystems = generateMockSystems(); mockSystem = mockSystems[0]; mockSystem.id = "1"; await repository.addOrUpdateSystem(mockSystem); const mockRoutes = generateMockRoutes(); mockRoute = mockRoutes[0]; mockRoute.id = "1"; await repository.addOrUpdateRoute(mockRoute); mockStops = generateMockStops(); await Promise.all(mockStops.map(async (mockStop) => { await repository.addOrUpdateStop(mockStop); })); }); async function setUpOrderedStopsInRepository() { const orderedStops = generateMockOrderedStops(); // Set up IDs and link stops together to work with the test query orderedStops[0].routeId = mockRoute.id; orderedStops[1].routeId = mockRoute.id; // Ensure that there is no duplication orderedStops[0].stopId = mockStops[0].id; orderedStops[1].stopId = mockStops[1].id; // Link the stops together orderedStops[0].nextStop = orderedStops[1]; orderedStops[1].previousStop = orderedStops[0]; await repository.addOrUpdateOrderedStop(orderedStops[0]); await repository.addOrUpdateOrderedStop(orderedStops[1]); return orderedStops; } describe("nextStop", () => { async function getResponseForQuery(stopId: string) { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { system(id: $systemId) { route(id: $routeId) { orderedStop(forStopId: $stopId) { nextStop { routeId stopId } } } } } `; return await testServer.executeOperation({ query, variables: { systemId: mockSystem.id, routeId: mockRoute.id, stopId, }, }, { contextValue: { repository, } }); } it("returns the next stop if it exists", async () => { // Arrange const orderedStops = await setUpOrderedStopsInRepository(); // Act const response = await getResponseForQuery(orderedStops[0].stopId); // Assert assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); const nextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; expect(nextStop.stopId).toEqual(orderedStops[1].stopId); expect(nextStop.routeId).toEqual(orderedStops[1].routeId); }); it("returns null if there is no next stop in the repository", async () => { const orderedStops = await setUpOrderedStopsInRepository(); orderedStops[0].nextStop = undefined; await repository.addOrUpdateOrderedStop(orderedStops[0]); const response = await getResponseForQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; expect(nonexistentNextStop).toBeNull(); }); it("returns null if the next stop object no longer exists", async () => { const orderedStops = await setUpOrderedStopsInRepository(); await repository.removeStopIfExists(orderedStops[1].stopId); const response = await getResponseForQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; expect(nonexistentNextStop).toBeNull(); }); }); describe("previousStop", () => { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { system(id: $systemId) { route(id: $routeId) { orderedStop(forStopId: $stopId) { previousStop { routeId stopId } } } } } `; it("returns the previous stop if it exists", async () => { }); it("returns null if there is no previous stop in the repository", async () => { }); it("returns null if the current stop no longer exists", async () => { }); }); describe("route", () => { // Note that there is no `orderedStop(forRouteId)` resolver, // so fetch all ordered stops for a stop instead const query = ` query GetNextStop($systemId: ID!, $stopId: ID!) { system(id: $systemId) { stop(id: $stopId) { orderedStops { route { id name } } } } } `; }); it("returns the associated route if it exists", async () => { }); it("returns null if the route doesn't exist", async () => { }); describe("stop", () => { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { system(id: $systemId) { route(id: $routeId) { orderedStop(forStopId: $stopId) { stop { name id } } } } } `; it("returns the associated stop if it exists", async () => { }); it("returns null if the stop doesn't exist", async () => { }); }); });