From 922fd7abb8265d759bfc0b6f0891b2a433aa4e79 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 8 Apr 2025 16:37:36 -0700 Subject: [PATCH 1/4] add repository methods --- src/repositories/ParkingGetterRepository.ts | 6 ++++++ src/repositories/ParkingGetterSetterRepository.ts | 10 ++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/repositories/ParkingGetterRepository.ts create mode 100644 src/repositories/ParkingGetterSetterRepository.ts diff --git a/src/repositories/ParkingGetterRepository.ts b/src/repositories/ParkingGetterRepository.ts new file mode 100644 index 0000000..0e7e00c --- /dev/null +++ b/src/repositories/ParkingGetterRepository.ts @@ -0,0 +1,6 @@ +import { IParkingStructure } from "../entities/ParkingRepositoryEntities"; + +export interface ParkingGetterRepository { + getParkingStructures(): Promise; + getParkingStructureById(id: string): Promise; +} diff --git a/src/repositories/ParkingGetterSetterRepository.ts b/src/repositories/ParkingGetterSetterRepository.ts new file mode 100644 index 0000000..cfe23ba --- /dev/null +++ b/src/repositories/ParkingGetterSetterRepository.ts @@ -0,0 +1,10 @@ +import { IParkingStructure } from "../entities/ParkingRepositoryEntities"; +import { ParkingGetterRepository } from "./ParkingGetterRepository"; + +export interface ParkingGetterSetterRepository extends ParkingGetterRepository { + addOrUpdateParkingStructure(structure: IParkingStructure): Promise; + + removeParkingStructureIfExists(id: string): Promise; + + clearParkingStructureData(): Promise; +} From e5c4387cff0b73efdf1a733981b2b05a3aca5b34 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 8 Apr 2025 16:39:23 -0700 Subject: [PATCH 2/4] add stub methods for repo --- src/repositories/InMemoryParkingRepository.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/repositories/InMemoryParkingRepository.ts diff --git a/src/repositories/InMemoryParkingRepository.ts b/src/repositories/InMemoryParkingRepository.ts new file mode 100644 index 0000000..0048a1e --- /dev/null +++ b/src/repositories/InMemoryParkingRepository.ts @@ -0,0 +1,23 @@ +import { ParkingGetterSetterRepository } from "./ParkingGetterSetterRepository"; +import { IParkingStructure } from "../entities/ParkingRepositoryEntities"; + +export class InMemoryParkingRepository implements ParkingGetterSetterRepository { + async addOrUpdateParkingStructure(structure: IParkingStructure): Promise { + } + + async clearParkingStructureData(): Promise { + } + + async getParkingStructureById(id: string): Promise { + return null; + } + + async getParkingStructures(): Promise { + return []; + } + + async removeParkingStructureIfExists(id: string): Promise { + return null; + } + +} From fe2b8b2f6927cbd2066458adf5f1d22cb13da511 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 8 Apr 2025 16:45:58 -0700 Subject: [PATCH 3/4] add test cases --- .../InMemoryParkingRepositoryTests.test.ts | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 test/repositories/InMemoryParkingRepositoryTests.test.ts diff --git a/test/repositories/InMemoryParkingRepositoryTests.test.ts b/test/repositories/InMemoryParkingRepositoryTests.test.ts new file mode 100644 index 0000000..b656c81 --- /dev/null +++ b/test/repositories/InMemoryParkingRepositoryTests.test.ts @@ -0,0 +1,105 @@ +import { beforeEach, describe, expect, it } from "@jest/globals"; +import { InMemoryParkingRepository } from "../../src/repositories/InMemoryParkingRepository"; +import { IParkingStructure } from "../../src/entities/ParkingRepositoryEntities"; + +describe("InMemoryParkingRepository", () => { + let repository: InMemoryParkingRepository; + const testStructure: IParkingStructure = { + coordinates: { + latitude: 33.794795, + longitude: -117.850807, + }, + spotsAvailable: 0, + id: "1", + name: "Anderson Parking Structure", + capacity: 100, + address: "300 E Walnut Ave, Orange, CA 92867" + }; + + beforeEach(() => { + repository = new InMemoryParkingRepository(); + }); + + describe("addOrUpdateParkingStructure", () => { + it("should add a new parking structure", async () => { + await repository.addOrUpdateParkingStructure(testStructure); + const result = await repository.getParkingStructureById(testStructure.id); + expect(result).toEqual(testStructure); + }); + + it("should update existing parking structure", async () => { + await repository.addOrUpdateParkingStructure(testStructure); + const updatedStructure = { ...testStructure, name: "Updated Garage" }; + await repository.addOrUpdateParkingStructure(updatedStructure); + const result = await repository.getParkingStructureById(testStructure.id); + expect(result).toEqual(updatedStructure); + }); + }); + + describe("removeParkingStructureIfExists", () => { + it("should remove existing parking structure and return it", async () => { + await repository.addOrUpdateParkingStructure(testStructure); + const removed = await repository.removeParkingStructureIfExists(testStructure.id); + expect(removed).toEqual(testStructure); + const result = await repository.getParkingStructureById(testStructure.id); + expect(result).toBeNull(); + }); + + it("should return null when removing non-existent structure", async () => { + const result = await repository.removeParkingStructureIfExists("non-existent"); + expect(result).toBeNull(); + }); + }); + + describe("clearParkingStructureData", () => { + it("should remove all parking structures", async () => { + const structures = [ + testStructure, + { ...testStructure, id: "test-id-2", name: "Second Garage" } + ]; + + for (const structure of structures) { + await repository.addOrUpdateParkingStructure(structure); + } + + await repository.clearParkingStructureData(); + const result = await repository.getParkingStructures(); + expect(result).toHaveLength(0); + }); + }); + + describe("getParkingStructures", () => { + it("should return empty array when no structures exist", async () => { + const result = await repository.getParkingStructures(); + expect(result).toEqual([]); + }); + + it("should return all added structures", async () => { + const structures = [ + testStructure, + { ...testStructure, id: "test-id-2", name: "Second Garage" } + ]; + + for (const structure of structures) { + await repository.addOrUpdateParkingStructure(structure); + } + + const result = await repository.getParkingStructures(); + expect(result).toHaveLength(2); + expect(result).toEqual(expect.arrayContaining(structures)); + }); + }); + + describe("getParkingStructureById", () => { + it("should return null for non-existent structure", async () => { + const result = await repository.getParkingStructureById("non-existent"); + expect(result).toBeNull(); + }); + + it("should return structure by id", async () => { + await repository.addOrUpdateParkingStructure(testStructure); + const result = await repository.getParkingStructureById(testStructure.id); + expect(result).toEqual(testStructure); + }); + }); +}); From 461b1d1a593110403ca701c3eac0196f57372f6c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Tue, 8 Apr 2025 16:47:41 -0700 Subject: [PATCH 4/4] implement class --- src/repositories/InMemoryParkingRepository.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/repositories/InMemoryParkingRepository.ts b/src/repositories/InMemoryParkingRepository.ts index 0048a1e..763ab38 100644 --- a/src/repositories/InMemoryParkingRepository.ts +++ b/src/repositories/InMemoryParkingRepository.ts @@ -2,22 +2,35 @@ import { ParkingGetterSetterRepository } from "./ParkingGetterSetterRepository"; import { IParkingStructure } from "../entities/ParkingRepositoryEntities"; export class InMemoryParkingRepository implements ParkingGetterSetterRepository { + private structures: Map; + + constructor() { + this.structures = new Map(); + } + async addOrUpdateParkingStructure(structure: IParkingStructure): Promise { + this.structures.set(structure.id, { ...structure }); } async clearParkingStructureData(): Promise { + this.structures.clear(); } async getParkingStructureById(id: string): Promise { - return null; + const structure = this.structures.get(id); + return structure ? { ...structure } : null; } async getParkingStructures(): Promise { - return []; + return Array.from(this.structures.values()).map(structure => ({ ...structure })); } async removeParkingStructureIfExists(id: string): Promise { + const structure = this.structures.get(id); + if (structure) { + this.structures.delete(id); + return { ...structure }; + } return null; } - }