From 57119d9fd9d7685e0226e405730dae94a08af7e4 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 03:45:50 -0800 Subject: [PATCH 01/56] add test setup for query resolvers --- test/resolvers/QueryResolverTests.test.ts | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/resolvers/QueryResolverTests.test.ts diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts new file mode 100644 index 0000000..cb2e517 --- /dev/null +++ b/test/resolvers/QueryResolverTests.test.ts @@ -0,0 +1,26 @@ +import { beforeEach, describe } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { ServerContext } from "../../src/ServerContext"; +import { readFileSync } from "fs"; +import { MergedResolvers } from "../../src/MergedResolvers"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { loadTestData } from "../../src/loaders/loadTestData"; + +// See Apollo documentation for integration test guide +// https://www.apollographql.com/docs/apollo-server/testing/testing + +describe("QueryResolvers", () => { + let apolloServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository; + + beforeEach(async () => { + const typeDefs = readFileSync("./schema.graphqls", "utf8"); + apolloServer = new ApolloServer({ + typeDefs, + resolvers: MergedResolvers, + }); + + repository = new UnoptimizedInMemoryRepository(); + await loadTestData(repository); + }); +}); From c647da4931d0a80b55d5c79558e9434d8fef8437 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 03:58:49 -0800 Subject: [PATCH 02/56] add test for systems property of query resolver --- test/resolvers/QueryResolverTests.test.ts | 40 ++++++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index cb2e517..9f189ec 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,26 +1,56 @@ -import { beforeEach, describe } from "@jest/globals"; +import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { readFileSync } from "fs"; import { MergedResolvers } from "../../src/MergedResolvers"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { loadTestData } from "../../src/loaders/loadTestData"; +import { generateMockSystems } from "../generators"; +import assert = require("node:assert"); // See Apollo documentation for integration test guide // https://www.apollographql.com/docs/apollo-server/testing/testing describe("QueryResolvers", () => { - let apolloServer: ApolloServer; + let testServer: ApolloServer; let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { const typeDefs = readFileSync("./schema.graphqls", "utf8"); - apolloServer = new ApolloServer({ + testServer = new ApolloServer({ typeDefs, resolvers: MergedResolvers, }); repository = new UnoptimizedInMemoryRepository(); - await loadTestData(repository); }); + + describe("systems", () => { + it("returns systems from the repository", async () => { + const systems = generateMockSystems(); + await Promise.all(systems.map(async (system) => { + await repository.addOrUpdateSystem(system); + })); + + const query = ` + query GetSystems + { + systems { + name + } + } + ` + + const response = await testServer.executeOperation({ + query, + }, { + contextValue: { + repository, + }, + }); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect(response.body.singleResult.data?.systems).toHaveLength(systems.length); + }); + }) }); From 3366a764f90b7d62cf57248b5ec686068b086fea Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 04:00:51 -0800 Subject: [PATCH 03/56] add test cases for system property of query object --- test/resolvers/QueryResolverTests.test.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index 9f189ec..3da3015 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -52,5 +52,19 @@ describe("QueryResolvers", () => { expect(response.body.singleResult.errors).toBeUndefined(); expect(response.body.singleResult.data?.systems).toHaveLength(systems.length); }); - }) + }); + + describe("system", () => { + it("returns a system for an ID from the repository", async () => { + + }); + + it("returns null if no id provided", async () => { + + }); + + it("returns null if there is no system", async () => { + + }); + }); }); From c39834cf663c6172830abffd21e2c6ef82752cd7 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 04:08:01 -0800 Subject: [PATCH 04/56] add remaining tests for QueryResolvers --- test/resolvers/QueryResolverTests.test.ts | 55 +++++++++++++++++++---- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index 3da3015..c806a9e 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -24,12 +24,17 @@ describe("QueryResolvers", () => { repository = new UnoptimizedInMemoryRepository(); }); + async function addMockSystems() { + const systems = generateMockSystems(); + await Promise.all(systems.map(async (system) => { + await repository.addOrUpdateSystem(system); + })); + return systems; + } + describe("systems", () => { it("returns systems from the repository", async () => { - const systems = generateMockSystems(); - await Promise.all(systems.map(async (system) => { - await repository.addOrUpdateSystem(system); - })); + const systems = await addMockSystems(); const query = ` query GetSystems @@ -38,7 +43,7 @@ describe("QueryResolvers", () => { name } } - ` + `; const response = await testServer.executeOperation({ query, @@ -55,16 +60,50 @@ describe("QueryResolvers", () => { }); describe("system", () => { + const query = ` + query GetSystem($id: ID!) + { + system(id: $id) { + name + } + } + `; + it("returns a system for an ID from the repository", async () => { + const systems = await addMockSystems(); + const systemToGet = systems[1]; - }); - - it("returns null if no id provided", async () => { + const response = await testServer.executeOperation({ + query, + variables: { + id: systemToGet.id, + } + }, { + contextValue: { + repository, + } + }); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect(response.body.singleResult.data?.system).toBeDefined(); }); it("returns null if there is no system", async () => { + const response = await testServer.executeOperation({ + query, + variables: { + id: "nonexistent-id", + } + }, { + contextValue: { + repository, + } + }); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect(response.body.singleResult.data?.system).toBeNull(); }); }); }); From 4cddacb46453089be0334570bf611bf9cc32f647 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 14:45:49 -0800 Subject: [PATCH 05/56] add tests for eta resolver on shuttle resolvers object --- test/resolvers/ShuttleResolverTests.test.ts | 104 ++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 test/resolvers/ShuttleResolverTests.test.ts diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts new file mode 100644 index 0000000..7e20fa8 --- /dev/null +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -0,0 +1,104 @@ +import { beforeEach, describe, expect, it } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { ServerContext } from "../../src/ServerContext"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { readFileSync } from "fs"; +import { MergedResolvers } from "../../src/MergedResolvers"; +import { generateMockEtas, generateMockShuttles, generateMockSystems } from "../generators"; +import { IShuttle, ISystem } from "../../src/entities/entities"; +import assert = require("node:assert"); + +describe("ShuttleResolvers", () => { + let testServer: ApolloServer + let repository: UnoptimizedInMemoryRepository; + + beforeEach(async () => { + const typeDefs = readFileSync("./schema.graphqls", "utf8"); + testServer = new ApolloServer({ + typeDefs, + resolvers: MergedResolvers, + }); + + repository = new UnoptimizedInMemoryRepository(); + }); + + describe("eta", () => { + const query = ` + query GetShuttleETAs($systemId: ID!, $shuttleId: ID!, $stopId: ID!) + { + system(id: $systemId) { + shuttle(id: $shuttleId) { + eta(forStopId: $stopId) { + secondsRemaining + } + } + } + } + ` + let mockSystem: ISystem; + let mockShuttle: IShuttle; + + beforeEach(async () => { + // Arrange + const mockSystems = generateMockSystems(); + mockSystem = mockSystems[0]; + mockSystem.id = "1"; + await repository.addOrUpdateSystem(mockSystem); + + const mockShuttles = generateMockShuttles(); + mockShuttle = mockShuttles[0]; + mockShuttle.systemId = mockSystem.id; + mockShuttle.id = "1"; + await repository.addOrUpdateShuttle(mockShuttle); + }); + + it("returns ETA data for stop ID if exists", async () => { + const etas = generateMockEtas(); + await Promise.all(etas.map(async (eta) => { + eta.shuttleId = mockShuttle.id; + await repository.addOrUpdateEta(eta); + })); + + const mockEta = etas[1]; + + // Act + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + stopId: mockEta.stopId, + }, + }, { + contextValue: { + repository, + }, + }); + + // Assert + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.eta.secondsRemaining).toEqual(mockEta.secondsRemaining); + }); + + it("returns null if it doesn't exist", async () => { + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + stopId: "nonexistent-stop", + } + }, { + contextValue: { + repository, + } + }); + + // Assert + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.eta).toBeNull(); + }); + }); +}); \ No newline at end of file From 17dfc18c3b42b83e3781aa4c4b00763551e9bc58 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 14:52:51 -0800 Subject: [PATCH 06/56] add tests for etas resolver --- test/resolvers/ShuttleResolverTests.test.ts | 103 +++++++++++++++----- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 7e20fa8..4fade9f 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -22,6 +22,32 @@ describe("ShuttleResolvers", () => { repository = new UnoptimizedInMemoryRepository(); }); + let mockSystem: ISystem; + let mockShuttle: IShuttle; + + beforeEach(async () => { + const mockSystems = generateMockSystems(); + mockSystem = mockSystems[0]; + mockSystem.id = "1"; + await repository.addOrUpdateSystem(mockSystem); + + const mockShuttles = generateMockShuttles(); + mockShuttle = mockShuttles[0]; + mockShuttle.systemId = mockSystem.id; + mockShuttle.id = "1"; + await repository.addOrUpdateShuttle(mockShuttle); + }); + + + async function addMockEtas(shuttleId: string) { + const etas = generateMockEtas(); + await Promise.all(etas.map(async (eta) => { + eta.shuttleId = shuttleId; + await repository.addOrUpdateEta(eta); + })); + return etas; + } + describe("eta", () => { const query = ` query GetShuttleETAs($systemId: ID!, $shuttleId: ID!, $stopId: ID!) @@ -35,29 +61,8 @@ describe("ShuttleResolvers", () => { } } ` - let mockSystem: ISystem; - let mockShuttle: IShuttle; - - beforeEach(async () => { - // Arrange - const mockSystems = generateMockSystems(); - mockSystem = mockSystems[0]; - mockSystem.id = "1"; - await repository.addOrUpdateSystem(mockSystem); - - const mockShuttles = generateMockShuttles(); - mockShuttle = mockShuttles[0]; - mockShuttle.systemId = mockSystem.id; - mockShuttle.id = "1"; - await repository.addOrUpdateShuttle(mockShuttle); - }); - it("returns ETA data for stop ID if exists", async () => { - const etas = generateMockEtas(); - await Promise.all(etas.map(async (eta) => { - eta.shuttleId = mockShuttle.id; - await repository.addOrUpdateEta(eta); - })); + const etas = await addMockEtas(mockShuttle.id); const mockEta = etas[1]; @@ -101,4 +106,58 @@ describe("ShuttleResolvers", () => { expect((response.body.singleResult.data as any).system.shuttle.eta).toBeNull(); }); }); + + describe("etas", () => { + const query = ` + query GetShuttleETAs($systemId: ID!, $shuttleId: ID!) + { + system(id: $systemId) { + shuttle(id: $shuttleId) { + etas { + secondsRemaining + } + } + } + } + ` + + it("returns associated ETAs if they exist for the shuttle", async () => { + const etas = await addMockEtas(mockShuttle.id); + + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + }, + }, { + contextValue: { + repository, + } + }); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.etas).toHaveLength(etas.length); + }); + + it("returns empty array if no ETAs exist", async () => { + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + }, + }, { + contextValue: { + repository, + } + }); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.etas).toHaveLength(0); + + }); + }); }); \ No newline at end of file From 1abf808e9fa7850779a1ba3daec98aa370e2d8e2 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:13:11 -0800 Subject: [PATCH 07/56] add route tests for ShuttleResolvers --- test/resolvers/ShuttleResolverTests.test.ts | 55 ++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 4fade9f..9869a02 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -4,7 +4,7 @@ import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { readFileSync } from "fs"; import { MergedResolvers } from "../../src/MergedResolvers"; -import { generateMockEtas, generateMockShuttles, generateMockSystems } from "../generators"; +import { generateMockEtas, generateMockRoutes, generateMockShuttles, generateMockSystems } from "../generators"; import { IShuttle, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -160,4 +160,57 @@ describe("ShuttleResolvers", () => { }); }); + + describe("route", () => { + const query = ` + query GetShuttleRoute($systemId: ID!, $shuttleId: ID!) { + system(id: $systemId) { + shuttle(id: $shuttleId) { + route { + color + id + name + polylineCoordinates { + latitude + longitude + } + } + } + } + } + ` + + async function getResponseForQuery() { + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + } + }, { + contextValue: { + repository, + } + }); + } + + it("returns the route if it exists", async () => { + const mockRoute = generateMockRoutes()[0]; + await repository.addOrUpdateRoute(mockRoute); + + const response = await getResponseForQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.route.id).toEqual(mockRoute.id); + }); + + it("returns null if there is no route", async () => { + const response = await getResponseForQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.shuttle.route).toBeNull(); + }); + }); }); \ No newline at end of file From 640eb76971743055fd93210a01d215d40d503b9c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:20:34 -0800 Subject: [PATCH 08/56] migrate test server setup to separate file --- test/loaders/ApiBasedRepositoryLoaderTests.test.ts | 2 +- .../TimedApiBasedRepositoryLoaderTests.test.ts | 2 +- test/resolvers/QueryResolverTests.test.ts | 9 ++------- test/resolvers/ShuttleResolverTests.test.ts | 10 ++-------- test/resolvers/StopResolverTests.test.ts | 11 +++++++++++ test/testHelpers/apolloSetupHelpers.ts | 13 +++++++++++++ .../fetchMockHelpers.ts | 0 7 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 test/resolvers/StopResolverTests.test.ts create mode 100644 test/testHelpers/apolloSetupHelpers.ts rename test/{mockHelpers => testHelpers}/fetchMockHelpers.ts (100%) diff --git a/test/loaders/ApiBasedRepositoryLoaderTests.test.ts b/test/loaders/ApiBasedRepositoryLoaderTests.test.ts index 173f696..691667e 100644 --- a/test/loaders/ApiBasedRepositoryLoaderTests.test.ts +++ b/test/loaders/ApiBasedRepositoryLoaderTests.test.ts @@ -24,7 +24,7 @@ import { resetGlobalFetchMockJson, updateGlobalFetchMockJson, updateGlobalFetchMockJsonToThrowSyntaxError -} from "../mockHelpers/fetchMockHelpers"; +} from "../testHelpers/fetchMockHelpers"; async function assertAsyncCallbackThrowsApiResponseError(callback: () => Promise) { await expect(callback).rejects.toThrow(ApiResponseError); diff --git a/test/loaders/TimedApiBasedRepositoryLoaderTests.test.ts b/test/loaders/TimedApiBasedRepositoryLoaderTests.test.ts index 18f4616..9979a06 100644 --- a/test/loaders/TimedApiBasedRepositoryLoaderTests.test.ts +++ b/test/loaders/TimedApiBasedRepositoryLoaderTests.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, jest } from "@jest/globals"; import { TimedApiBasedRepositoryLoader } from "../../src/loaders/TimedApiBasedRepositoryLoader"; -import { resetGlobalFetchMockJson } from "../mockHelpers/fetchMockHelpers"; +import { resetGlobalFetchMockJson } from "../testHelpers/fetchMockHelpers"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; describe("TimedApiBasedRepositoryLoader", () => { diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index c806a9e..f0e4777 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,11 +1,10 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; -import { readFileSync } from "fs"; -import { MergedResolvers } from "../../src/MergedResolvers"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { generateMockSystems } from "../generators"; import assert = require("node:assert"); +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; // See Apollo documentation for integration test guide // https://www.apollographql.com/docs/apollo-server/testing/testing @@ -15,11 +14,7 @@ describe("QueryResolvers", () => { let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { - const typeDefs = readFileSync("./schema.graphqls", "utf8"); - testServer = new ApolloServer({ - typeDefs, - resolvers: MergedResolvers, - }); + testServer = setUpTestServer(); repository = new UnoptimizedInMemoryRepository(); }); diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 9869a02..73f667e 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -2,23 +2,17 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { readFileSync } from "fs"; -import { MergedResolvers } from "../../src/MergedResolvers"; import { generateMockEtas, generateMockRoutes, generateMockShuttles, generateMockSystems } from "../generators"; import { IShuttle, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; describe("ShuttleResolvers", () => { let testServer: ApolloServer let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { - const typeDefs = readFileSync("./schema.graphqls", "utf8"); - testServer = new ApolloServer({ - typeDefs, - resolvers: MergedResolvers, - }); - + testServer = setUpTestServer(); repository = new UnoptimizedInMemoryRepository(); }); diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts new file mode 100644 index 0000000..4439760 --- /dev/null +++ b/test/resolvers/StopResolverTests.test.ts @@ -0,0 +1,11 @@ +import { beforeEach, describe } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { ServerContext } from "../../src/ServerContext"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { readFileSync } from "fs"; +import { MergedResolvers } from "../../src/MergedResolvers"; + +describe("StopResolvers", () => { + // replicate setup code + +}); \ No newline at end of file diff --git a/test/testHelpers/apolloSetupHelpers.ts b/test/testHelpers/apolloSetupHelpers.ts new file mode 100644 index 0000000..5a4bf8e --- /dev/null +++ b/test/testHelpers/apolloSetupHelpers.ts @@ -0,0 +1,13 @@ +import { readFileSync } from "fs"; +import { ApolloServer } from "@apollo/server"; +import { MergedResolvers } from "../../src/MergedResolvers"; + +export function setUpTestServer() { + // Leaving this separate from the main server in case + // configuration changes + const typeDefs = readFileSync("./schema.graphqls", "utf8"); + return new ApolloServer({ + typeDefs, + resolvers: MergedResolvers, + }); +} diff --git a/test/mockHelpers/fetchMockHelpers.ts b/test/testHelpers/fetchMockHelpers.ts similarity index 100% rename from test/mockHelpers/fetchMockHelpers.ts rename to test/testHelpers/fetchMockHelpers.ts From 8deb9e38a0c9ef3698e051adf9b6d45ec165cc97 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:33:42 -0800 Subject: [PATCH 09/56] add test cases and implementations for StopResolverTests --- test/resolvers/StopResolverTests.test.ts | 92 ++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 4 deletions(-) diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index 4439760..b948f7c 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -1,11 +1,95 @@ -import { beforeEach, describe } from "@jest/globals"; +import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { readFileSync } from "fs"; -import { MergedResolvers } from "../../src/MergedResolvers"; +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; +import { IStop, ISystem } from "../../src/entities/entities"; +import assert = require("node:assert"); describe("StopResolvers", () => { - // replicate setup code + let testServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository; + beforeEach(() => { + testServer = setUpTestServer(); + repository = new UnoptimizedInMemoryRepository(); + }); + + let mockStop: IStop; + let mockSystem: ISystem; + + beforeEach(async () => { + const mockSystems = generateMockSystems(); + mockSystem = mockSystems[0]; + mockSystem.id = "1"; + await repository.addOrUpdateSystem(mockSystem); + + const mockStops = generateMockStops(); + mockStop = mockStops[0]; + mockStop.id = "1"; + await repository.addOrUpdateStop(mockStop); + }) + + describe("orderedStops", () => { + const query = ` + query GetOrderedStops($systemId: ID!, $stopId: ID!) { + system(id: $systemId) { + stop(id: $stopId) { + orderedStops { + routeId + stopId + } + } + } + } + ` + + async function getResponseForQuery() { + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + stopId: mockStop.id, + }, + }, { + contextValue: { + repository, + } + }); + } + + it("returns ordered stops if they exist for the stop ID", async () => { + let mockOrderedStops = generateMockOrderedStops(); + mockOrderedStops = mockOrderedStops.filter((orderedStop) => orderedStop.stopId === mockOrderedStops[0].stopId); + await Promise.all(mockOrderedStops.map(async orderedStop => { + orderedStop.stopId = mockStop.id; + await repository.addOrUpdateOrderedStop(orderedStop); + })); + + const response = await getResponseForQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.stop.orderedStops).toHaveLength(mockOrderedStops.length); + }); + + it("returns empty array if no ordered stops exist", async () => { + const response = await getResponseForQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.stop.orderedStops).toHaveLength(0); + }); + }); + + describe("etas", () => { + it("returns ETAs if they exist for the stop ID", async () => { + + }); + + it("returns empty array if no ETAs exist", async () => { + + }); + }); }); \ No newline at end of file From 65d05f35150c461214f263840bf753158ed78288 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:37:43 -0800 Subject: [PATCH 10/56] add remaining tests for StopResolvers --- test/resolvers/StopResolverTests.test.ts | 62 +++++++++++++++++------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index b948f7c..c7a23b3 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -3,7 +3,7 @@ import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; -import { generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; +import { generateMockEtas, generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -31,6 +31,20 @@ describe("StopResolvers", () => { await repository.addOrUpdateStop(mockStop); }) + async function getResponseForQuery(query: string) { + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + stopId: mockStop.id, + }, + }, { + contextValue: { + repository, + } + }); + } + describe("orderedStops", () => { const query = ` query GetOrderedStops($systemId: ID!, $stopId: ID!) { @@ -45,19 +59,6 @@ describe("StopResolvers", () => { } ` - async function getResponseForQuery() { - return await testServer.executeOperation({ - query, - variables: { - systemId: mockSystem.id, - stopId: mockStop.id, - }, - }, { - contextValue: { - repository, - } - }); - } it("returns ordered stops if they exist for the stop ID", async () => { let mockOrderedStops = generateMockOrderedStops(); @@ -67,7 +68,7 @@ describe("StopResolvers", () => { await repository.addOrUpdateOrderedStop(orderedStop); })); - const response = await getResponseForQuery(); + const response = await getResponseForQuery(query); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); @@ -75,7 +76,7 @@ describe("StopResolvers", () => { }); it("returns empty array if no ordered stops exist", async () => { - const response = await getResponseForQuery(); + const response = await getResponseForQuery(query); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); @@ -84,12 +85,39 @@ describe("StopResolvers", () => { }); describe("etas", () => { - it("returns ETAs if they exist for the stop ID", async () => { + const query = ` + query GetEtas($systemId: ID!, $stopId: ID!) { + system(id: $systemId) { + stop(id: $stopId) { + etas { + secondsRemaining + } + } + } + } + ` + it("returns ETAs if they exist for the stop ID", async () => { + let mockEtas = generateMockEtas(); + mockEtas = mockEtas.filter((eta) => eta.stopId === mockEtas[0].stopId); + await Promise.all(mockEtas.map(async eta => { + eta.stopId = mockStop.id; + await repository.addOrUpdateEta(eta); + })); + + const response = await getResponseForQuery(query); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.stop.etas).toHaveLength(mockEtas.length); }); it("returns empty array if no ETAs exist", async () => { + const response = await getResponseForQuery(query); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + expect((response.body.singleResult.data as any).system.stop.etas).toHaveLength(0); }); }); }); \ No newline at end of file From ae2c656d251945f730389e01f9ad13acd616a248 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:41:06 -0800 Subject: [PATCH 11/56] add test file for OrderedStopResolvers --- .../OrderedStopResolverTests.test.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/resolvers/OrderedStopResolverTests.test.ts diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts new file mode 100644 index 0000000..1958dda --- /dev/null +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -0,0 +1,32 @@ +import { beforeEach, describe } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { ServerContext } from "../../src/ServerContext"; +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; + +describe("OrderedStopResolvers", () => { + let apolloServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository; + + beforeEach(async () => { + apolloServer = setUpTestServer(); + repository = new UnoptimizedInMemoryRepository(); + }); + + describe("nextStop", () => { + + }); + + describe("previousStop", () => { + + }); + + describe("route", () => { + + }); + + describe("stop", () => { + + }); +}); + From 6e05ac5fadc53bc26eb866b436402c100958f605 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:46:38 -0800 Subject: [PATCH 12/56] add queries for ordered stop resolver tests --- .../OrderedStopResolverTests.test.ts | 62 +++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 1958dda..b694a7d 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -14,19 +14,73 @@ describe("OrderedStopResolvers", () => { }); describe("nextStop", () => { - + const query = ` + query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + nextStop { + routeId + stopId + } + } + } + } + } + `; }); describe("previousStop", () => { - + const query = ` + query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + previousStop { + routeId + stopId + } + } + } + } + } + `; }); 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 + } + } + } + } + } + `; }); describe("stop", () => { - + const query = ` + query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + stop { + name + id + } + } + } + } + } + `; }); }); From c09195804af25e07ccee54cfafd36e97b9cb5f12 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:49:43 -0800 Subject: [PATCH 13/56] add test cases --- .../OrderedStopResolverTests.test.ts | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index b694a7d..a1cc727 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe } from "@jest/globals"; +import { beforeEach, describe, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { ServerContext } from "../../src/ServerContext"; @@ -28,6 +28,18 @@ describe("OrderedStopResolvers", () => { } } `; + + it("returns the next stop if it exists", async () => { + + }); + + it("returns null if there is no next stop in the repository", async () => { + + }); + + it("returns null if the current stop no longer exists", async () => { + + }); }); describe("previousStop", () => { @@ -45,6 +57,18 @@ describe("OrderedStopResolvers", () => { } } `; + + 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", () => { @@ -66,6 +90,14 @@ describe("OrderedStopResolvers", () => { `; }); + 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!) { @@ -81,6 +113,14 @@ describe("OrderedStopResolvers", () => { } } `; + + it("returns the associated stop if it exists", async () => { + + }); + + it("returns null if the stop doesn't exist", async () => { + + }); }); }); From c4d3f6f4e980018a004be2c5dc161d512a6f621c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Thu, 23 Jan 2025 15:53:01 -0800 Subject: [PATCH 14/56] add mock data to repository before each test run --- .../OrderedStopResolverTests.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index a1cc727..ac603a1 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -3,6 +3,8 @@ 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 { generateMockRoutes, generateMockShuttles, generateMockStops, generateMockSystems } from "../generators"; describe("OrderedStopResolvers", () => { let apolloServer: ApolloServer; @@ -13,6 +15,27 @@ describe("OrderedStopResolvers", () => { repository = new UnoptimizedInMemoryRepository(); }); + let mockSystem: ISystem; + let mockRoute: IRoute; + let mockStop: 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); + + const mockStops = generateMockStops(); + mockStop = mockStops[0]; + mockStop.id = "1"; + await repository.addOrUpdateStop(mockStop); + }); + describe("nextStop", () => { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { From 0ed17cff6f420c8e8211304a73fb68a34b94b72c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:42:01 -0800 Subject: [PATCH 15/56] add test case for nextStop resolver for ordered stop --- .../OrderedStopResolverTests.test.ts | 63 ++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index ac603a1..073e582 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,23 +1,30 @@ -import { beforeEach, describe, it } from "@jest/globals"; +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 { generateMockRoutes, generateMockShuttles, generateMockStops, generateMockSystems } from "../generators"; +import { + generateMockOrderedStops, + generateMockRoutes, + generateMockShuttles, + generateMockStops, + generateMockSystems +} from "../generators"; +import assert = require("node:assert"); describe("OrderedStopResolvers", () => { - let apolloServer: ApolloServer; + let testServer: ApolloServer; let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { - apolloServer = setUpTestServer(); + testServer = setUpTestServer(); repository = new UnoptimizedInMemoryRepository(); }); let mockSystem: ISystem; let mockRoute: IRoute; - let mockStop: IStop; + let mockStops: IStop[]; beforeEach(async () => { const mockSystems = generateMockSystems(); @@ -30,10 +37,11 @@ describe("OrderedStopResolvers", () => { mockRoute.id = "1"; await repository.addOrUpdateRoute(mockRoute); - const mockStops = generateMockStops(); - mockStop = mockStops[0]; - mockStop.id = "1"; - await repository.addOrUpdateStop(mockStop); + mockStops = generateMockStops(); + + await Promise.all(mockStops.map(async (mockStop) => { + await repository.addOrUpdateStop(mockStop); + })); }); describe("nextStop", () => { @@ -53,7 +61,44 @@ describe("OrderedStopResolvers", () => { `; it("returns the next stop if it exists", async () => { + // Arrange + 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]); + + // Act + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId: orderedStops[0].stopId, + } + }, { + contextValue: { + repository, + } + }); + + // 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 () => { From e079c0283ec872f17376e67d2911c581978092e9 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:45:28 -0800 Subject: [PATCH 16/56] move ordered stops setup to method for reuse in previous stops test --- .../OrderedStopResolverTests.test.ts | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 073e582..e031aca 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -44,6 +44,25 @@ describe("OrderedStopResolvers", () => { })); }); + 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", () => { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { @@ -62,21 +81,7 @@ describe("OrderedStopResolvers", () => { it("returns the next stop if it exists", async () => { // Arrange - 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]); + const orderedStops = await setUpOrderedStopsInRepository(); // Act const response = await testServer.executeOperation({ From 151281a17f367c556e61b95142eac38c07f14449 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:47:33 -0800 Subject: [PATCH 17/56] add test case for null next stop --- .../OrderedStopResolverTests.test.ts | 19 +++++++++++++++++++ test/resolvers/ShuttleResolverTests.test.ts | 13 +++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index e031aca..f0541ad 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -107,7 +107,26 @@ describe("OrderedStopResolvers", () => { }); 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 testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId: orderedStops[0].stopId, + }, + }, { + contextValue: { + repository, + } + }); + + 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 current stop no longer exists", async () => { diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 73f667e..8ee996c 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -7,6 +7,14 @@ import { IShuttle, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +async function addMockSystemToRepository(mockSystem: ISystem, repository: UnoptimizedInMemoryRepository) { + const mockSystems = generateMockSystems(); + mockSystem = mockSystems[0]; + mockSystem.id = "1"; + await repository.addOrUpdateSystem(mockSystem); + return mockSystem; +} + describe("ShuttleResolvers", () => { let testServer: ApolloServer let repository: UnoptimizedInMemoryRepository; @@ -20,10 +28,7 @@ describe("ShuttleResolvers", () => { let mockShuttle: IShuttle; beforeEach(async () => { - const mockSystems = generateMockSystems(); - mockSystem = mockSystems[0]; - mockSystem.id = "1"; - await repository.addOrUpdateSystem(mockSystem); + mockSystem = await addMockSystemToRepository(mockSystem, repository); const mockShuttles = generateMockShuttles(); mockShuttle = mockShuttles[0]; From d423cdb95b25119606d96a88dd074464e9c1bf96 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:52:10 -0800 Subject: [PATCH 18/56] add test case for if next stop object does not exist --- .../OrderedStopResolverTests.test.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index f0541ad..a75ac68 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -129,8 +129,26 @@ describe("OrderedStopResolvers", () => { expect(nonexistentNextStop).toBeNull(); }); - it("returns null if the current stop no longer exists", async () => { + 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 testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId: orderedStops[0].stopId, + }, + }, { + contextValue: { + repository, + } + }); + + assert(response.body.kind === "single"); + const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; + expect(nonexistentNextStop).toBeNull(); }); }); From cf3f26e255036baddf1a8c69d4eb880c705e2a93 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:54:35 -0800 Subject: [PATCH 19/56] refactor querying call into a separate method --- .../OrderedStopResolverTests.test.ts | 47 ++++++------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index a75ac68..9041895 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -79,23 +79,28 @@ describe("OrderedStopResolvers", () => { } `; - it("returns the next stop if it exists", async () => { - // Arrange - const orderedStops = await setUpOrderedStopsInRepository(); - - // Act - const response = await testServer.executeOperation({ + async function getResponseForQuery(stopId: string) { + return await testServer.executeOperation({ query, variables: { systemId: mockSystem.id, routeId: mockRoute.id, - stopId: orderedStops[0].stopId, - } + 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"); @@ -111,18 +116,7 @@ describe("OrderedStopResolvers", () => { orderedStops[0].nextStop = undefined; await repository.addOrUpdateOrderedStop(orderedStops[0]); - const response = await testServer.executeOperation({ - query, - variables: { - systemId: mockSystem.id, - routeId: mockRoute.id, - stopId: orderedStops[0].stopId, - }, - }, { - contextValue: { - repository, - } - }); + const response = await getResponseForQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; @@ -133,18 +127,7 @@ describe("OrderedStopResolvers", () => { const orderedStops = await setUpOrderedStopsInRepository(); await repository.removeStopIfExists(orderedStops[1].stopId); - const response = await testServer.executeOperation({ - query, - variables: { - systemId: mockSystem.id, - routeId: mockRoute.id, - stopId: orderedStops[0].stopId, - }, - }, { - contextValue: { - repository, - } - }); + const response = await getResponseForQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; From f0828e836c43419fd6fbd0f702f685fd3edfc17d Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:56:23 -0800 Subject: [PATCH 20/56] move query string into the function scope --- .../OrderedStopResolverTests.test.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 9041895..e08c999 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -64,22 +64,22 @@ describe("OrderedStopResolvers", () => { } describe("nextStop", () => { - const query = ` - query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { - system(id: $systemId) { - route(id: $routeId) { - orderedStop(forStopId: $stopId) { - nextStop { - routeId - stopId + 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 + } } } } } - } - `; + `; - async function getResponseForQuery(stopId: string) { return await testServer.executeOperation({ query, variables: { From 037beea5e31af094f338ce833015b9f6c36344e8 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 14:57:35 -0800 Subject: [PATCH 21/56] make a similar method for previous stop query response --- .../OrderedStopResolverTests.test.ts | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index e08c999..b97776e 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -64,7 +64,7 @@ describe("OrderedStopResolvers", () => { } describe("nextStop", () => { - async function getResponseForQuery(stopId: string) { + async function getResponseForNextStopQuery(stopId: string) { const query = ` query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { system(id: $systemId) { @@ -100,7 +100,7 @@ describe("OrderedStopResolvers", () => { const orderedStops = await setUpOrderedStopsInRepository(); // Act - const response = await getResponseForQuery(orderedStops[0].stopId); + const response = await getResponseForNextStopQuery(orderedStops[0].stopId); // Assert assert(response.body.kind === "single"); @@ -116,7 +116,7 @@ describe("OrderedStopResolvers", () => { orderedStops[0].nextStop = undefined; await repository.addOrUpdateOrderedStop(orderedStops[0]); - const response = await getResponseForQuery(orderedStops[0].stopId); + const response = await getResponseForNextStopQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; @@ -127,7 +127,7 @@ describe("OrderedStopResolvers", () => { const orderedStops = await setUpOrderedStopsInRepository(); await repository.removeStopIfExists(orderedStops[1].stopId); - const response = await getResponseForQuery(orderedStops[0].stopId); + const response = await getResponseForNextStopQuery(orderedStops[0].stopId); assert(response.body.kind === "single"); const nonexistentNextStop = (response.body.singleResult.data?.system as any).route.orderedStop.nextStop; @@ -136,20 +136,35 @@ describe("OrderedStopResolvers", () => { }); describe("previousStop", () => { - const query = ` - query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { - system(id: $systemId) { - route(id: $routeId) { - orderedStop(forStopId: $stopId) { - previousStop { - routeId - stopId + async function getResponseForPreviousStopQuery(stopId: string) { + const query = ` + query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + previousStop { + routeId + stopId + } + } } } } - } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId, + }, + }, { + contextValue: { + repository, + } + }); } - `; it("returns the previous stop if it exists", async () => { From 9ca432c5b4b0bee39e958596dc19750c93e5fafd Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:00:04 -0800 Subject: [PATCH 22/56] add similar test cases for previous stop --- .../OrderedStopResolverTests.test.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index b97776e..d724170 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -167,15 +167,42 @@ describe("OrderedStopResolvers", () => { } it("returns the previous stop if it exists", async () => { + // Arrange + const orderedStops = await setUpOrderedStopsInRepository(); + // Act + const response = await getResponseForPreviousStopQuery(orderedStops[1].stopId); + + // Assert + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const previousStop = (response.body.singleResult.data?.system as any).route.orderedStop.previousStop; + expect(previousStop.stopId).toEqual(orderedStops[0].stopId); + expect(previousStop.routeId).toEqual(orderedStops[0].routeId); }); it("returns null if there is no previous stop in the repository", async () => { + const orderedStops = await setUpOrderedStopsInRepository(); + orderedStops[1].previousStop = undefined; + await repository.addOrUpdateOrderedStop(orderedStops[1]); + const response = await getResponseForPreviousStopQuery(orderedStops[1].stopId); + + assert(response.body.kind === "single"); + const nonexistentPreviousStop = (response.body.singleResult.data?.system as any).route.orderedStop.previousStop; + expect(nonexistentPreviousStop).toBeNull(); }); it("returns null if the current stop no longer exists", async () => { + const orderedStops = await setUpOrderedStopsInRepository(); + await repository.removeStopIfExists(orderedStops[0].stopId); + const response = await getResponseForPreviousStopQuery(orderedStops[1].stopId); + + assert(response.body.kind === "single"); + const nonexistentPreviousStop = (response.body.singleResult.data?.system as any).route.orderedStop.previousStop; + expect(nonexistentPreviousStop).toBeNull(); }); }); From 3aeaca68440337ee3d567d43003225a2b7eb49bc Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:07:54 -0800 Subject: [PATCH 23/56] add test for associated route --- .../OrderedStopResolverTests.test.ts | 59 ++++++++++++++----- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index d724170..eb7140a 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -208,28 +208,59 @@ describe("OrderedStopResolvers", () => { 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 + // so fetch all ordered stops for a stop instead. + // If we went through the route ID, it would've + // relied on the parent data within the route.orderedStop resolver + async function getResponseForRouteQuery(stopId: string) { + const query = ` + query GetNextStop($systemId: ID!, $stopId: ID!) { + system(id: $systemId) { + stop(id: $stopId) { + orderedStops { + route { + id + name + } } } } } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + stopId, + } + }, { + contextValue: { + repository, + } + }); } - `; - }); - it("returns the associated route if it exists", async () => { + it("returns the associated route if it exists", async () => { + const orderedStops = generateMockOrderedStops(); + orderedStops[0].routeId = mockRoute.id; + orderedStops[0].stopId = mockStops[0].id; - }); + // Add one stop only + await repository.addOrUpdateOrderedStop(orderedStops[0]); - it("returns null if the route doesn't exist", async () => { + const response = await getResponseForRouteQuery(orderedStops[1].stopId); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const route = (response.body.singleResult.data?.system as any).stop.orderedStops[0].route + + expect(route.id).toEqual(mockRoute.id); + expect(route.name).toEqual(mockRoute.name); + }); + + it("returns null if the route doesn't exist", async () => { + + }); }); From 95492bd319a5e9b3247b43e8cb44d2d28d05d86e Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:08:44 -0800 Subject: [PATCH 24/56] remove testcases for null values (no effect on test coverage) --- test/resolvers/OrderedStopResolverTests.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index eb7140a..e562b83 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -258,10 +258,6 @@ describe("OrderedStopResolvers", () => { expect(route.name).toEqual(mockRoute.name); }); - it("returns null if the route doesn't exist", async () => { - - }); - }); describe("stop", () => { @@ -283,10 +279,6 @@ describe("OrderedStopResolvers", () => { it("returns the associated stop if it exists", async () => { }); - - it("returns null if the stop doesn't exist", async () => { - - }); }); }); From 96846cbd88937b08666990dfa1d7a1c90dc18e63 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:25:09 -0800 Subject: [PATCH 25/56] add remaining test cases for ordered stop resolvers --- .../OrderedStopResolverTests.test.ts | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index e562b83..b9602f0 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -261,23 +261,48 @@ describe("OrderedStopResolvers", () => { }); describe("stop", () => { - const query = ` - query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { - system(id: $systemId) { - route(id: $routeId) { - orderedStop(forStopId: $stopId) { - stop { - name - id + async function getResponseForStopQuery(stopId: string) { + const query = ` + query GetNextStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + stop { + name + id + } } } } } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId, + } + }, { + contextValue: { + repository, + } + }); } - `; it("returns the associated stop if it exists", async () => { + const orderedStops = await setUpOrderedStopsInRepository(); + orderedStops[0].stopId = mockStops[0].id; + await repository.addOrUpdateOrderedStop(orderedStops[0]); + const response = await getResponseForStopQuery(orderedStops[0].stopId); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const stop = (response.body.singleResult.data?.system as any).route.orderedStop.stop; + expect(stop.name).toEqual(mockStops[0].name); + expect(stop.id).toEqual(mockStops[0].id); }); }); }); From d03a99ee06aa8d3d86ea63b7c069ca375a07baa2 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:30:54 -0800 Subject: [PATCH 26/56] add test cases for eta resolver tests --- test/resolvers/EtaResolverTests.test.ts | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 test/resolvers/EtaResolverTests.test.ts diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts new file mode 100644 index 0000000..440da68 --- /dev/null +++ b/test/resolvers/EtaResolverTests.test.ts @@ -0,0 +1,55 @@ +import { beforeEach, describe, it } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { ServerContext } from "../../src/ServerContext"; + +describe("EtaResolvers", () => { + let testServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository; + + beforeEach(async () => { + testServer = setUpTestServer(); + repository = new UnoptimizedInMemoryRepository(); + }); + + describe("stop", () => { + const query = ` + query GetETAStop($systemId: ID!, $shuttleId: ID!) { + system(id: $systemId) { + shuttle(id: $shuttleId) { + etas { + stop { + id + } + } + } + } + } + `; + + it("returns the associated stop if it exists", async () => { + + }); + }); + + describe("shuttle", () => { + const query = ` + query GetETAShuttle($systemId: ID!, $shuttleId: ID!) { + system(id: $systemId) { + shuttle(id: $shuttleId) { + etas { + shuttle { + id + } + } + } + } + } + `; + + it("returns the associated shuttle if it exists", async () => { + + }); + }); +}); \ No newline at end of file From 4b84527fa47c35865701d0092b9a9f6cbfd72038 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:33:38 -0800 Subject: [PATCH 27/56] extract mock system add to repository setup helpers file --- test/resolvers/EtaResolverTests.test.ts | 8 ++++++++ test/resolvers/ShuttleResolverTests.test.ts | 10 ++-------- test/testHelpers/repositorySetupHelpers.ts | 12 ++++++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 test/testHelpers/repositorySetupHelpers.ts diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 440da68..49aeb29 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -3,6 +3,8 @@ import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; +import { ISystem } from "../../src/entities/entities"; +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("EtaResolvers", () => { let testServer: ApolloServer; @@ -13,6 +15,12 @@ describe("EtaResolvers", () => { repository = new UnoptimizedInMemoryRepository(); }); + let mockSystem: ISystem; + + beforeEach(async () => { + mockSystem = await addMockSystemToRepository(repository); + }) + describe("stop", () => { const query = ` query GetETAStop($systemId: ID!, $shuttleId: ID!) { diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 8ee996c..95bd8a5 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -6,14 +6,8 @@ import { generateMockEtas, generateMockRoutes, generateMockShuttles, generateMoc import { IShuttle, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -async function addMockSystemToRepository(mockSystem: ISystem, repository: UnoptimizedInMemoryRepository) { - const mockSystems = generateMockSystems(); - mockSystem = mockSystems[0]; - mockSystem.id = "1"; - await repository.addOrUpdateSystem(mockSystem); - return mockSystem; -} describe("ShuttleResolvers", () => { let testServer: ApolloServer @@ -28,7 +22,7 @@ describe("ShuttleResolvers", () => { let mockShuttle: IShuttle; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(mockSystem, repository); + mockSystem = await addMockSystemToRepository(repository); const mockShuttles = generateMockShuttles(); mockShuttle = mockShuttles[0]; diff --git a/test/testHelpers/repositorySetupHelpers.ts b/test/testHelpers/repositorySetupHelpers.ts new file mode 100644 index 0000000..65175be --- /dev/null +++ b/test/testHelpers/repositorySetupHelpers.ts @@ -0,0 +1,12 @@ +import { ISystem } from "../../src/entities/entities"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { generateMockSystems } from "../generators"; + +export async function addMockSystemToRepository(repository: UnoptimizedInMemoryRepository) { + const mockSystems = generateMockSystems(); + const mockSystem = mockSystems[0]; + mockSystem.id = "1"; + await repository.addOrUpdateSystem(mockSystem); + + return mockSystem; +} From f198af8b133ef004ea0b55f6b7c73c52a73eff9e Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:35:49 -0800 Subject: [PATCH 28/56] use addMockSystemToRepository method in other tests --- test/resolvers/OrderedStopResolverTests.test.ts | 6 ++---- test/resolvers/StopResolverTests.test.ts | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index b9602f0..d26f7bc 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -12,6 +12,7 @@ import { generateMockSystems } from "../generators"; import assert = require("node:assert"); +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("OrderedStopResolvers", () => { let testServer: ApolloServer; @@ -27,10 +28,7 @@ describe("OrderedStopResolvers", () => { let mockStops: IStop[]; beforeEach(async () => { - const mockSystems = generateMockSystems(); - mockSystem = mockSystems[0]; - mockSystem.id = "1"; - await repository.addOrUpdateSystem(mockSystem); + mockSystem = await addMockSystemToRepository(repository); const mockRoutes = generateMockRoutes(); mockRoute = mockRoutes[0]; diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index c7a23b3..392fd24 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -6,6 +6,7 @@ import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockEtas, generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("StopResolvers", () => { let testServer: ApolloServer; @@ -20,10 +21,7 @@ describe("StopResolvers", () => { let mockSystem: ISystem; beforeEach(async () => { - const mockSystems = generateMockSystems(); - mockSystem = mockSystems[0]; - mockSystem.id = "1"; - await repository.addOrUpdateSystem(mockSystem); + mockSystem = await addMockSystemToRepository(repository); const mockStops = generateMockStops(); mockStop = mockStops[0]; From caf85a39ad897bd86a0b21fcb00d465997ee772a Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:44:53 -0800 Subject: [PATCH 29/56] add test case for eta stop --- test/resolvers/EtaResolverTests.test.ts | 42 +++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 49aeb29..7986a87 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -1,10 +1,12 @@ -import { beforeEach, describe, it } from "@jest/globals"; +import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; -import { ISystem } from "../../src/entities/entities"; +import { IShuttle, ISystem } from "../../src/entities/entities"; import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { generateMockEtas, generateMockShuttles, generateMockStops } from "../generators"; +import assert = require("node:assert"); describe("EtaResolvers", () => { let testServer: ApolloServer; @@ -16,10 +18,16 @@ describe("EtaResolvers", () => { }); let mockSystem: ISystem; + let mockShuttle: IShuttle; beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); - }) + + const mockShuttles = generateMockShuttles(); + mockShuttle = mockShuttles[0]; + mockShuttle.systemId = mockSystem.id; + await repository.addOrUpdateShuttle(mockShuttle); + }); describe("stop", () => { const query = ` @@ -37,7 +45,35 @@ describe("EtaResolvers", () => { `; it("returns the associated stop if it exists", async () => { + const stops = generateMockStops(); + const stop = stops[0]; + stop.systemId = mockSystem.id; + const etas = generateMockEtas(); + await Promise.all(etas.map(async (eta) => { + eta.stopId = stop.id; + await repository.addOrUpdateEta(eta); + })); + const expectedEta = etas[0]; + + await repository.addOrUpdateStop(stop); + + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + }, + }, { + contextValue: { + repository, + } + }); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const eta = (response.body.singleResult.data?.system as any).shuttle.etas[0]; + expect(eta.stop.id).toEqual(expectedEta.stopId); }); }); From 9c35b03a5b960a8f06062ce0d285b7013d02f7d7 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:47:06 -0800 Subject: [PATCH 30/56] update test data for correctness --- test/resolvers/EtaResolverTests.test.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 7986a87..daf5fef 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -48,15 +48,13 @@ describe("EtaResolvers", () => { const stops = generateMockStops(); const stop = stops[0]; stop.systemId = mockSystem.id; + await repository.addOrUpdateStop(stop); const etas = generateMockEtas(); - await Promise.all(etas.map(async (eta) => { - eta.stopId = stop.id; - await repository.addOrUpdateEta(eta); - })); const expectedEta = etas[0]; - - await repository.addOrUpdateStop(stop); + expectedEta.stopId = stop.id; + expectedEta.shuttleId = mockShuttle.id; + await repository.addOrUpdateEta(expectedEta); const response = await testServer.executeOperation({ query, From 2b3d292b4d56dbd57f80b79598fb4d85908e2358 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:52:23 -0800 Subject: [PATCH 31/56] move response fetch to common method and use single expectedEta object across both tests --- test/resolvers/EtaResolverTests.test.ts | 58 +++++++++++++++---------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index daf5fef..a90814e 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -3,7 +3,7 @@ import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; -import { IShuttle, ISystem } from "../../src/entities/entities"; +import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import { generateMockEtas, generateMockShuttles, generateMockStops } from "../generators"; import assert = require("node:assert"); @@ -19,6 +19,8 @@ describe("EtaResolvers", () => { let mockSystem: ISystem; let mockShuttle: IShuttle; + let mockStop: IStop; + let expectedEta: IEta; beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); @@ -27,8 +29,34 @@ describe("EtaResolvers", () => { mockShuttle = mockShuttles[0]; mockShuttle.systemId = mockSystem.id; await repository.addOrUpdateShuttle(mockShuttle); + + const mockStops = generateMockStops(); + mockStop = mockStops[0]; + mockStop.systemId = mockSystem.id; + await repository.addOrUpdateStop(mockStop); + + const etas = generateMockEtas(); + expectedEta = etas[0]; + expectedEta.stopId = mockStop.id; + expectedEta.shuttleId = mockShuttle.id; + await repository.addOrUpdateEta(expectedEta); }); + async function getResponseForEtaQuery(query: string) { + const response = await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: mockShuttle.id, + }, + }, { + contextValue: { + repository, + } + }); + return response; + } + describe("stop", () => { const query = ` query GetETAStop($systemId: ID!, $shuttleId: ID!) { @@ -45,28 +73,7 @@ describe("EtaResolvers", () => { `; it("returns the associated stop if it exists", async () => { - const stops = generateMockStops(); - const stop = stops[0]; - stop.systemId = mockSystem.id; - await repository.addOrUpdateStop(stop); - - const etas = generateMockEtas(); - const expectedEta = etas[0]; - expectedEta.stopId = stop.id; - expectedEta.shuttleId = mockShuttle.id; - await repository.addOrUpdateEta(expectedEta); - - const response = await testServer.executeOperation({ - query, - variables: { - systemId: mockSystem.id, - shuttleId: mockShuttle.id, - }, - }, { - contextValue: { - repository, - } - }); + const response = await getResponseForEtaQuery(query); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); @@ -91,7 +98,12 @@ describe("EtaResolvers", () => { `; it("returns the associated shuttle if it exists", async () => { + const response = await getResponseForEtaQuery(query); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const eta = (response.body.singleResult.data?.system as any).shuttle.etas[0]; + expect(eta.shuttle.id).toEqual(expectedEta.shuttleId); }); }); }); \ No newline at end of file From da3d67a075f56689af34470cd4a780a6034f6a7a Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:53:56 -0800 Subject: [PATCH 32/56] fix spacing for RouteResolvers.Route --- src/resolvers/RouteResolvers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/resolvers/RouteResolvers.ts b/src/resolvers/RouteResolvers.ts index 94dc13f..0c71cfd 100644 --- a/src/resolvers/RouteResolvers.ts +++ b/src/resolvers/RouteResolvers.ts @@ -7,10 +7,10 @@ export const RouteResolvers: Resolvers = { const shuttles = await contextValue.repository.getShuttlesByRouteId(parent.id); return shuttles.map(({ - coordinates, - name, - id, - }) => ({ + coordinates, + name, + id, + }) => ({ coordinates: coordinates as Coordinates, name, route: parent, From b09228fe5d41232832d56b87519a346d7fb7a5ad Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 15:56:25 -0800 Subject: [PATCH 33/56] add test cases for route resolver tests --- test/resolvers/RouteResolverTests.test.ts | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 test/resolvers/RouteResolverTests.test.ts diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts new file mode 100644 index 0000000..5276121 --- /dev/null +++ b/test/resolvers/RouteResolverTests.test.ts @@ -0,0 +1,35 @@ +import { beforeEach, describe, it } from "@jest/globals"; +import { ServerContext } from "../../src/ServerContext"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { ApolloServer } from "@apollo/server"; + +describe("RouteResolvers", () => { + let testServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository + + beforeEach(async () => { + testServer = setUpTestServer(); + repository = new UnoptimizedInMemoryRepository(); + }); + + describe("shuttles", () => { + it("returns shuttle array if there are shuttles", async () => { + + }); + + it("returns empty array if there are no shuttles", async () => { + + }); + }); + + describe("orderedStop", () => { + it("returns ordered stop for stop ID if there is one", async () => { + + }); + + it("returns null if there is no stop", async () => { + + }); + }); +}); From f2c1f605ae3faab0f3aae56c217fd73e58de1ba2 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 16:17:20 -0800 Subject: [PATCH 34/56] add queries and execution methods --- test/resolvers/RouteResolverTests.test.ts | 82 ++++++++++++++++++++++- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 5276121..8a21e7f 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -3,17 +3,66 @@ import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ApolloServer } from "@apollo/server"; +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { generateMockRoutes, generateMockStops } from "../generators"; +import { IRoute, IStop, ISystem } from "../../src/entities/entities"; describe("RouteResolvers", () => { let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository + let repository: UnoptimizedInMemoryRepository; beforeEach(async () => { testServer = setUpTestServer(); repository = new UnoptimizedInMemoryRepository(); }); + let mockSystem: ISystem; + let mockRoute: IRoute; + let mockStop: IStop; + + beforeEach(async () => { + mockSystem = await addMockSystemToRepository(repository); + + const mockRoutes = generateMockRoutes(); + mockRoute = mockRoutes[0]; + mockRoute.systemId = mockSystem.id; + await repository.addOrUpdateRoute(mockRoute); + + const mockStops = generateMockStops(); + mockStop = mockStops[0]; + mockStop.systemId = mockSystem.id; + await repository.addOrUpdateStop(mockStop); + }); + + describe("shuttles", () => { + async function getResponseForShuttlesQuery() { + const query = ` + query GetRouteShuttles($systemId: ID!, $routeId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + shuttles { + id + name + } + } + } + } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + }, + }, { + contextValue: { + repository, + } + }); + } + it("returns shuttle array if there are shuttles", async () => { }); @@ -24,11 +73,38 @@ describe("RouteResolvers", () => { }); describe("orderedStop", () => { - it("returns ordered stop for stop ID if there is one", async () => { + async function getResponseForOrderedStopQuery() { + const query = ` + query GetRouteOrderedStop($systemId: ID!, $routeId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + orderedStop(forStopId: $stopId) { + stopId + } + } + } + } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId: mockRoute.id, + stopId: mockStop.id, + } + }, { + contextValue: { + repository, + } + }); + } + + it("returns ordered stop using provided data", async () => { }); - it("returns null if there is no stop", async () => { + it("returns null if the stop doesn't exist", async () => { }); }); From 2a56bfb3efdb8bdc56414105d0b4384b036a328d Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 16:21:54 -0800 Subject: [PATCH 35/56] add test cases for shuttles resolver --- test/resolvers/RouteResolverTests.test.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 8a21e7f..77b5b20 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -1,11 +1,12 @@ -import { beforeEach, describe, it } from "@jest/globals"; +import { beforeEach, describe, expect, it } from "@jest/globals"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ApolloServer } from "@apollo/server"; import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -import { generateMockRoutes, generateMockStops } from "../generators"; +import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; +import assert = require("node:assert"); describe("RouteResolvers", () => { let testServer: ApolloServer; @@ -64,11 +65,28 @@ describe("RouteResolvers", () => { } it("returns shuttle array if there are shuttles", async () => { + const expectedShuttles = generateMockShuttles(); + const expectedShuttle = expectedShuttles[0]; + expectedShuttle.systemId = mockSystem.id; + expectedShuttle.routeId = mockRoute.id; + await repository.addOrUpdateShuttle(expectedShuttle); + const response = await getResponseForShuttlesQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined() + const shuttle = (response.body.singleResult.data as any).system.route.shuttles[0]; + expect(shuttle.id).toEqual(expectedShuttle.id); + expect(shuttle.name).toEqual(expectedShuttle.name); }); it("returns empty array if there are no shuttles", async () => { + const response = await getResponseForShuttlesQuery(); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined() + const shuttles = (response.body.singleResult.data as any).system.route.shuttles; + expect(shuttles.length).toEqual(0); }); }); From 2d4f866308fbfc189c5a74f37e76df1e87ff3bf7 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 16:26:31 -0800 Subject: [PATCH 36/56] add test cases for orderedStop resolver --- test/resolvers/RouteResolverTests.test.ts | 30 +++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 77b5b20..e445cb7 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -4,7 +4,7 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/Unoptimize import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ApolloServer } from "@apollo/server"; import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; +import { generateMockOrderedStops, generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -93,7 +93,7 @@ describe("RouteResolvers", () => { describe("orderedStop", () => { async function getResponseForOrderedStopQuery() { const query = ` - query GetRouteOrderedStop($systemId: ID!, $routeId: ID!) { + query GetRouteOrderedStop($systemId: ID!, $routeId: ID!, $stopId: ID!) { system(id: $systemId) { route(id: $routeId) { orderedStop(forStopId: $stopId) { @@ -119,11 +119,37 @@ describe("RouteResolvers", () => { } it("returns ordered stop using provided data", async () => { + const orderedStops = generateMockOrderedStops(); + const expectedOrderedStop = orderedStops[0]; + expectedOrderedStop.stopId = mockStop.id; + expectedOrderedStop.routeId = mockRoute.id; + await repository.addOrUpdateOrderedStop(expectedOrderedStop); + const response = await getResponseForOrderedStopQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const orderedStop = (response.body.singleResult.data as any).system.route.orderedStop; + expect(orderedStop.stopId).toEqual(expectedOrderedStop.stopId); }); it("returns null if the stop doesn't exist", async () => { + const orderedStops = generateMockOrderedStops(); + const expectedOrderedStop = orderedStops[0]; + expectedOrderedStop.stopId = mockStop.id; + expectedOrderedStop.routeId = mockRoute.id; + await repository.addOrUpdateOrderedStop(expectedOrderedStop); + await repository.removeStopIfExists(mockStop.id); + + const response = await getResponseForOrderedStopQuery(); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const orderedStop = (response.body.singleResult.data as any).system.route.orderedStop; + expect(orderedStop).toBeNull(); }); }); }); From 3fd8efdd8aca728f21f2e0ae8c43bb4ee6b51986 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:31:06 -0800 Subject: [PATCH 37/56] add addMockRouteToRepository and addMockStopToRepository methods --- test/resolvers/EtaResolverTests.test.ts | 7 ++---- .../OrderedStopResolverTests.test.ts | 9 ++------ test/resolvers/RouteResolverTests.test.ts | 18 +++++++-------- test/resolvers/StopResolverTests.test.ts | 8 ++----- test/testHelpers/repositorySetupHelpers.ts | 22 +++++++++++++++++-- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index a90814e..57d6735 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -4,7 +4,7 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/Unoptimize import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import { generateMockEtas, generateMockShuttles, generateMockStops } from "../generators"; import assert = require("node:assert"); @@ -30,10 +30,7 @@ describe("EtaResolvers", () => { mockShuttle.systemId = mockSystem.id; await repository.addOrUpdateShuttle(mockShuttle); - const mockStops = generateMockStops(); - mockStop = mockStops[0]; - mockStop.systemId = mockSystem.id; - await repository.addOrUpdateStop(mockStop); + mockStop = await addMockStopToRepository(repository, mockSystem.id); const etas = generateMockEtas(); expectedEta = etas[0]; diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index d26f7bc..3a96891 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -12,7 +12,7 @@ import { generateMockSystems } from "../generators"; import assert = require("node:assert"); -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { addMockRouteToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("OrderedStopResolvers", () => { let testServer: ApolloServer; @@ -29,14 +29,9 @@ describe("OrderedStopResolvers", () => { beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); - - const mockRoutes = generateMockRoutes(); - mockRoute = mockRoutes[0]; - mockRoute.id = "1"; - await repository.addOrUpdateRoute(mockRoute); + mockRoute = await addMockRouteToRepository(repository, mockSystem.id); mockStops = generateMockStops(); - await Promise.all(mockStops.map(async (mockStop) => { await repository.addOrUpdateStop(mockStop); })); diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index e445cb7..fa5e24a 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -3,7 +3,11 @@ import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ApolloServer } from "@apollo/server"; -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { + addMockRouteToRepository, + addMockStopToRepository, + addMockSystemToRepository +} from "../testHelpers/repositorySetupHelpers"; import { generateMockOrderedStops, generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -23,16 +27,10 @@ describe("RouteResolvers", () => { beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); + const systemId = mockSystem.id; - const mockRoutes = generateMockRoutes(); - mockRoute = mockRoutes[0]; - mockRoute.systemId = mockSystem.id; - await repository.addOrUpdateRoute(mockRoute); - - const mockStops = generateMockStops(); - mockStop = mockStops[0]; - mockStop.systemId = mockSystem.id; - await repository.addOrUpdateStop(mockStop); + mockRoute = await addMockRouteToRepository(repository, systemId); + mockStop = await addMockStopToRepository(repository, systemId); }); diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index 392fd24..ef3ea93 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -6,7 +6,7 @@ import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockEtas, generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("StopResolvers", () => { let testServer: ApolloServer; @@ -22,11 +22,7 @@ describe("StopResolvers", () => { beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); - - const mockStops = generateMockStops(); - mockStop = mockStops[0]; - mockStop.id = "1"; - await repository.addOrUpdateStop(mockStop); + mockStop = await addMockStopToRepository(repository, mockSystem.id); }) async function getResponseForQuery(query: string) { diff --git a/test/testHelpers/repositorySetupHelpers.ts b/test/testHelpers/repositorySetupHelpers.ts index 65175be..efff0eb 100644 --- a/test/testHelpers/repositorySetupHelpers.ts +++ b/test/testHelpers/repositorySetupHelpers.ts @@ -1,6 +1,5 @@ -import { ISystem } from "../../src/entities/entities"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { generateMockSystems } from "../generators"; +import { generateMockRoutes, generateMockStops, generateMockSystems } from "../generators"; export async function addMockSystemToRepository(repository: UnoptimizedInMemoryRepository) { const mockSystems = generateMockSystems(); @@ -10,3 +9,22 @@ export async function addMockSystemToRepository(repository: UnoptimizedInMemoryR return mockSystem; } + +export async function addMockRouteToRepository(repository: UnoptimizedInMemoryRepository, systemId: string) { + const mockRoutes = generateMockRoutes(); + const mockRoute = mockRoutes[0]; + mockRoute.systemId = systemId; + await repository.addOrUpdateRoute(mockRoute); + + return mockRoute; +} + +export async function addMockStopToRepository(repository: UnoptimizedInMemoryRepository, systemId: string) { + const mockStops = generateMockStops(); + const mockStop = mockStops[0]; + mockStop.systemId = systemId; + await repository.addOrUpdateStop(mockStop); + + return mockStop; +} + From fe705ed8e39ff6eb5c87ea189539312c0621bd5a Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:35:18 -0800 Subject: [PATCH 38/56] add mock shuttle and mock eta methods --- test/resolvers/EtaResolverTests.test.ts | 20 ++++++---------- test/resolvers/ShuttleResolverTests.test.ts | 9 ++----- test/testHelpers/repositorySetupHelpers.ts | 26 ++++++++++++++++++++- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 57d6735..d7c4107 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -4,7 +4,11 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/Unoptimize import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; -import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { + addMockEtaToRepository, addMockShuttleToRepository, + addMockStopToRepository, + addMockSystemToRepository +} from "../testHelpers/repositorySetupHelpers"; import { generateMockEtas, generateMockShuttles, generateMockStops } from "../generators"; import assert = require("node:assert"); @@ -24,19 +28,9 @@ describe("EtaResolvers", () => { beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); - - const mockShuttles = generateMockShuttles(); - mockShuttle = mockShuttles[0]; - mockShuttle.systemId = mockSystem.id; - await repository.addOrUpdateShuttle(mockShuttle); - + mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); mockStop = await addMockStopToRepository(repository, mockSystem.id); - - const etas = generateMockEtas(); - expectedEta = etas[0]; - expectedEta.stopId = mockStop.id; - expectedEta.shuttleId = mockShuttle.id; - await repository.addOrUpdateEta(expectedEta); + expectedEta = await addMockEtaToRepository(repository, mockStop.id, mockShuttle.id); }); async function getResponseForEtaQuery(query: string) { diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 95bd8a5..f2be62d 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -6,7 +6,7 @@ import { generateMockEtas, generateMockRoutes, generateMockShuttles, generateMoc import { IShuttle, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { addMockShuttleToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("ShuttleResolvers", () => { @@ -23,12 +23,7 @@ describe("ShuttleResolvers", () => { beforeEach(async () => { mockSystem = await addMockSystemToRepository(repository); - - const mockShuttles = generateMockShuttles(); - mockShuttle = mockShuttles[0]; - mockShuttle.systemId = mockSystem.id; - mockShuttle.id = "1"; - await repository.addOrUpdateShuttle(mockShuttle); + mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); }); diff --git a/test/testHelpers/repositorySetupHelpers.ts b/test/testHelpers/repositorySetupHelpers.ts index efff0eb..60350c5 100644 --- a/test/testHelpers/repositorySetupHelpers.ts +++ b/test/testHelpers/repositorySetupHelpers.ts @@ -1,5 +1,11 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { generateMockRoutes, generateMockStops, generateMockSystems } from "../generators"; +import { + generateMockEtas, + generateMockRoutes, + generateMockShuttles, + generateMockStops, + generateMockSystems +} from "../generators"; export async function addMockSystemToRepository(repository: UnoptimizedInMemoryRepository) { const mockSystems = generateMockSystems(); @@ -28,3 +34,21 @@ export async function addMockStopToRepository(repository: UnoptimizedInMemoryRep return mockStop; } +export async function addMockShuttleToRepository(repository: UnoptimizedInMemoryRepository, systemId: string) { + const mockShuttles = generateMockShuttles(); + const mockShuttle = mockShuttles[0]; + mockShuttle.systemId = systemId; + await repository.addOrUpdateShuttle(mockShuttle); + return mockShuttle; +} + +export async function addMockEtaToRepository(repository: UnoptimizedInMemoryRepository, stopId: string, shuttleId: string) { + const etas = generateMockEtas(); + const expectedEta = etas[0]; + expectedEta.stopId = stopId; + expectedEta.shuttleId = shuttleId; + await repository.addOrUpdateEta(expectedEta); + + return expectedEta; +} + From 3fca362c14dc796a8c41059654ccd6d367cb570f Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:38:17 -0800 Subject: [PATCH 39/56] simplify stops resolver to one statement --- src/resolvers/SystemResolvers.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/resolvers/SystemResolvers.ts b/src/resolvers/SystemResolvers.ts index b78e922..e5391d7 100644 --- a/src/resolvers/SystemResolvers.ts +++ b/src/resolvers/SystemResolvers.ts @@ -7,17 +7,7 @@ export const SystemResolvers: Resolvers = { return await contextValue.repository.getRoutesBySystemId(parent.id); }, stops: async (parent, args, contextValue, info) => { - const stops = await contextValue.repository.getStopsBySystemId(parent.id); - return stops.map(({ - id, - name, - coordinates - }) => ({ - id, - name, - // Both ICoordinates and Coordinates have the same definition - coordinates: coordinates as Coordinates, - })); + return await contextValue.repository.getStopsBySystemId(parent.id); }, stop: async (parent, args, contextValue, info) => { if (!args.id) return null; From 391884c91db0a0148485779831bd9fc8d738722c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:40:36 -0800 Subject: [PATCH 40/56] reduce System.shuttles resolver to one statement --- src/resolvers/SystemResolvers.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/resolvers/SystemResolvers.ts b/src/resolvers/SystemResolvers.ts index e5391d7..a270798 100644 --- a/src/resolvers/SystemResolvers.ts +++ b/src/resolvers/SystemResolvers.ts @@ -40,14 +40,7 @@ export const SystemResolvers: Resolvers = { return shuttle; }, shuttles: async (parent, args, contextValue, info) => { - const shuttles = await contextValue.repository.getShuttlesBySystemId(parent.id); - - return shuttles.map(shuttle => ({ - coordinates: shuttle.coordinates, - name: shuttle.name, - id: shuttle.id, - routeId: shuttle.routeId, - })); + return await contextValue.repository.getShuttlesBySystemId(parent.id); } }, } \ No newline at end of file From 50078adc318c066453136da15b227e0b346dc602 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:40:58 -0800 Subject: [PATCH 41/56] add test cases for system resolvers --- test/resolvers/SystemResolverTests.test.ts | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 test/resolvers/SystemResolverTests.test.ts diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts new file mode 100644 index 0000000..794eda7 --- /dev/null +++ b/test/resolvers/SystemResolverTests.test.ts @@ -0,0 +1,63 @@ +import { describe, it } from "@jest/globals"; + +describe("SystemResolvers", () => { + describe("routes", () => { + it("gets routes associated with system id", async () => { + + }); + }); + + describe("stops", () => { + it("gets stops associated with system id", async () => { + + }); + }); + + describe("stop", () => { + it("gets the stop with the correct id", async () => { + + }); + + it("returns null if the stop isn't associated with the system", async () => { + + }); + + it("returns null if there is no stop", async () => { + + }); + }); + + describe("route", () => { + it("gets the route with the correct id", async () => { + + }); + + it("returns null if the stop isn't associated with the system", async () => { + + }); + + it("returns null if there is no route", async () => { + + }); + }); + + describe("shuttle", () => { + it("gets the shuttle with the correct id", async () => { + + }); + + it("returns null if the stop isn't associated with the system", async () => { + + }); + + it("returns null if there is no shuttle", async () => { + + }); + }); + + describe("shuttles", () => { + it("gets shuttles associated with system id", async () => { + + }); + }); +}); \ No newline at end of file From f391b66b7c979c8e0f5469215130dac65b7c2d82 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:44:18 -0800 Subject: [PATCH 42/56] add test server and repository for system resolvers --- test/resolvers/SystemResolverTests.test.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index 794eda7..cc37c6f 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -1,9 +1,20 @@ -import { describe, it } from "@jest/globals"; +import { beforeEach, describe, it } from "@jest/globals"; +import { ApolloServer } from "@apollo/server"; +import { ServerContext } from "../../src/ServerContext"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; describe("SystemResolvers", () => { + let testServer: ApolloServer; + let repository: UnoptimizedInMemoryRepository; + + beforeEach(async () => { + testServer = setUpTestServer(); + repository = new UnoptimizedInMemoryRepository(); + }); + describe("routes", () => { it("gets routes associated with system id", async () => { - }); }); From b3cf13ec4e8204af9fe32a4673b5b3d65818f908 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 20:52:51 -0800 Subject: [PATCH 43/56] add queries for resolvers --- test/resolvers/SystemResolverTests.test.ts | 77 +++++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index cc37c6f..673f0a1 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -3,6 +3,13 @@ import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { generateMockRoutes } from "../generators"; + +// const routes = await generateMockRoutes(); +// await Promise.all(routes.map(async (route) => { +// route.systemId = mockSystem.id; +// await repository.addOrUpdateRoute(route); +// })); describe("SystemResolvers", () => { let testServer: ApolloServer; @@ -14,17 +21,50 @@ describe("SystemResolvers", () => { }); describe("routes", () => { + const query = ` + query GetSystemRoutes($systemId: ID!) { + system(id: $systemId) { + routes { + id + name + } + } + } + `; + it("gets routes associated with system id", async () => { }); }); describe("stops", () => { + const query = ` + query GetSystemStops($systemId: ID!) { + system(id: $systemId) { + stops { + id + name + } + } + } + `; + it("gets stops associated with system id", async () => { }); }); describe("stop", () => { + const query = ` + query GetSystemStop($systemId: ID!, $stopId: ID!) { + system(id: $systemId) { + stop(id: $stopId) { + id + name + } + } + } + `; + it("gets the stop with the correct id", async () => { }); @@ -39,11 +79,22 @@ describe("SystemResolvers", () => { }); describe("route", () => { + const query = ` + query GetSystemRoute($systemId: ID!, $routeId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + id + name + } + } + } + `; + it("gets the route with the correct id", async () => { }); - it("returns null if the stop isn't associated with the system", async () => { + it("returns null if the route isn't associated with the system", async () => { }); @@ -53,11 +104,22 @@ describe("SystemResolvers", () => { }); describe("shuttle", () => { + const query = ` + query GetSystemShuttle($systemId: ID!, $shuttleId: ID!) { + system(id: $systemId) { + shuttle(id: $shuttleId) { + id + name + } + } + } + `; + it("gets the shuttle with the correct id", async () => { }); - it("returns null if the stop isn't associated with the system", async () => { + it("returns null if the shuttle isn't associated with the system", async () => { }); @@ -67,6 +129,17 @@ describe("SystemResolvers", () => { }); describe("shuttles", () => { + const query = ` + query GetSystemShuttle($systemId: ID!) { + system(id: $systemId) { + shuttles { + id + name + } + } + } + `; + it("gets shuttles associated with system id", async () => { }); From 88d02887e76ac796aeaaa43f09540cbaf72f6c93 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 21:31:56 -0800 Subject: [PATCH 44/56] add tests to get stops, routes, and shuttles --- test/resolvers/SystemResolverTests.test.ts | 67 +++++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index 673f0a1..8990bf8 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -1,15 +1,12 @@ -import { beforeEach, describe, it } from "@jest/globals"; +import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; -import { generateMockRoutes } from "../generators"; - -// const routes = await generateMockRoutes(); -// await Promise.all(routes.map(async (route) => { -// route.systemId = mockSystem.id; -// await repository.addOrUpdateRoute(route); -// })); +import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; +import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { ISystem } from "../../src/entities/entities"; +import assert = require("node:assert"); describe("SystemResolvers", () => { let testServer: ApolloServer; @@ -20,6 +17,26 @@ describe("SystemResolvers", () => { repository = new UnoptimizedInMemoryRepository(); }); + let mockSystem: ISystem; + + beforeEach(async () => { + mockSystem = await addMockSystemToRepository(repository); + }); + + // TODO: Consolidate these into one single method taking an object + async function getResponseFromQueryNeedingSystemId(query: string) { + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + }, + }, { + contextValue: { + repository + }, + }); + } + describe("routes", () => { const query = ` query GetSystemRoutes($systemId: ID!) { @@ -33,6 +50,18 @@ describe("SystemResolvers", () => { `; it("gets routes associated with system id", async () => { + const expectedRoutes = generateMockRoutes(); + await Promise.all(expectedRoutes.map(async (route) => { + route.systemId = mockSystem.id; + await repository.addOrUpdateRoute(route); + })); + + const response = await getResponseFromQueryNeedingSystemId(query); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined() + const routes = (response.body.singleResult.data as any).system.routes; + expect(routes.length === expectedRoutes.length); }); }); @@ -49,7 +78,18 @@ describe("SystemResolvers", () => { `; it("gets stops associated with system id", async () => { + const expectedStops = generateMockStops(); + await Promise.all(expectedStops.map(async (stop) => { + stop.systemId = mockSystem.id; + await repository.addOrUpdateStop(stop); + })); + const response = await getResponseFromQueryNeedingSystemId(query); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined() + const stops = (response.body.singleResult.data as any).system.stops; + expect(stops.length === expectedStops.length); }); }); @@ -141,7 +181,18 @@ describe("SystemResolvers", () => { `; it("gets shuttles associated with system id", async () => { + const expectedShuttles = generateMockShuttles(); + await Promise.all(expectedShuttles.map(async (shuttle) => { + shuttle.systemId = mockSystem.id; + await repository.addOrUpdateShuttle(shuttle); + })); + const response = await getResponseFromQueryNeedingSystemId(query); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined() + const shuttles = (response.body.singleResult.data as any).system.shuttles; + expect(shuttles.length === expectedShuttles.length); }); }); }); \ No newline at end of file From b6356c64e8cffd042dcdd73f18e1b3c7de59a8db Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 21:52:18 -0800 Subject: [PATCH 45/56] add SystemResolvers.stop tests --- test/resolvers/SystemResolverTests.test.ts | 58 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index 8990bf8..4fac792 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -4,7 +4,7 @@ import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; -import { addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import { ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -94,27 +94,69 @@ describe("SystemResolvers", () => { }); describe("stop", () => { - const query = ` - query GetSystemStop($systemId: ID!, $stopId: ID!) { - system(id: $systemId) { - stop(id: $stopId) { - id - name + async function getResponseForStopQuery(stopId: string) { + const query = ` + query GetSystemStop($systemId: ID!, $stopId: ID!) { + system(id: $systemId) { + stop(id: $stopId) { + id + name + } } } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + stopId: stopId, + }, + }, { + contextValue: { + repository, + } + }); } - `; it("gets the stop with the correct id", async () => { + const mockStop = await addMockStopToRepository(repository, mockSystem.id); + const response = await getResponseForStopQuery(mockStop.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const stop = (response.body.singleResult.data as any).system.stop; + expect(stop.id).toEqual(mockStop.id); + expect(stop.name).toEqual(mockStop.name); }); it("returns null if the stop isn't associated with the system", async () => { + const updatedSystem = { + ...mockSystem, + id: "2", + } + await repository.addOrUpdateSystem(updatedSystem); + const mockStop = await addMockStopToRepository(repository, updatedSystem.id); + + const response = await getResponseForStopQuery(mockStop.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const stop = (response.body.singleResult.data as any).system.stop; + expect(stop).toBeNull(); }); it("returns null if there is no stop", async () => { + const response = await getResponseForStopQuery("1"); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const stop = (response.body.singleResult.data as any).system.stop; + expect(stop).toBeNull(); }); }); From 749afc5147f464427f3057b1d5cae0c6827132b9 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 28 Jan 2025 21:56:59 -0800 Subject: [PATCH 46/56] add tests for route resolver --- test/resolvers/SystemResolverTests.test.ts | 63 +++++++++++++++++++--- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index 4fac792..c098aff 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -4,7 +4,11 @@ import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; -import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import { + addMockRouteToRepository, + addMockStopToRepository, + addMockSystemToRepository +} from "../testHelpers/repositorySetupHelpers"; import { ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); @@ -161,27 +165,70 @@ describe("SystemResolvers", () => { }); describe("route", () => { - const query = ` - query GetSystemRoute($systemId: ID!, $routeId: ID!) { - system(id: $systemId) { - route(id: $routeId) { - id - name + async function getResponseForRouteQuery(routeId: string) { + const query = ` + query GetSystemRoute($systemId: ID!, $routeId: ID!) { + system(id: $systemId) { + route(id: $routeId) { + id + name + } } } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + routeId, + }, + }, { + contextValue: { + repository, + } + }); } - `; it("gets the route with the correct id", async () => { + const mockRoute = await addMockRouteToRepository(repository, mockSystem.id); + const response = await getResponseForRouteQuery(mockRoute.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const route = (response.body.singleResult.data as any).system.route; + expect(route.id).toEqual(mockRoute.id); + expect(route.name).toEqual(mockRoute.name); }); it("returns null if the route isn't associated with the system", async () => { + const updatedSystem = { + ...mockSystem, + id: "2", + } + await repository.addOrUpdateSystem(updatedSystem); + const mockRoute = await addMockRouteToRepository(repository, updatedSystem.id); + + const response = await getResponseForRouteQuery(mockRoute.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const route = (response.body.singleResult.data as any).system.route; + expect(route).toBeNull(); }); it("returns null if there is no route", async () => { + const response = await getResponseForRouteQuery("nonexistent-route-id"); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const route = (response.body.singleResult.data as any).system.route; + expect(route).toBeNull(); }); }); From fd4a92e34b64f2bfa38c59e94717011b2cf22059 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 00:01:36 -0800 Subject: [PATCH 47/56] add shuttle tests --- test/resolvers/SystemResolverTests.test.ts | 58 +++++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index c098aff..12f1543 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -5,7 +5,7 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/Unoptimize import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { - addMockRouteToRepository, + addMockRouteToRepository, addMockShuttleToRepository, addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; @@ -233,27 +233,69 @@ describe("SystemResolvers", () => { }); describe("shuttle", () => { - const query = ` - query GetSystemShuttle($systemId: ID!, $shuttleId: ID!) { - system(id: $systemId) { - shuttle(id: $shuttleId) { - id - name + async function getResponseForShuttleQuery(shuttleId: string) { + const query = ` + query GetSystemShuttle($systemId: ID!, $shuttleId: ID!) { + system(id: $systemId) { + shuttle(id: $shuttleId) { + id + name + } } } + `; + + return await testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + shuttleId: shuttleId, + } + }, { + contextValue: { + repository, + } + }); } - `; it("gets the shuttle with the correct id", async () => { + const mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); + const response = await getResponseForShuttleQuery(mockShuttle.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + const shuttle = (response.body.singleResult.data as any).system.shuttle; + expect(shuttle.id).toEqual(mockShuttle.id); + expect(shuttle.name).toEqual(mockShuttle.name); }); it("returns null if the shuttle isn't associated with the system", async () => { + const updatedSystem = { + ...mockSystem, + id: "2", + } + await repository.addOrUpdateSystem(updatedSystem); + const mockShuttle = await addMockShuttleToRepository(repository, updatedSystem.id); + + const response = await getResponseForShuttleQuery(mockShuttle.id); + + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const shuttle = (response.body.singleResult.data as any).system.shuttle; + expect(shuttle).toBeNull(); }); it("returns null if there is no shuttle", async () => { + const response = await getResponseForShuttleQuery("nonexistent-shuttle-id"); + assert(response.body.kind === "single"); + expect(response.body.singleResult.errors).toBeUndefined(); + + const shuttle = (response.body.singleResult.data as any).system.shuttle; + expect(shuttle).toBeNull(); }); }); From f1579904c787448cc0512525e6f8e51705ff00b4 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 00:03:31 -0800 Subject: [PATCH 48/56] check for system association in system resolvers --- src/resolvers/SystemResolvers.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/resolvers/SystemResolvers.ts b/src/resolvers/SystemResolvers.ts index a270798..dbb98ca 100644 --- a/src/resolvers/SystemResolvers.ts +++ b/src/resolvers/SystemResolvers.ts @@ -14,6 +14,8 @@ export const SystemResolvers: Resolvers = { const stop = await contextValue.repository.getStopById(args.id); if (stop === null) return null; + if (stop.systemId !== parent.id) return null; + return { id: stop.id, name: stop.name, @@ -25,6 +27,8 @@ export const SystemResolvers: Resolvers = { const route = await contextValue.repository.getRouteById(args.id); if (route === null) return null; + if (route.systemId !== parent.id) return null; + return { color: route.color, id: route.id, @@ -37,6 +41,8 @@ export const SystemResolvers: Resolvers = { const shuttle = await contextValue.repository.getShuttleById(args.id); if (shuttle === null) return null; + if (shuttle.systemId !== parent.id) return null; + return shuttle; }, shuttles: async (parent, args, contextValue, info) => { From 23ee9ce06bd913909d3abb8084adb830c81fb173 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 00:08:56 -0800 Subject: [PATCH 49/56] fix failing ordered stop test due to missing system id --- test/resolvers/OrderedStopResolverTests.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 3a96891..2908b81 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -33,6 +33,7 @@ describe("OrderedStopResolvers", () => { mockStops = generateMockStops(); await Promise.all(mockStops.map(async (mockStop) => { + mockStop.systemId = mockSystem.id; await repository.addOrUpdateStop(mockStop); })); }); From fbd0c76b702c36e73810dffe8c8db0837d421c0b Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:07:02 -0800 Subject: [PATCH 50/56] extract test server context code into separate method --- .../OrderedStopResolverTests.test.ts | 48 ++++++++----------- test/testHelpers/apolloSetupHelpers.ts | 17 +++++++ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 2908b81..6640c7a 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -2,7 +2,7 @@ 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 { setupTestServerContext, setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import { generateMockOrderedStops, @@ -15,26 +15,20 @@ import assert = require("node:assert"); import { addMockRouteToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; describe("OrderedStopResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockSystem: ISystem; let mockRoute: IRoute; let mockStops: IStop[]; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); - mockRoute = await addMockRouteToRepository(repository, mockSystem.id); + mockSystem = await addMockSystemToRepository(context.repository); + mockRoute = await addMockRouteToRepository(context.repository, mockSystem.id); mockStops = generateMockStops(); await Promise.all(mockStops.map(async (mockStop) => { mockStop.systemId = mockSystem.id; - await repository.addOrUpdateStop(mockStop); + await context.repository.addOrUpdateStop(mockStop); })); }); @@ -52,8 +46,8 @@ describe("OrderedStopResolvers", () => { // Link the stops together orderedStops[0].nextStop = orderedStops[1]; orderedStops[1].previousStop = orderedStops[0]; - await repository.addOrUpdateOrderedStop(orderedStops[0]); - await repository.addOrUpdateOrderedStop(orderedStops[1]); + await context.repository.addOrUpdateOrderedStop(orderedStops[0]); + await context.repository.addOrUpdateOrderedStop(orderedStops[1]); return orderedStops; } @@ -74,7 +68,7 @@ describe("OrderedStopResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -83,7 +77,7 @@ describe("OrderedStopResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -108,7 +102,7 @@ describe("OrderedStopResolvers", () => { 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]); + await context.repository.addOrUpdateOrderedStop(orderedStops[0]); const response = await getResponseForNextStopQuery(orderedStops[0].stopId); @@ -119,7 +113,7 @@ describe("OrderedStopResolvers", () => { it("returns null if the next stop object no longer exists", async () => { const orderedStops = await setUpOrderedStopsInRepository(); - await repository.removeStopIfExists(orderedStops[1].stopId); + await context.repository.removeStopIfExists(orderedStops[1].stopId); const response = await getResponseForNextStopQuery(orderedStops[0].stopId); @@ -146,7 +140,7 @@ describe("OrderedStopResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -155,7 +149,7 @@ describe("OrderedStopResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -179,7 +173,7 @@ describe("OrderedStopResolvers", () => { it("returns null if there is no previous stop in the repository", async () => { const orderedStops = await setUpOrderedStopsInRepository(); orderedStops[1].previousStop = undefined; - await repository.addOrUpdateOrderedStop(orderedStops[1]); + await context.repository.addOrUpdateOrderedStop(orderedStops[1]); const response = await getResponseForPreviousStopQuery(orderedStops[1].stopId); @@ -190,7 +184,7 @@ describe("OrderedStopResolvers", () => { it("returns null if the current stop no longer exists", async () => { const orderedStops = await setUpOrderedStopsInRepository(); - await repository.removeStopIfExists(orderedStops[0].stopId); + await context.repository.removeStopIfExists(orderedStops[0].stopId); const response = await getResponseForPreviousStopQuery(orderedStops[1].stopId); @@ -221,7 +215,7 @@ describe("OrderedStopResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -229,7 +223,7 @@ describe("OrderedStopResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -240,7 +234,7 @@ describe("OrderedStopResolvers", () => { orderedStops[0].stopId = mockStops[0].id; // Add one stop only - await repository.addOrUpdateOrderedStop(orderedStops[0]); + await context.repository.addOrUpdateOrderedStop(orderedStops[0]); const response = await getResponseForRouteQuery(orderedStops[1].stopId); @@ -271,7 +265,7 @@ describe("OrderedStopResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -280,7 +274,7 @@ describe("OrderedStopResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -288,7 +282,7 @@ describe("OrderedStopResolvers", () => { it("returns the associated stop if it exists", async () => { const orderedStops = await setUpOrderedStopsInRepository(); orderedStops[0].stopId = mockStops[0].id; - await repository.addOrUpdateOrderedStop(orderedStops[0]); + await context.repository.addOrUpdateOrderedStop(orderedStops[0]); const response = await getResponseForStopQuery(orderedStops[0].stopId); diff --git a/test/testHelpers/apolloSetupHelpers.ts b/test/testHelpers/apolloSetupHelpers.ts index 5a4bf8e..f600440 100644 --- a/test/testHelpers/apolloSetupHelpers.ts +++ b/test/testHelpers/apolloSetupHelpers.ts @@ -1,6 +1,10 @@ import { readFileSync } from "fs"; import { ApolloServer } from "@apollo/server"; import { MergedResolvers } from "../../src/MergedResolvers"; +import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { beforeEach } from "@jest/globals"; +import { ServerContext } from "../../src/ServerContext"; + export function setUpTestServer() { // Leaving this separate from the main server in case @@ -11,3 +15,16 @@ export function setUpTestServer() { resolvers: MergedResolvers, }); } + +export function setupTestServerContext() { + // @ts-ignore + const context: { testServer: ApolloServer; repository: UnoptimizedInMemoryRepository } = {}; + + beforeEach(() => { + context.testServer = setUpTestServer(); + context.repository = new UnoptimizedInMemoryRepository(); + }); + + // Return a reference, not destructured values + return context; +} \ No newline at end of file From d69197acd89255d13d51cacdc372411f5d7202d3 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:08:18 -0800 Subject: [PATCH 51/56] update eta resolver tests to use new method --- test/resolvers/EtaResolverTests.test.ts | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index d7c4107..5c1821d 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setUpTestServer, setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { ServerContext } from "../../src/ServerContext"; import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; import { @@ -13,13 +13,7 @@ import { generateMockEtas, generateMockShuttles, generateMockStops } from "../ge import assert = require("node:assert"); describe("EtaResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockSystem: ISystem; let mockShuttle: IShuttle; @@ -27,14 +21,14 @@ describe("EtaResolvers", () => { let expectedEta: IEta; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); - mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); - mockStop = await addMockStopToRepository(repository, mockSystem.id); - expectedEta = await addMockEtaToRepository(repository, mockStop.id, mockShuttle.id); + mockSystem = await addMockSystemToRepository(context.repository); + mockShuttle = await addMockShuttleToRepository(context.repository, mockSystem.id); + mockStop = await addMockStopToRepository(context.repository, mockSystem.id); + expectedEta = await addMockEtaToRepository(context.repository, mockStop.id, mockShuttle.id); }); async function getResponseForEtaQuery(query: string) { - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -42,7 +36,7 @@ describe("EtaResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); return response; From 7586ebba044fd7778003be24884713481670226c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:09:31 -0800 Subject: [PATCH 52/56] optimize imports for resolver tests --- test/resolvers/EtaResolverTests.test.ts | 6 +----- test/resolvers/OrderedStopResolverTests.test.ts | 15 +++------------ test/resolvers/QueryResolverTests.test.ts | 2 +- test/resolvers/RouteResolverTests.test.ts | 2 +- test/resolvers/ShuttleResolverTests.test.ts | 4 ++-- test/resolvers/StopResolverTests.test.ts | 4 ++-- test/resolvers/SystemResolverTests.test.ts | 3 ++- 7 files changed, 12 insertions(+), 24 deletions(-) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 5c1821d..28c9cdd 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -1,15 +1,11 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ApolloServer } from "@apollo/server"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { setUpTestServer, setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; -import { ServerContext } from "../../src/ServerContext"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; import { addMockEtaToRepository, addMockShuttleToRepository, addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -import { generateMockEtas, generateMockShuttles, generateMockStops } from "../generators"; import assert = require("node:assert"); describe("EtaResolvers", () => { diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 6640c7a..70e6ec6 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,18 +1,9 @@ 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 { setupTestServerContext, setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; -import { - generateMockOrderedStops, - generateMockRoutes, - generateMockShuttles, - generateMockStops, - generateMockSystems -} from "../generators"; -import assert = require("node:assert"); +import { generateMockOrderedStops, generateMockStops } from "../generators"; import { addMockRouteToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import assert = require("node:assert"); describe("OrderedStopResolvers", () => { const context = setupTestServerContext(); diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index f0e4777..b74cf67 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -3,8 +3,8 @@ import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { generateMockSystems } from "../generators"; -import assert = require("node:assert"); import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import assert = require("node:assert"); // See Apollo documentation for integration test guide // https://www.apollographql.com/docs/apollo-server/testing/testing diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index fa5e24a..4dc01d1 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -8,7 +8,7 @@ import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -import { generateMockOrderedStops, generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; +import { generateMockOrderedStops, generateMockShuttles } from "../generators"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index f2be62d..37166c0 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -2,11 +2,11 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { generateMockEtas, generateMockRoutes, generateMockShuttles, generateMockSystems } from "../generators"; +import { generateMockEtas, generateMockRoutes } from "../generators"; import { IShuttle, ISystem } from "../../src/entities/entities"; -import assert = require("node:assert"); import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { addMockShuttleToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import assert = require("node:assert"); describe("ShuttleResolvers", () => { diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index ef3ea93..ae23676 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -3,10 +3,10 @@ import { ApolloServer } from "@apollo/server"; import { ServerContext } from "../../src/ServerContext"; import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; -import { generateMockEtas, generateMockOrderedStops, generateMockStops, generateMockSystems } from "../generators"; +import { generateMockEtas, generateMockOrderedStops } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; -import assert = require("node:assert"); import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; +import assert = require("node:assert"); describe("StopResolvers", () => { let testServer: ApolloServer; diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index 12f1543..f06501a 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -5,7 +5,8 @@ import { UnoptimizedInMemoryRepository } from "../../src/repositories/Unoptimize import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { - addMockRouteToRepository, addMockShuttleToRepository, + addMockRouteToRepository, + addMockShuttleToRepository, addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; From 0344e7b99b7d8a29bb5d30eb2be9b99a0f69fc63 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:26:23 -0800 Subject: [PATCH 53/56] use server context method for other resolver tests --- test/resolvers/QueryResolverTests.test.ts | 33 +++++------- test/resolvers/RouteResolverTests.test.ts | 49 ++++++++---------- test/resolvers/ShuttleResolverTests.test.ts | 56 ++++++++++----------- test/resolvers/StopResolverTests.test.ts | 25 +++------ test/resolvers/SystemResolverTests.test.ts | 55 +++++++++----------- 5 files changed, 91 insertions(+), 127 deletions(-) diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index b74cf67..da86e77 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,28 +1,18 @@ -import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ApolloServer } from "@apollo/server"; -import { ServerContext } from "../../src/ServerContext"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; +import { describe, expect, it } from "@jest/globals"; import { generateMockSystems } from "../generators"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import assert = require("node:assert"); // See Apollo documentation for integration test guide // https://www.apollographql.com/docs/apollo-server/testing/testing describe("QueryResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); async function addMockSystems() { const systems = generateMockSystems(); await Promise.all(systems.map(async (system) => { - await repository.addOrUpdateSystem(system); + await context.repository.addOrUpdateSystem(system); })); return systems; } @@ -40,16 +30,17 @@ describe("QueryResolvers", () => { } `; - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, }, { contextValue: { - repository, + repository: context.repository, }, }); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); + expect(response.body.singleResult.data?.systems).toHaveLength(systems.length); }); }); @@ -68,14 +59,14 @@ describe("QueryResolvers", () => { const systems = await addMockSystems(); const systemToGet = systems[1]; - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { id: systemToGet.id, } }, { contextValue: { - repository, + repository: context.repository, } }); @@ -85,14 +76,14 @@ describe("QueryResolvers", () => { }); it("returns null if there is no system", async () => { - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { id: "nonexistent-id", } }, { contextValue: { - repository, + repository: context.repository, } }); @@ -101,4 +92,4 @@ describe("QueryResolvers", () => { expect(response.body.singleResult.data?.system).toBeNull(); }); }); -}); +}); \ No newline at end of file diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 4dc01d1..074129a 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -1,8 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ServerContext } from "../../src/ServerContext"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; -import { ApolloServer } from "@apollo/server"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { addMockRouteToRepository, addMockStopToRepository, @@ -13,24 +10,18 @@ import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); describe("RouteResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockSystem: ISystem; let mockRoute: IRoute; let mockStop: IStop; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); + mockSystem = await addMockSystemToRepository(context.repository); const systemId = mockSystem.id; - mockRoute = await addMockRouteToRepository(repository, systemId); - mockStop = await addMockStopToRepository(repository, systemId); + mockRoute = await addMockRouteToRepository(context.repository, systemId); + mockStop = await addMockStopToRepository(context.repository, systemId); }); @@ -49,7 +40,7 @@ describe("RouteResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -57,7 +48,7 @@ describe("RouteResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -67,13 +58,14 @@ describe("RouteResolvers", () => { const expectedShuttle = expectedShuttles[0]; expectedShuttle.systemId = mockSystem.id; expectedShuttle.routeId = mockRoute.id; - await repository.addOrUpdateShuttle(expectedShuttle); + await context.repository.addOrUpdateShuttle(expectedShuttle); const response = await getResponseForShuttlesQuery(); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined() - const shuttle = (response.body.singleResult.data as any).system.route.shuttles[0]; + const shuttle = (response.body.singleResult.data as + any).system.route.shuttles[0]; expect(shuttle.id).toEqual(expectedShuttle.id); expect(shuttle.name).toEqual(expectedShuttle.name); }); @@ -83,7 +75,8 @@ describe("RouteResolvers", () => { assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined() - const shuttles = (response.body.singleResult.data as any).system.route.shuttles; + const shuttles = (response.body.singleResult.data as + any).system.route.shuttles; expect(shuttles.length).toEqual(0); }); }); @@ -102,7 +95,7 @@ describe("RouteResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -111,7 +104,7 @@ describe("RouteResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -121,14 +114,15 @@ describe("RouteResolvers", () => { const expectedOrderedStop = orderedStops[0]; expectedOrderedStop.stopId = mockStop.id; expectedOrderedStop.routeId = mockRoute.id; - await repository.addOrUpdateOrderedStop(expectedOrderedStop); + await context.repository.addOrUpdateOrderedStop(expectedOrderedStop); const response = await getResponseForOrderedStopQuery(); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - const orderedStop = (response.body.singleResult.data as any).system.route.orderedStop; + const orderedStop = (response.body.singleResult.data as + any).system.route.orderedStop; expect(orderedStop.stopId).toEqual(expectedOrderedStop.stopId); }); @@ -137,17 +131,18 @@ describe("RouteResolvers", () => { const expectedOrderedStop = orderedStops[0]; expectedOrderedStop.stopId = mockStop.id; expectedOrderedStop.routeId = mockRoute.id; - await repository.addOrUpdateOrderedStop(expectedOrderedStop); + await context.repository.addOrUpdateOrderedStop(expectedOrderedStop); - await repository.removeStopIfExists(mockStop.id); + await context.repository.removeStopIfExists(mockStop.id); const response = await getResponseForOrderedStopQuery(); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - const orderedStop = (response.body.singleResult.data as any).system.route.orderedStop; + const orderedStop = (response.body.singleResult.data as + any).system.route.orderedStop; expect(orderedStop).toBeNull(); }); }); -}); +}); \ No newline at end of file diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index 37166c0..f00a9bf 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -1,29 +1,21 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ApolloServer } from "@apollo/server"; -import { ServerContext } from "../../src/ServerContext"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; import { generateMockEtas, generateMockRoutes } from "../generators"; import { IShuttle, ISystem } from "../../src/entities/entities"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { addMockShuttleToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); describe("ShuttleResolvers", () => { - let testServer: ApolloServer - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockSystem: ISystem; let mockShuttle: IShuttle; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); - mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); + mockSystem = await addMockSystemToRepository(context.repository); + mockShuttle = await addMockShuttleToRepository(context.repository, + mockSystem.id); }); @@ -31,7 +23,7 @@ describe("ShuttleResolvers", () => { const etas = generateMockEtas(); await Promise.all(etas.map(async (eta) => { eta.shuttleId = shuttleId; - await repository.addOrUpdateEta(eta); + await context.repository.addOrUpdateEta(eta); })); return etas; } @@ -55,7 +47,7 @@ describe("ShuttleResolvers", () => { const mockEta = etas[1]; // Act - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -64,18 +56,19 @@ describe("ShuttleResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, }, }); // Assert assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - expect((response.body.singleResult.data as any).system.shuttle.eta.secondsRemaining).toEqual(mockEta.secondsRemaining); + expect((response.body.singleResult.data as + any).system.shuttle.eta.secondsRemaining).toEqual(mockEta.secondsRemaining); }); it("returns null if it doesn't exist", async () => { - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -84,14 +77,15 @@ describe("ShuttleResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); // Assert assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - expect((response.body.singleResult.data as any).system.shuttle.eta).toBeNull(); + expect((response.body.singleResult.data as + any).system.shuttle.eta).toBeNull(); }); }); @@ -112,7 +106,7 @@ describe("ShuttleResolvers", () => { it("returns associated ETAs if they exist for the shuttle", async () => { const etas = await addMockEtas(mockShuttle.id); - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -120,17 +114,18 @@ describe("ShuttleResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - expect((response.body.singleResult.data as any).system.shuttle.etas).toHaveLength(etas.length); + expect((response.body.singleResult.data as + any).system.shuttle.etas).toHaveLength(etas.length); }); it("returns empty array if no ETAs exist", async () => { - const response = await testServer.executeOperation({ + const response = await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -138,17 +133,17 @@ describe("ShuttleResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); assert(response.body.kind === "single"); expect(response.body.singleResult.errors).toBeUndefined(); - expect((response.body.singleResult.data as any).system.shuttle.etas).toHaveLength(0); + expect((response.body.singleResult.data as + any).system.shuttle.etas).toHaveLength(0); }); }); - describe("route", () => { const query = ` query GetShuttleRoute($systemId: ID!, $shuttleId: ID!) { @@ -169,7 +164,7 @@ describe("ShuttleResolvers", () => { ` async function getResponseForQuery() { - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -177,14 +172,14 @@ describe("ShuttleResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); } it("returns the route if it exists", async () => { const mockRoute = generateMockRoutes()[0]; - await repository.addOrUpdateRoute(mockRoute); + await context.repository.addOrUpdateRoute(mockRoute); const response = await getResponseForQuery(); @@ -200,5 +195,6 @@ describe("ShuttleResolvers", () => { expect(response.body.singleResult.errors).toBeUndefined(); expect((response.body.singleResult.data as any).system.shuttle.route).toBeNull(); }); + }); }); \ No newline at end of file diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index ae23676..79c0ffa 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -1,32 +1,23 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ApolloServer } from "@apollo/server"; -import { ServerContext } from "../../src/ServerContext"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { generateMockEtas, generateMockOrderedStops } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); describe("StopResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(() => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockStop: IStop; let mockSystem: ISystem; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); - mockStop = await addMockStopToRepository(repository, mockSystem.id); + mockSystem = await addMockSystemToRepository(context.repository); + mockStop = await addMockStopToRepository(context.repository, mockSystem.id); }) async function getResponseForQuery(query: string) { - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -34,7 +25,7 @@ describe("StopResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } @@ -59,7 +50,7 @@ describe("StopResolvers", () => { mockOrderedStops = mockOrderedStops.filter((orderedStop) => orderedStop.stopId === mockOrderedStops[0].stopId); await Promise.all(mockOrderedStops.map(async orderedStop => { orderedStop.stopId = mockStop.id; - await repository.addOrUpdateOrderedStop(orderedStop); + await context.repository.addOrUpdateOrderedStop(orderedStop); })); const response = await getResponseForQuery(query); @@ -96,7 +87,7 @@ describe("StopResolvers", () => { mockEtas = mockEtas.filter((eta) => eta.stopId === mockEtas[0].stopId); await Promise.all(mockEtas.map(async eta => { eta.stopId = mockStop.id; - await repository.addOrUpdateEta(eta); + await context.repository.addOrUpdateEta(eta); })); const response = await getResponseForQuery(query); diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index f06501a..c0473d6 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -1,8 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { ApolloServer } from "@apollo/server"; -import { ServerContext } from "../../src/ServerContext"; -import { UnoptimizedInMemoryRepository } from "../../src/repositories/UnoptimizedInMemoryRepository"; -import { setUpTestServer } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { addMockRouteToRepository, @@ -14,30 +11,24 @@ import { ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); describe("SystemResolvers", () => { - let testServer: ApolloServer; - let repository: UnoptimizedInMemoryRepository; - - beforeEach(async () => { - testServer = setUpTestServer(); - repository = new UnoptimizedInMemoryRepository(); - }); + const context = setupTestServerContext(); let mockSystem: ISystem; beforeEach(async () => { - mockSystem = await addMockSystemToRepository(repository); + mockSystem = await addMockSystemToRepository(context.repository); }); // TODO: Consolidate these into one single method taking an object async function getResponseFromQueryNeedingSystemId(query: string) { - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, }, }, { contextValue: { - repository + repository: context.repository }, }); } @@ -58,7 +49,7 @@ describe("SystemResolvers", () => { const expectedRoutes = generateMockRoutes(); await Promise.all(expectedRoutes.map(async (route) => { route.systemId = mockSystem.id; - await repository.addOrUpdateRoute(route); + await context.repository.addOrUpdateRoute(route); })); const response = await getResponseFromQueryNeedingSystemId(query); @@ -86,7 +77,7 @@ describe("SystemResolvers", () => { const expectedStops = generateMockStops(); await Promise.all(expectedStops.map(async (stop) => { stop.systemId = mockSystem.id; - await repository.addOrUpdateStop(stop); + await context.repository.addOrUpdateStop(stop); })); const response = await getResponseFromQueryNeedingSystemId(query); @@ -111,7 +102,7 @@ describe("SystemResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -119,13 +110,13 @@ describe("SystemResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } it("gets the stop with the correct id", async () => { - const mockStop = await addMockStopToRepository(repository, mockSystem.id); + const mockStop = await addMockStopToRepository(context.repository, mockSystem.id); const response = await getResponseForStopQuery(mockStop.id); @@ -141,9 +132,9 @@ describe("SystemResolvers", () => { ...mockSystem, id: "2", } - await repository.addOrUpdateSystem(updatedSystem); + await context.repository.addOrUpdateSystem(updatedSystem); - const mockStop = await addMockStopToRepository(repository, updatedSystem.id); + const mockStop = await addMockStopToRepository(context.repository, updatedSystem.id); const response = await getResponseForStopQuery(mockStop.id); @@ -178,7 +169,7 @@ describe("SystemResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -186,13 +177,13 @@ describe("SystemResolvers", () => { }, }, { contextValue: { - repository, + repository: context.repository, } }); } it("gets the route with the correct id", async () => { - const mockRoute = await addMockRouteToRepository(repository, mockSystem.id); + const mockRoute = await addMockRouteToRepository(context.repository, mockSystem.id); const response = await getResponseForRouteQuery(mockRoute.id); @@ -209,9 +200,9 @@ describe("SystemResolvers", () => { ...mockSystem, id: "2", } - await repository.addOrUpdateSystem(updatedSystem); + await context.repository.addOrUpdateSystem(updatedSystem); - const mockRoute = await addMockRouteToRepository(repository, updatedSystem.id); + const mockRoute = await addMockRouteToRepository(context.repository, updatedSystem.id); const response = await getResponseForRouteQuery(mockRoute.id); @@ -246,7 +237,7 @@ describe("SystemResolvers", () => { } `; - return await testServer.executeOperation({ + return await context.testServer.executeOperation({ query, variables: { systemId: mockSystem.id, @@ -254,13 +245,13 @@ describe("SystemResolvers", () => { } }, { contextValue: { - repository, + repository: context.repository, } }); } it("gets the shuttle with the correct id", async () => { - const mockShuttle = await addMockShuttleToRepository(repository, mockSystem.id); + const mockShuttle = await addMockShuttleToRepository(context.repository, mockSystem.id); const response = await getResponseForShuttleQuery(mockShuttle.id); @@ -276,9 +267,9 @@ describe("SystemResolvers", () => { ...mockSystem, id: "2", } - await repository.addOrUpdateSystem(updatedSystem); + await context.repository.addOrUpdateSystem(updatedSystem); - const mockShuttle = await addMockShuttleToRepository(repository, updatedSystem.id); + const mockShuttle = await addMockShuttleToRepository(context.repository, updatedSystem.id); const response = await getResponseForShuttleQuery(mockShuttle.id); @@ -316,7 +307,7 @@ describe("SystemResolvers", () => { const expectedShuttles = generateMockShuttles(); await Promise.all(expectedShuttles.map(async (shuttle) => { shuttle.systemId = mockSystem.id; - await repository.addOrUpdateShuttle(shuttle); + await context.repository.addOrUpdateShuttle(shuttle); })); const response = await getResponseFromQueryNeedingSystemId(query); From 894fbc5a8dbc0cbd5af9de5ee4df0336b1bafc6e Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:27:59 -0800 Subject: [PATCH 54/56] rename apollo helper to apolloTestServerHelpers --- test/resolvers/EtaResolverTests.test.ts | 2 +- test/resolvers/OrderedStopResolverTests.test.ts | 2 +- test/resolvers/QueryResolverTests.test.ts | 2 +- test/resolvers/RouteResolverTests.test.ts | 2 +- test/resolvers/ShuttleResolverTests.test.ts | 2 +- test/resolvers/StopResolverTests.test.ts | 2 +- test/resolvers/SystemResolverTests.test.ts | 2 +- .../{apolloSetupHelpers.ts => apolloTestServerHelpers.ts} | 0 8 files changed, 7 insertions(+), 7 deletions(-) rename test/testHelpers/{apolloSetupHelpers.ts => apolloTestServerHelpers.ts} (100%) diff --git a/test/resolvers/EtaResolverTests.test.ts b/test/resolvers/EtaResolverTests.test.ts index 28c9cdd..73c9770 100644 --- a/test/resolvers/EtaResolverTests.test.ts +++ b/test/resolvers/EtaResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { IEta, IShuttle, IStop, ISystem } from "../../src/entities/entities"; import { addMockEtaToRepository, addMockShuttleToRepository, diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index 70e6ec6..b3bad4b 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import { generateMockOrderedStops, generateMockStops } from "../generators"; import { addMockRouteToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index da86e77..2db16be 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "@jest/globals"; import { generateMockSystems } from "../generators"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import assert = require("node:assert"); // See Apollo documentation for integration test guide diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index 074129a..c4344ad 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { addMockRouteToRepository, addMockStopToRepository, diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index f00a9bf..ecc6b71 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { generateMockEtas, generateMockRoutes } from "../generators"; import { IShuttle, ISystem } from "../../src/entities/entities"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { addMockShuttleToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index 79c0ffa..15a5a3d 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { generateMockEtas, generateMockOrderedStops } from "../generators"; import { IStop, ISystem } from "../../src/entities/entities"; import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index c0473d6..c5a1fad 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { setupTestServerContext } from "../testHelpers/apolloSetupHelpers"; +import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; import { addMockRouteToRepository, diff --git a/test/testHelpers/apolloSetupHelpers.ts b/test/testHelpers/apolloTestServerHelpers.ts similarity index 100% rename from test/testHelpers/apolloSetupHelpers.ts rename to test/testHelpers/apolloTestServerHelpers.ts From d41a9ccc22615267778c9416632335c7ecd8932e Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:28:32 -0800 Subject: [PATCH 55/56] remove setUpTestServer function export --- test/testHelpers/apolloTestServerHelpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testHelpers/apolloTestServerHelpers.ts b/test/testHelpers/apolloTestServerHelpers.ts index f600440..78b322f 100644 --- a/test/testHelpers/apolloTestServerHelpers.ts +++ b/test/testHelpers/apolloTestServerHelpers.ts @@ -6,7 +6,7 @@ import { beforeEach } from "@jest/globals"; import { ServerContext } from "../../src/ServerContext"; -export function setUpTestServer() { +function setUpTestServer() { // Leaving this separate from the main server in case // configuration changes const typeDefs = readFileSync("./schema.graphqls", "utf8"); From e1fd1714b9b05c05803de2ae0a6ea1e67633ab4b Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 15:35:15 -0800 Subject: [PATCH 56/56] move mock data generators into test helpers folder --- test/loaders/ApiBasedRepositoryLoaderTests.test.ts | 10 +--------- .../UnoptimizedInMemoryRepositoryTests.test.ts | 2 +- test/resolvers/OrderedStopResolverTests.test.ts | 2 +- test/resolvers/QueryResolverTests.test.ts | 2 +- test/resolvers/RouteResolverTests.test.ts | 2 +- test/resolvers/ShuttleResolverTests.test.ts | 2 +- test/resolvers/StopResolverTests.test.ts | 2 +- test/resolvers/SystemResolverTests.test.ts | 2 +- .../mockDataGenerators.ts} | 2 +- test/testHelpers/repositorySetupHelpers.ts | 2 +- 10 files changed, 10 insertions(+), 18 deletions(-) rename test/{generators.ts => testHelpers/mockDataGenerators.ts} (98%) diff --git a/test/loaders/ApiBasedRepositoryLoaderTests.test.ts b/test/loaders/ApiBasedRepositoryLoaderTests.test.ts index 691667e..87cb896 100644 --- a/test/loaders/ApiBasedRepositoryLoaderTests.test.ts +++ b/test/loaders/ApiBasedRepositoryLoaderTests.test.ts @@ -7,15 +7,7 @@ import { fetchRouteDataSuccessfulResponse } from "../jsonSnapshots/fetchRouteDat import { fetchStopAndPolylineDataSuccessfulResponse } from "../jsonSnapshots/fetchStopAndPolylineData/fetchStopAndPolylineDataSuccessfulResponse"; -import { - generateMockEtas, - generateMockOrderedStops, - generateMockRoutes, - generateMockShuttles, - generateMockStops, - generateMockSystems -} from "../generators"; -import { IStop } from "../../src/entities/entities"; +import { generateMockRoutes, generateMockShuttles, generateMockStops, generateMockSystems } from "../testHelpers/mockDataGenerators"; import { fetchShuttleDataSuccessfulResponse } from "../jsonSnapshots/fetchShuttleData/fetchShuttleDataSuccessfulResponse"; diff --git a/test/repositories/UnoptimizedInMemoryRepositoryTests.test.ts b/test/repositories/UnoptimizedInMemoryRepositoryTests.test.ts index 906894b..f130ba5 100644 --- a/test/repositories/UnoptimizedInMemoryRepositoryTests.test.ts +++ b/test/repositories/UnoptimizedInMemoryRepositoryTests.test.ts @@ -7,7 +7,7 @@ import { generateMockShuttles, generateMockStops, generateMockSystems -} from "../generators"; +} from "../testHelpers/mockDataGenerators"; // For repositories created in the future, reuse core testing // logic from here and differentiate setup (e.g. creating mocks) diff --git a/test/resolvers/OrderedStopResolverTests.test.ts b/test/resolvers/OrderedStopResolverTests.test.ts index b3bad4b..11c46e4 100644 --- a/test/resolvers/OrderedStopResolverTests.test.ts +++ b/test/resolvers/OrderedStopResolverTests.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; -import { generateMockOrderedStops, generateMockStops } from "../generators"; +import { generateMockOrderedStops, generateMockStops } from "../testHelpers/mockDataGenerators"; import { addMockRouteToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/QueryResolverTests.test.ts b/test/resolvers/QueryResolverTests.test.ts index 2db16be..73f8e83 100644 --- a/test/resolvers/QueryResolverTests.test.ts +++ b/test/resolvers/QueryResolverTests.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "@jest/globals"; -import { generateMockSystems } from "../generators"; +import { generateMockSystems } from "../testHelpers/mockDataGenerators"; import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/RouteResolverTests.test.ts b/test/resolvers/RouteResolverTests.test.ts index c4344ad..ba5b403 100644 --- a/test/resolvers/RouteResolverTests.test.ts +++ b/test/resolvers/RouteResolverTests.test.ts @@ -5,7 +5,7 @@ import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; -import { generateMockOrderedStops, generateMockShuttles } from "../generators"; +import { generateMockOrderedStops, generateMockShuttles } from "../testHelpers/mockDataGenerators"; import { IRoute, IStop, ISystem } from "../../src/entities/entities"; import assert = require("node:assert"); diff --git a/test/resolvers/ShuttleResolverTests.test.ts b/test/resolvers/ShuttleResolverTests.test.ts index ecc6b71..0811c3b 100644 --- a/test/resolvers/ShuttleResolverTests.test.ts +++ b/test/resolvers/ShuttleResolverTests.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; -import { generateMockEtas, generateMockRoutes } from "../generators"; +import { generateMockEtas, generateMockRoutes } from "../testHelpers/mockDataGenerators"; import { IShuttle, ISystem } from "../../src/entities/entities"; import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; import { addMockShuttleToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; diff --git a/test/resolvers/StopResolverTests.test.ts b/test/resolvers/StopResolverTests.test.ts index 15a5a3d..2a044b1 100644 --- a/test/resolvers/StopResolverTests.test.ts +++ b/test/resolvers/StopResolverTests.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; -import { generateMockEtas, generateMockOrderedStops } from "../generators"; +import { generateMockEtas, generateMockOrderedStops } from "../testHelpers/mockDataGenerators"; import { IStop, ISystem } from "../../src/entities/entities"; import { addMockStopToRepository, addMockSystemToRepository } from "../testHelpers/repositorySetupHelpers"; import assert = require("node:assert"); diff --git a/test/resolvers/SystemResolverTests.test.ts b/test/resolvers/SystemResolverTests.test.ts index c5a1fad..7020075 100644 --- a/test/resolvers/SystemResolverTests.test.ts +++ b/test/resolvers/SystemResolverTests.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "@jest/globals"; import { setupTestServerContext } from "../testHelpers/apolloTestServerHelpers"; -import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../generators"; +import { generateMockRoutes, generateMockShuttles, generateMockStops } from "../testHelpers/mockDataGenerators"; import { addMockRouteToRepository, addMockShuttleToRepository, diff --git a/test/generators.ts b/test/testHelpers/mockDataGenerators.ts similarity index 98% rename from test/generators.ts rename to test/testHelpers/mockDataGenerators.ts index eac524a..e284c93 100644 --- a/test/generators.ts +++ b/test/testHelpers/mockDataGenerators.ts @@ -1,4 +1,4 @@ -import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../src/entities/entities"; +import { IEta, IOrderedStop, IRoute, IShuttle, IStop, ISystem } from "../../src/entities/entities"; // Use a single set of generators in case any of the // interfaces change in the future diff --git a/test/testHelpers/repositorySetupHelpers.ts b/test/testHelpers/repositorySetupHelpers.ts index 60350c5..d9e48e3 100644 --- a/test/testHelpers/repositorySetupHelpers.ts +++ b/test/testHelpers/repositorySetupHelpers.ts @@ -5,7 +5,7 @@ import { generateMockShuttles, generateMockStops, generateMockSystems -} from "../generators"; +} from "./mockDataGenerators"; export async function addMockSystemToRepository(repository: UnoptimizedInMemoryRepository) { const mockSystems = generateMockSystems();