jest.mock("../db/pool", () => ({ connect: jest.fn(), })); const pool = require("../db/pool"); const LocationMap = require("../models/location-map.model"); function createClient() { return { query: jest.fn(), release: jest.fn(), }; } describe("location-map.model", () => { beforeEach(() => { jest.clearAllMocks(); }); test("unlinks saved map objects from zones outside the current location", async () => { const client = createClient(); pool.connect.mockResolvedValue(client); const getMapStateSpy = jest.spyOn(LocationMap, "getMapState").mockResolvedValue({ draft_map: { id: 900 }, draft_objects: [], }); client.query.mockImplementation(async (sql) => { if (sql === "BEGIN" || sql === "COMMIT") { return { rows: [], rowCount: 0 }; } if (String(sql).includes("INSERT INTO location_maps")) { return { rows: [ { id: 900, household_id: 1, store_location_id: 10, name: "Store Map", width: 1000, height: 700, status: "draft", version: 1, }, ], }; } if (String(sql).includes("FROM store_location_zones")) { return { rows: [{ id: 501 }] }; } return { rows: [], rowCount: 0 }; }); await LocationMap.saveDraft(1, 10, 42, { objects: [ { zone_id: 501, label: "Valid zone" }, { zone_id: 999, label: "Foreign zone" }, ], }); const insertCalls = client.query.mock.calls.filter(([sql]) => String(sql).includes("INSERT INTO location_map_objects") ); expect(insertCalls).toHaveLength(2); expect(insertCalls[0][1][1]).toBe(501); expect(insertCalls[1][1][1]).toBeNull(); expect(client.query).toHaveBeenCalledWith( expect.stringContaining("FROM store_location_zones"), [1, 10] ); expect(getMapStateSpy).toHaveBeenCalledWith(1, 10, true); expect(client.query).toHaveBeenCalledWith("COMMIT"); expect(client.release).toHaveBeenCalled(); }); });