import { Test, TestingModule } from "@nestjs/testing"; import { INestApplication } from "@nestjs/common"; import request from "supertest"; import { App } from "supertest/types"; import { AppModule } from "./../src/app.module"; import { ProjectRepository } from "./../src/project/project.repository"; describe("AppController (e2e)", () => { let app: INestApplication; const TEST_UUID = "550e8400-e29b-41d4-a716-446655440000"; const mockRepository = { create: jest.fn(), findAll: jest.fn(), findOne: jest.fn(), update: jest.fn(), remove: jest.fn(), }; beforeEach(async () => { mockRepository.findAll.mockResolvedValue([{ id: TEST_UUID, name: "Test" }]); mockRepository.findOne.mockResolvedValue({ id: TEST_UUID, name: "Test" }); mockRepository.create.mockResolvedValue({ id: TEST_UUID, name: "E2E Project" }); mockRepository.update.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); mockRepository.remove.mockResolvedValue({ id: TEST_UUID }); const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }) .overrideProvider(ProjectRepository) .useValue(mockRepository) .compile(); app = moduleFixture.createNestApplication(); await app.init(); }); afterEach(async () => { await app.close(); }); it("/ (GET)", () => { return request(app.getHttpServer()).get("/").expect(200).expect("Hello World!"); }); describe("/projects", () => { it("GET /projects returns an array", () => { return request(app.getHttpServer()) .get("/projects") .expect(200) .expect([{ id: TEST_UUID, name: "Test" }]); }); it("POST /projects creates a project", () => { const body = { name: "E2E Project", status: "active" }; return request(app.getHttpServer()).post("/projects").send(body).expect(201); }); it("GET /projects/:id returns a project by id", () => { return request(app.getHttpServer()) .get(`/projects/${TEST_UUID}`) .expect(200) .expect({ id: TEST_UUID, name: "Test" }); }); it("PATCH /projects/:id updates a project", () => { const body = { name: "Updated E2E" }; mockRepository.findOne.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); mockRepository.update.mockResolvedValue({ id: TEST_UUID, name: "Updated E2E" }); return request(app.getHttpServer()) .patch(`/projects/${TEST_UUID}`) .send(body) .expect(200) .expect({ id: TEST_UUID, name: "Updated E2E" }); }); it("DELETE /projects/:id deletes a project", () => { mockRepository.findOne.mockResolvedValue({ id: TEST_UUID }); return request(app.getHttpServer()).delete(`/projects/${TEST_UUID}`).expect(200).expect({ id: TEST_UUID }); }); }); });