import { Test, TestingModule } from "@nestjs/testing"; import { DatabaseService } from "../../database/database.service"; import { ReportsRepository } from "./reports.repository"; describe("ReportsRepository", () => { let repository: ReportsRepository; const mockDb = { select: jest.fn().mockReturnThis(), from: jest.fn().mockReturnThis(), orderBy: jest.fn().mockReturnThis(), where: jest.fn().mockReturnThis(), limit: jest.fn().mockReturnThis(), offset: jest.fn().mockReturnThis(), insert: jest.fn().mockReturnThis(), values: jest.fn().mockReturnThis(), update: jest.fn().mockReturnThis(), set: jest.fn().mockReturnThis(), delete: jest.fn().mockReturnThis(), returning: jest.fn().mockReturnThis(), execute: jest.fn(), }; const wrapWithThen = (obj: unknown) => { // biome-ignore lint/suspicious/noThenProperty: Necessary to mock Drizzle's awaitable query builder // biome-ignore lint/suspicious/noExplicitAny: Necessary to mock Drizzle's awaitable query builder Object.defineProperty(obj, "then", { value: function (onFulfilled: (arg0: unknown) => void) { const result = (this as any).execute(); return Promise.resolve(result).then(onFulfilled); }, configurable: true, }); return obj; }; wrapWithThen(mockDb); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ ReportsRepository, { provide: DatabaseService, useValue: { db: mockDb } }, ], }).compile(); repository = module.get(ReportsRepository); }); it("should create report", async () => { (mockDb.execute as jest.Mock).mockResolvedValue([{ id: "1" }]); const result = await repository.create({ reporterId: "u", reason: "spam" }); expect(result.id).toBe("1"); }); it("should find all", async () => { (mockDb.execute as jest.Mock).mockResolvedValue([{ id: "1" }]); const result = await repository.findAll(10, 0); expect(result).toHaveLength(1); }); it("should update status", async () => { (mockDb.execute as jest.Mock).mockResolvedValue([ { id: "1", status: "resolved" }, ]); const result = await repository.updateStatus("1", "resolved"); expect(result[0].status).toBe("resolved"); }); it("should purge obsolete", async () => { (mockDb.execute as jest.Mock).mockResolvedValue([{ id: "1" }]); await repository.purgeObsolete(new Date()); expect(mockDb.delete).toHaveBeenCalled(); }); });