From 6444251649b17db1f195591dcb6a9d7339c8a8e8 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Mon, 21 Jul 2025 19:42:28 -0400 Subject: [PATCH] Implement mocking of environment file --- .../parking/RedisParkingRepository.ts | 2 +- src/resolvers/ParkingStructureResolvers.ts | 47 +++++++++++++------ .../ParkingStructureResolverTests.test.ts | 2 + 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/repositories/parking/RedisParkingRepository.ts b/src/repositories/parking/RedisParkingRepository.ts index 97576f8..5704226 100644 --- a/src/repositories/parking/RedisParkingRepository.ts +++ b/src/repositories/parking/RedisParkingRepository.ts @@ -2,7 +2,7 @@ import { ParkingGetterSetterRepository } from "./ParkingGetterSetterRepository"; import { IParkingStructure } from "../../entities/ParkingRepositoryEntities"; import { HistoricalParkingAverageQueryResult, HistoricalParkingAverageQueryArguments } from "./ParkingGetterRepository"; import { BaseRedisRepository } from "../BaseRedisRepository"; -import { PARKING_LOGGING_INTERVAL_MS } from "./ParkingRepositoryConstants"; +import { PARKING_LOGGING_INTERVAL_MS } from "../../environment"; export type ParkingStructureID = string; diff --git a/src/resolvers/ParkingStructureResolvers.ts b/src/resolvers/ParkingStructureResolvers.ts index dc995c6..a108daf 100644 --- a/src/resolvers/ParkingStructureResolvers.ts +++ b/src/resolvers/ParkingStructureResolvers.ts @@ -2,34 +2,53 @@ import { Resolvers } from "../generated/graphql"; import { ServerContext } from "../ServerContext"; import { HistoricalParkingAverageQueryArguments } from "../repositories/parking/ParkingGetterRepository"; import { GraphQLError } from "graphql/error"; +import { + PARKING_HISTORICAL_AVERAGE_MAXIMUM_TIMESPAN, + PARKING_HISTORICAL_AVERAGE_MINIMUM_INTERVAL +} from "../environment"; export const ParkingStructureResolvers: Resolvers = { ParkingStructure: { historicalAverages: async (parent, args, contextValue, _info) => { + /** + * @param errorMessage + */ + function throwBadUserInputError(errorMessage: string) { + throw new GraphQLError(errorMessage, { + extensions: { + code: 'BAD_USER_INPUT', + } + }); + } + const system = contextValue.findSystemById(parent.systemId); if (!args.input?.intervalMs) { - throw new GraphQLError('No interval provided', { - extensions: { - code: 'BAD_USER_INPUT', - }, - }); + throwBadUserInputError('No interval provided'); + return null; } - const historicalParkingAverageQueryArguments: HistoricalParkingAverageQueryArguments = { + const queryArguments: HistoricalParkingAverageQueryArguments = { from: new Date(args.input.from), intervalMs: args.input.intervalMs, to: new Date(args.input.to), } - if (Number.isNaN(historicalParkingAverageQueryArguments.from.getTime() - || Number.isNaN(historicalParkingAverageQueryArguments.to.getTime()))) { - throw new GraphQLError('One or more invalid dates provided', { - extensions: { - code: 'BAD_USER_INPUT', - }, - }); + if (Number.isNaN(queryArguments.from.getTime() + || Number.isNaN(queryArguments.to.getTime()))) { + throwBadUserInputError('One or more incorrect dates provided'); + } + if (queryArguments.from.getTime() > queryArguments.to.getTime()) { + throwBadUserInputError("`from` date can't be greater than the `to` date"); } - const parkingAverages = await system?.parkingRepository?.getHistoricalAveragesOfParkingStructureCounts(parent.id, historicalParkingAverageQueryArguments); + // Limit queries for improved performance + if (queryArguments.to.getTime() - queryArguments.from.getTime() > PARKING_HISTORICAL_AVERAGE_MAXIMUM_TIMESPAN) { + throwBadUserInputError('Maximum timespan exceeded'); + } + if (queryArguments.intervalMs < PARKING_HISTORICAL_AVERAGE_MINIMUM_INTERVAL) { + throwBadUserInputError('Provided interval is less than minimum interval'); + } + + const parkingAverages = await system?.parkingRepository?.getHistoricalAveragesOfParkingStructureCounts(parent.id, queryArguments); if (!parkingAverages) { return null; } diff --git a/test/resolvers/ParkingStructureResolverTests.test.ts b/test/resolvers/ParkingStructureResolverTests.test.ts index bd34c2e..7133c57 100644 --- a/test/resolvers/ParkingStructureResolverTests.test.ts +++ b/test/resolvers/ParkingStructureResolverTests.test.ts @@ -5,6 +5,8 @@ import { generateParkingStructures } from "../testHelpers/mockDataGenerators"; import { HistoricalParkingAverageQueryInput } from "../../src/generated/graphql"; import assert = require("node:assert"); +jest.mock("../../src/environment"); + describe("ParkingStructureResolver", () => { const holder = setupTestServerHolder(); const context = setupTestServerContext();