import { beforeEach, describe, expect, it, jest } from "@jest/globals"; import { ChapmanApiBasedParkingRepositoryLoader } from "../../../src/loaders/parking/ChapmanApiBasedParkingRepositoryLoader"; import { InMemoryParkingRepository } from "../../../src/repositories/InMemoryParkingRepository"; import { resetGlobalFetchMockJson, updateGlobalFetchMockJson, updateGlobalFetchMockJsonToThrowSyntaxError } from "../../testHelpers/fetchMockHelpers"; import { chapmanParkingStructureData } from "../../jsonSnapshots/chapmanParkingStructureData/chapmanParkingStructureData"; import { IParkingStructure } from "../../../src/entities/ParkingRepositoryEntities"; import { assertAsyncCallbackThrowsApiResponseError } from "../../testHelpers/assertAsyncCallbackThrowsApiResponseError"; describe("ChapmanApiBasedParkingRepositoryLoader", () => { let loader: ChapmanApiBasedParkingRepositoryLoader; beforeEach(() => { loader = new ChapmanApiBasedParkingRepositoryLoader( new InMemoryParkingRepository(), ); resetGlobalFetchMockJson(); }); describe("fetchAndUpdateAll", () => { it("calls all the correct methods", async () => { const spies = { fetchAndUpdateParkingStructures: jest.spyOn(loader, "fetchAndUpdateParkingStructures"), }; Object.values(spies).forEach((spy: any) => { spy.mockResolvedValue(undefined); }); await loader.fetchAndUpdateAll(); Object.values(spies).forEach((spy: any) => { expect(spy).toHaveBeenCalled(); }); }); }); describe("fetchAndUpdateParkingStructures", () => { it("fetches and update parking structures with unique IDs", async () => { updateGlobalFetchMockJson(chapmanParkingStructureData); await loader.fetchAndUpdateParkingStructures(); let expectedStructures: IParkingStructure[] = [ { address: "300 E Walnut, Orange, CA 92867", capacity: 871, spotsAvailable: 211, coordinates: { latitude: 33.7945513, longitude: -117.8518707, }, name: "Anderson Structure", id: "", updatedTimeMs: Date.now(), }, { address: "200 W Sycamore Ave, Orange, CA 92866-1053", capacity: 692, spotsAvailable: 282, coordinates: { latitude: 33.792937, longitude: -117.854782 }, name: "Barrera", id: "", updatedTimeMs: Date.now(), } ]; expectedStructures[0].id = ChapmanApiBasedParkingRepositoryLoader.generateId(expectedStructures[0].address); expectedStructures[1].id = ChapmanApiBasedParkingRepositoryLoader.generateId(expectedStructures[1].address); const structuresFromLoader = await loader.repository.getParkingStructures(); // Set updatedTimeMs on expected data to avoid comparison expectedStructures[0].updatedTimeMs = structuresFromLoader[0].updatedTimeMs; expectedStructures[1].updatedTimeMs = structuresFromLoader[1].updatedTimeMs; expect(structuresFromLoader).toEqual(expectedStructures); }); it("throws ApiResponseError if data is incorrect", async () => { updateGlobalFetchMockJsonToThrowSyntaxError(); await assertAsyncCallbackThrowsApiResponseError(async () => { await loader.fetchAndUpdateParkingStructures(); }); }) }); describe("constructIParkingStructureFromJson", () => { it("normalizes the spots available if it's over the capacity", async () => { const sampleJsonStructure: any = { Capacity: 10, Latitude: 1, Longitude: 1, Address: "300 E Walnut, Orange, CA 92867", Name: "Anderson Structure", CurrentCount: 11, }; const returnedStructure = loader.constructIParkingStructureFromJson(sampleJsonStructure); expect(returnedStructure.spotsAvailable).toEqual(returnedStructure.capacity); }); }); });