diff --git a/backend/src/reports/reports.controller.spec.ts b/backend/src/reports/reports.controller.spec.ts new file mode 100644 index 0000000..39a7476 --- /dev/null +++ b/backend/src/reports/reports.controller.spec.ts @@ -0,0 +1,82 @@ +jest.mock("uuid", () => ({ + v4: jest.fn(() => "mocked-uuid"), +})); + +jest.mock("@noble/post-quantum/ml-kem.js", () => ({ + ml_kem768: { + keygen: jest.fn(), + encapsulate: jest.fn(), + decapsulate: jest.fn(), + }, +})); + +jest.mock("jose", () => ({ + SignJWT: jest.fn().mockReturnValue({ + setProtectedHeader: jest.fn().mockReturnThis(), + setIssuedAt: jest.fn().mockReturnThis(), + setExpirationTime: jest.fn().mockReturnThis(), + sign: jest.fn().mockResolvedValue("mocked-jwt"), + }), + jwtVerify: jest.fn(), +})); + +import { Test, TestingModule } from "@nestjs/testing"; +import { AuthGuard } from "../auth/guards/auth.guard"; +import { RolesGuard } from "../auth/guards/roles.guard"; +import { AuthenticatedRequest } from "../common/interfaces/request.interface"; +import { ReportsController } from "./reports.controller"; +import { ReportsService } from "./reports.service"; + +describe("ReportsController", () => { + let controller: ReportsController; + let service: ReportsService; + + const mockReportsService = { + create: jest.fn(), + findAll: jest.fn(), + updateStatus: jest.fn(), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ReportsController], + providers: [{ provide: ReportsService, useValue: mockReportsService }], + }) + .overrideGuard(AuthGuard) + .useValue({ canActivate: () => true }) + .overrideGuard(RolesGuard) + .useValue({ canActivate: () => true }) + .compile(); + + controller = module.get(ReportsController); + service = module.get(ReportsService); + }); + + it("should be defined", () => { + expect(controller).toBeDefined(); + }); + + describe("create", () => { + it("should call service.create", async () => { + const req = { user: { sub: "user-uuid" } } as AuthenticatedRequest; + const dto = { contentId: "1", reason: "spam" }; + await controller.create(req, dto as any); + expect(service.create).toHaveBeenCalledWith("user-uuid", dto); + }); + }); + + describe("findAll", () => { + it("should call service.findAll", async () => { + await controller.findAll(10, 0); + expect(service.findAll).toHaveBeenCalledWith(10, 0); + }); + }); + + describe("updateStatus", () => { + it("should call service.updateStatus", async () => { + const dto = { status: "resolved" as any }; + await controller.updateStatus("1", dto); + expect(service.updateStatus).toHaveBeenCalledWith("1", "resolved"); + }); + }); +}); diff --git a/backend/src/reports/repositories/reports.repository.spec.ts b/backend/src/reports/repositories/reports.repository.spec.ts new file mode 100644 index 0000000..f35e699 --- /dev/null +++ b/backend/src/reports/repositories/reports.repository.spec.ts @@ -0,0 +1,69 @@ +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: any) => { + obj.then = function (onFulfilled: any) { + const result = this.execute(); + return Promise.resolve(result).then(onFulfilled); + }; + 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(); + }); +});