Files
Checkmate/server/test/integration/maintenanceWindowRepository.test.ts

62 lines
2.6 KiB
TypeScript

import { describe, expect, it, beforeAll, afterAll, beforeEach } from "@jest/globals";
import mongoose from "mongoose";
import { MongoMemoryServer } from "mongodb-memory-server";
import MongoMaintenanceWindowsRepository from "../../src/domain/maintenance-windows/maintenance-window.repository.mongo.ts";
import { MaintenanceWindowModel } from "../../src/domain/maintenance-windows/maintenance-window.model.ts";
// ── Real-Mongo harness ─────────────────────────────────────────────────────────
// Monitor membership edits are persisted by MongoDB's array update semantics. This
// regression suite exercises the repository against a live engine so adding/removing
// monitors cannot silently become a service-only mock assertion.
let mongod: MongoMemoryServer;
beforeAll(async () => {
mongod = await MongoMemoryServer.create();
await mongoose.connect(mongod.getUri());
await MaintenanceWindowModel.init();
}, 120_000);
afterAll(async () => {
await mongoose.disconnect();
await mongod.stop();
});
beforeEach(async () => {
await MaintenanceWindowModel.deleteMany({});
});
const makeId = () => new mongoose.Types.ObjectId();
describe("MongoMaintenanceWindowsRepository", () => {
describe("updateById", () => {
it("persists added and removed monitorIds when editing a maintenance window", async () => {
const repo = new MongoMaintenanceWindowsRepository();
const teamId = makeId();
const removedMonitorId = makeId();
const keptMonitorId = makeId();
const addedMonitorId = makeId();
const window = await MaintenanceWindowModel.create({
teamId,
monitorIds: [removedMonitorId, keptMonitorId],
active: true,
name: "Scheduled maintenance",
duration: 60,
durationUnit: "minutes",
repeat: 0,
start: new Date("2026-04-10T02:00:00Z"),
end: new Date("2026-04-10T03:00:00Z"),
});
const updated = await repo.updateById(window._id.toString(), teamId.toString(), {
monitorIds: [keptMonitorId.toString(), addedMonitorId.toString()],
});
expect(updated.monitorIds).toEqual([keptMonitorId.toString(), addedMonitorId.toString()]);
expect(await repo.findByMonitorId(removedMonitorId.toString(), teamId.toString())).toEqual([]);
expect((await repo.findByMonitorId(keptMonitorId.toString(), teamId.toString())).map((item) => item.id)).toEqual([window._id.toString()]);
expect((await repo.findByMonitorId(addedMonitorId.toString(), teamId.toString())).map((item) => item.id)).toEqual([window._id.toString()]);
});
});
});