import { AbuseService } from "../src/abuse/abuse.service"; const createService = () => { const prisma = { abuseEvent: { create: jest.fn(), count: jest.fn(), findMany: jest.fn(), }, exportLog: { count: jest.fn(), }, }; return { service: new AbuseService(prisma as any), prisma }; }; describe("AbuseService", () => { it("calculates a capped risk profile from recent events", async () => { const { service, prisma } = createService(); prisma.abuseEvent.findMany.mockResolvedValue([ { id: "evt_1", eventType: "EXPORT_LARGE", severity: "high", riskPoints: 80, createdAt: new Date("2026-01-01") }, { id: "evt_2", eventType: "AUTH_LOGIN_FAILURE", severity: "medium", riskPoints: 30, createdAt: new Date("2026-01-01") }, ]); const result = await service.getRiskProfile("user_1"); expect(result.score).toBe(100); expect(result.level).toBe("high"); expect(result.recentEvents).toHaveLength(2); }); it("records large and repeated export risk events", async () => { const { service, prisma } = createService(); prisma.exportLog.count.mockResolvedValue(5); prisma.abuseEvent.create.mockResolvedValue({ id: "evt_1" }); await service.recordExportActivity("user_1", 1000, { category: "Meals" }, { ipAddress: "127.0.0.1", userAgent: "jest", }); expect(prisma.abuseEvent.create).toHaveBeenCalledTimes(2); expect(prisma.abuseEvent.create).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ eventType: "EXPORT_LARGE", riskPoints: 25, severity: "high" }), })); expect(prisma.abuseEvent.create).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ eventType: "EXPORT_REPEATED", riskPoints: 20, severity: "high" }), })); }); it("records pagination abuse signals for oversized and deep page requests", async () => { const { service, prisma } = createService(); prisma.abuseEvent.count.mockResolvedValue(11); prisma.abuseEvent.create.mockResolvedValue({ id: "evt_1" }); await service.recordPaginationActivity("user_1", "view.transactions", 100, 500, 25, { ipAddress: "127.0.0.1", userAgent: "jest", }); expect(prisma.abuseEvent.count).toHaveBeenCalledWith(expect.objectContaining({ where: expect.objectContaining({ userId: "user_1", eventType: { in: ["PAGINATION_LIMIT_CLAMPED", "PAGINATION_DEEP_SCAN"] }, }), })); expect(prisma.abuseEvent.create).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ eventType: "PAGINATION_LIMIT_CLAMPED", riskPoints: 10, severity: "medium", }), })); expect(prisma.abuseEvent.create).toHaveBeenCalledWith(expect.objectContaining({ data: expect.objectContaining({ eventType: "PAGINATION_DEEP_SCAN", riskPoints: 20, severity: "high", }), })); }); });