diff --git a/server/jest.config.mjs b/server/jest.config.mjs index a395ef020..a9e7bf35a 100644 --- a/server/jest.config.mjs +++ b/server/jest.config.mjs @@ -3,18 +3,21 @@ const config = { preset: "ts-jest/presets/default-esm", testEnvironment: "node", rootDir: "./", - roots: ["/tests"], - testMatch: ["**/*.test.ts"], + roots: ["/tests"], + testMatch: ["**/*.test.ts", "**/*.test.js"], verbose: true, moduleNameMapper: { "^@/(.*)\\.js$": "/src/$1.ts", "^@/(.*)$": "/src/$1", "^(\\.\\.?/.*)\\.js$": "$1" }, - extensionsToTreatAsEsm: [".ts"], - transform: { - "^.+\\.(t|j)s$": ["ts-jest", { useESM: true, tsconfig: "./tsconfig.jest.json" }] - }, + extensionsToTreatAsEsm: [".ts"], + transform: { + "^.+\\.(t|j)s$": ["ts-jest", { useESM: true, tsconfig: "./tsconfig.jest.json" }] + }, + transformIgnorePatterns: [ + "/node_modules/" + ], collectCoverageFrom: ["src/**/*.{ts,js}", "!src/**/*.d.ts"], coverageDirectory: "coverage", coverageReporters: ["text", "lcov"], diff --git a/server/tests/services/infrastructure/StatusService.test.js b/server/tests/services/infrastructure/StatusService.test.js index cffcdafff..6c5ab2fd8 100644 --- a/server/tests/services/infrastructure/StatusService.test.js +++ b/server/tests/services/infrastructure/StatusService.test.js @@ -151,24 +151,42 @@ describe("StatusService.updateMonitorStatus", () => { }); }); describe("StatusService.updateMonitorStats", () => { - const service = new StatusService(); - let findOneSpy; - beforeEach(() => { - findOneSpy = jest.spyOn(MonitorStats, "findOne"); - jest.useFakeTimers(); - }); - afterEach(() => { - jest.useRealTimers(); - jest.restoreAllMocks(); - }); - it("throws ApiError when monitor stats are missing", async () => { - findOneSpy.mockResolvedValue(null); - const { monitor } = buildMonitor({}); - const statusResponse = buildStatusResponse({ status: "up" }); - await expect(service.updateMonitorStats(monitor, statusResponse, false)).rejects.toBeInstanceOf(ApiError); - await expect(service.updateMonitorStats(monitor, statusResponse, false)).rejects.toMatchObject({ message: "MonitorStats not found", status: 500 }); - expect(findOneSpy).toHaveBeenCalledWith({ monitorId: monitor._id }); + const service = new StatusService(); + let findOneSpy; + let createSpy; + beforeEach(() => { + findOneSpy = jest.spyOn(MonitorStats, "findOne"); + createSpy = jest.spyOn(MonitorStats, "create"); + jest.useFakeTimers(); + }); + afterEach(() => { + jest.useRealTimers(); + jest.restoreAllMocks(); + }); + it("creates MonitorStats when missing and returns saved stats", async () => { + const now = new Date("2024-02-01T00:00:00Z"); + jest.setSystemTime(now); + findOneSpy.mockResolvedValue(null); + const { monitor } = buildMonitor({}); + const statusResponse = buildStatusResponse({ status: "up", responseTime: 123 }); + const stats = buildStats({ totalChecks: 0, totalUpChecks: 0, totalDownChecks: 0 }); + const saveMock = stats.save; + createSpy.mockResolvedValue(stats); + + const result = await service.updateMonitorStats(monitor, statusResponse, false); + + expect(findOneSpy).toHaveBeenCalledWith({ monitorId: monitor._id }); + expect(createSpy).toHaveBeenCalledWith({ + monitorId: monitor._id, + currentStreakStartedAt: expect.any(Number), }); + expect(saveMock).toHaveBeenCalledTimes(1); + expect(result).toBe(stats); + expect(stats.totalChecks).toBe(1); + expect(stats.totalUpChecks).toBe(1); + expect(stats.lastResponseTime).toBe(123); + expect(stats.lastCheckTimestamp).toBe(now.getTime()); + }); it("increments counters and preserves streak when status unchanged", async () => { const now = new Date("2024-02-01T12:00:00Z"); jest.setSystemTime(now); diff --git a/server/tsconfig.jest.json b/server/tsconfig.jest.json index d28e9ac55..a6b81523c 100644 --- a/server/tsconfig.jest.json +++ b/server/tsconfig.jest.json @@ -5,8 +5,9 @@ "outDir": "./dist", "module": "esnext", "moduleResolution": "nodenext", - "types": ["jest", "node"] + "types": ["jest", "node"], + "allowJs": true }, - "include": ["tests/**/*.ts", "src/**/*.ts"], + "include": ["tests/**/*.ts", "tests/**/*.js", "src/**/*.ts"], "exclude": ["dist", "node_modules"] }