From 4d1af5e2b43700d004c512fe477363e66620ffc1 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 10 Apr 2026 12:33:08 -0700 Subject: [PATCH] fix TS errors, add missing tests --- server/src/service/business/monitorService.ts | 8 ++++++ .../infrastructure/network/DockerProvider.ts | 13 ++++++++++ .../providers/network/dockerProvider.test.ts | 15 +++++++++++ .../test/unit/services/monitorService.test.ts | 26 +++++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/server/src/service/business/monitorService.ts b/server/src/service/business/monitorService.ts index 7bf1ac3e0..4ab5c9476 100644 --- a/server/src/service/business/monitorService.ts +++ b/server/src/service/business/monitorService.ts @@ -263,6 +263,10 @@ export class MonitorService implements IMonitorService { type: monitor.type, }); + if (checksData.monitorType !== "hardware") { + throw new AppError({ message: "Unable to load hardware stats for this monitor", status: 500 }); + } + const stats = { aggregateData: checksData.aggregateData, upChecks: checksData.upChecks, @@ -301,6 +305,10 @@ export class MonitorService implements IMonitorService { type: monitor.type, }); + if (checksData.monitorType !== "pagespeed") { + throw new AppError({ message: "Unable to load pagespeed stats for this monitor", status: 500 }); + } + const monitorStats = await this.monitorStatsRepository.findByMonitorId(monitor.id); return { diff --git a/server/src/service/infrastructure/network/DockerProvider.ts b/server/src/service/infrastructure/network/DockerProvider.ts index 813baedbe..b3eca354b 100644 --- a/server/src/service/infrastructure/network/DockerProvider.ts +++ b/server/src/service/infrastructure/network/DockerProvider.ts @@ -138,6 +138,19 @@ export class DockerProvider implements IStatusProvider { }; } + if (!response) { + return { + monitorId: monitor.id, + teamId: monitor.teamId, + type: monitor.type, + status: false, + code: NETWORK_ERROR, + message: "No response from Docker container inspect", + responseTime, + payload: null, + }; + } + return { monitorId: monitor.id, teamId: monitor.teamId, diff --git a/server/test/unit/providers/network/dockerProvider.test.ts b/server/test/unit/providers/network/dockerProvider.test.ts index 220e0a8fa..0f3dd68f6 100644 --- a/server/test/unit/providers/network/dockerProvider.test.ts +++ b/server/test/unit/providers/network/dockerProvider.test.ts @@ -186,6 +186,21 @@ describe("DockerProvider", () => { expect(result.status).toBe(false); }); + it("returns NETWORK_ERROR when inspect response is null", async () => { + const logger = createMockLogger(); + const inspect = jest.fn().mockResolvedValue(null); + const getContainer = jest.fn().mockReturnValue({ inspect }); + const instance = { listContainers: jest.fn().mockResolvedValue([makeContainer()]), getContainer }; + const DockerLib = jest.fn().mockReturnValue(instance) as any; + const provider = new DockerProvider(logger as any, DockerLib); + + const result = await provider.handle(makeMonitor()); + + expect(result.status).toBe(false); + expect(result.code).toBe(NETWORK_ERROR); + expect(result.message).toBe("No response from Docker container inspect"); + }); + it("returns false status when inspect response has no State", async () => { const { provider } = createProvider({ inspectResult: {} }); diff --git a/server/test/unit/services/monitorService.test.ts b/server/test/unit/services/monitorService.test.ts index eabfbf3d9..cd424acf9 100644 --- a/server/test/unit/services/monitorService.test.ts +++ b/server/test/unit/services/monitorService.test.ts @@ -359,6 +359,19 @@ describe("MonitorService", () => { "monitors are not supported for hardware details" ); }); + + it("throws 500 when checksData monitorType is not hardware", async () => { + const monitorsRepository = createMonitorsRepositoryMock(); + const checksRepository = createChecksRepositoryMock(); + const monitor = makeMonitor({ type: "hardware" }); + (monitorsRepository.findById as jest.Mock).mockResolvedValue(monitor); + (checksRepository.findByDateRangeAndMonitorId as jest.Mock).mockResolvedValue({ monitorType: "http" }); + const { service } = createService({ monitorsRepository, checksRepository }); + + await expect(service.getHardwareDetailsById({ teamId: TEAM_ID, monitorId: MONITOR_ID, dateRange: "recent" })).rejects.toThrow( + "Unable to load hardware stats for this monitor" + ); + }); }); describe("getPageSpeedDetailsById", () => { @@ -403,6 +416,19 @@ describe("MonitorService", () => { ); }); + it("throws 500 when checksData monitorType is not pagespeed", async () => { + const monitorsRepository = createMonitorsRepositoryMock(); + const checksRepository = createChecksRepositoryMock(); + const monitor = makeMonitor({ type: "pagespeed" }); + (monitorsRepository.findById as jest.Mock).mockResolvedValue(monitor); + (checksRepository.findByDateRangeAndMonitorId as jest.Mock).mockResolvedValue({ monitorType: "http" }); + const { service } = createService({ monitorsRepository, checksRepository }); + + await expect(service.getPageSpeedDetailsById({ teamId: TEAM_ID, monitorId: MONITOR_ID, dateRange: "recent" })).rejects.toThrow( + "Unable to load pagespeed stats for this monitor" + ); + }); + it("handles pagespeed with different date range", async () => { const monitorsRepository = createMonitorsRepositoryMock(); const checksRepository = createChecksRepositoryMock();