diff --git a/test/resolvers/ParkingStructureResolverTests.test.ts b/test/resolvers/ParkingStructureResolverTests.test.ts new file mode 100644 index 0000000..8294359 --- /dev/null +++ b/test/resolvers/ParkingStructureResolverTests.test.ts @@ -0,0 +1,86 @@ +import { beforeEach, describe, expect, it, jest } from "@jest/globals"; +import { setupTestServerContext, setupTestServerHolder } from "../testHelpers/apolloTestServerHelpers"; +import { InterchangeSystem } from "../../src/entities/InterchangeSystem"; +import { generateParkingStructures } from "../testHelpers/mockDataGenerators"; +import { HistoricalParkingAverageQueryInput } from "../../src/generated/graphql"; +import assert = require("node:assert"); + +describe("ParkingStructureResolver", () => { + const holder = setupTestServerHolder(); + const context = setupTestServerContext(); + + let mockSystem: InterchangeSystem; + + beforeEach(async () => { + mockSystem = context.systems[0]; + jest.useRealTimers(); + }); + + describe("historicalAverages", () => { + const query = ` + query GetParkingStructureHistoricalAverages( + $systemId: ID!, + $parkingStructureId: ID!, + $historicalAverageInput: HistoricalParkingAverageQueryInput! + ) { + system(id: $systemId) { + parkingSystem { + parkingStructure(id: $parkingStructureId) { + historicalAverages(input: $historicalAverageInput) { + from + to + averageSpotsAvailable + } + } + } + } + } + `; + + it("gets correct data for historical averages", async () => { + jest.useFakeTimers(); + jest.setSystemTime(new Date()); + + const parkingStructureCounts: number[] = []; + const parkingStructure = generateParkingStructures()[0]; + parkingStructure.spotsAvailable = parkingStructure.capacity; + mockSystem.parkingRepository?.setLoggingInterval(100); + + // Simulate repeated updates + for (let i = 0; i < 6; i += 1) { + jest.setSystemTime(new Date(Date.now() + 1000)); + parkingStructure.spotsAvailable = parkingStructure.spotsAvailable - 100; + parkingStructureCounts.push(parkingStructure.spotsAvailable); + await mockSystem.parkingRepository?.addOrUpdateParkingStructure(parkingStructure); + } + + const historicalAverageInput: HistoricalParkingAverageQueryInput = { + from: new Date(Date.now() - 6000).getTime(), + intervalMs: 2000, + to: new Date().getTime(), + }; + const response = await holder.testServer.executeOperation({ + query, + variables: { + systemId: mockSystem.id, + parkingStructureId: parkingStructure.id, + historicalAverageInput, + }, + }, { + contextValue: context, + }); + + assert(response.body.kind === 'single'); + expect(response.body.singleResult.errors).toBeUndefined(); + const historicalAverages = (response.body.singleResult.data as any).system.parkingSystem.parkingStructure.historicalAverages; + expect(historicalAverages).toHaveLength(3); + expect(historicalAverages[0].averageSpotsAvailable).toBeCloseTo((parkingStructureCounts[0] + parkingStructureCounts[1]) / 2); + expect(historicalAverages[1].averageSpotsAvailable).toBeCloseTo((parkingStructureCounts[2] + parkingStructureCounts[3]) / 2); + expect(historicalAverages[2].averageSpotsAvailable).toBeCloseTo((parkingStructureCounts[4] + parkingStructureCounts[5]) / 2); + }); + + it("returns empty array if no historical averages", async () => { + + }); + }); +});