From d48f873427b8be29e99d50cdd6fb8f8fc2339757 Mon Sep 17 00:00:00 2001 From: Adwaith2207 Date: Fri, 6 Feb 2026 23:39:37 +0530 Subject: [PATCH 1/3] add form-response tests --- src/test/form-response.test.ts | 243 +++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 src/test/form-response.test.ts diff --git a/src/test/form-response.test.ts b/src/test/form-response.test.ts new file mode 100644 index 0000000..c533514 --- /dev/null +++ b/src/test/form-response.test.ts @@ -0,0 +1,243 @@ +import { describe, it, expect, mock, beforeEach } from "bun:test"; + +// ---------------- MOCK PRISMA ---------------- + +const formFindUniqueMock = mock(); +const formResponseCreateMock = mock(); +const formResponseUpdateManyMock = mock(); +const formResponseFindManyMock = mock(); +const formFieldsFindManyMock = mock(); + +mock.module("../db/prisma", () => ({ + prisma: { + form: { + findUnique: formFindUniqueMock, + }, + formResponse: { + create: formResponseCreateMock, + updateMany: formResponseUpdateManyMock, + findMany: formResponseFindManyMock, + }, + formFields: { + findMany: formFieldsFindManyMock, + }, + }, +})); + +// ---------------- MOCK LOGGER ---------------- + +const mockInfo = mock(); +const mockWarn = mock(); + +mock.module("../logger", () => ({ + logger: { + info: mockInfo, + warn: mockWarn, + error: mock(), + }, +})); + +// IMPORT AFTER MOCKS +const { + submitResponse, + resumeResponse, + getResponseForFormOwner, + getSubmittedResponse, +} = await import("../api/form-response/controller"); + +describe("Form Response Controller Tests", () => { + + beforeEach(() => { + formFindUniqueMock.mockReset(); + formResponseCreateMock.mockReset(); + formResponseUpdateManyMock.mockReset(); + formResponseFindManyMock.mockReset(); + formFieldsFindManyMock.mockReset(); + mockInfo.mockReset(); + mockWarn.mockReset(); + }); + + const user = { id: "user1" }; + + // ===================================================== + // submitResponse + // ===================================================== + + it("submitResponse → success", async () => { + formFindUniqueMock.mockResolvedValue({ + id: "f1", + isPublished: true, + }); + + formResponseCreateMock.mockResolvedValue({ id: "r1" }); + + const set: any = {}; + + const res = await submitResponse({ + params: { formId: "f1" }, + body: { answers: {} }, + user, + set, + } as any); + + expect(res.success).toBe(true); + }); + + it("submitResponse → form not found", async () => { + formFindUniqueMock.mockResolvedValue(null); + + const set: any = {}; + + const res = await submitResponse({ + params: { formId: "x" }, + body: { answers: {} }, + user, + set, + } as any); + + expect(res.success).toBe(false); + expect(set.status).toBe(404); + }); + + it("submitResponse → not published", async () => { + formFindUniqueMock.mockResolvedValue({ + id: "f1", + isPublished: false, + }); + + const set: any = {}; + + const res = await submitResponse({ + params: { formId: "f1" }, + body: { answers: {} }, + user, + set, + } as any); + + expect(res.success).toBe(false); + expect(set.status).toBe(403); + }); + + // ===================================================== + // resumeResponse + // ===================================================== + + it("resumeResponse → success", async () => { + formResponseUpdateManyMock.mockResolvedValue({ count: 1 }); + + const res = await resumeResponse({ + params: { responseId: "r1" }, + body: { answers: {} }, + user, + } as any); + + expect(res.success).toBe(true); + }); + + it("resumeResponse → not found", async () => { + formResponseUpdateManyMock.mockResolvedValue({ count: 0 }); + + const res = await resumeResponse({ + params: { responseId: "r1" }, + body: { answers: {} }, + user, + } as any); + + expect(res.success).toBe(false); + }); + + // ===================================================== + // getResponseForFormOwner + // ===================================================== + + it("getResponseForFormOwner → success", async () => { + formFindUniqueMock.mockResolvedValue({ + id: "f1", + ownerId: user.id, + }); + + formResponseFindManyMock.mockResolvedValue([ + { + id: "r1", + formId: "f1", + answers: { field1: "A" }, + form: { title: "Form A" }, + }, + ]); + + formFieldsFindManyMock.mockResolvedValue([ + { id: "field1", fieldName: "Name" }, + ]); + + const set: any = {}; + + const res = await getResponseForFormOwner({ + params: { formId: "f1" }, + user, + set, + } as any); + + expect(res.success).toBe(true); + expect(res.data.length).toBe(1); + }); + + it("getResponseForFormOwner → form not found", async () => { + formFindUniqueMock.mockResolvedValue(null); + + const set: any = {}; + + const res = await getResponseForFormOwner({ + params: { formId: "f1" }, + user, + set, + } as any); + + expect(res.success).toBe(false); + expect(set.status).toBe(404); + }); + + // ===================================================== + // getSubmittedResponse + // ===================================================== + + it("getSubmittedResponse → success", async () => { + formResponseFindManyMock.mockResolvedValue([ + { + id: "r1", + formId: "f1", + answers: { field1: "A" }, + form: { title: "Form A" }, + }, + ]); + + formFieldsFindManyMock.mockResolvedValue([ + { id: "field1", fieldName: "Name" }, + ]); + + const set: any = {}; + + const res = await getSubmittedResponse({ + params: { formId: "f1" }, + user, + set, + } as any); + + expect(res.success).toBe(true); + }); + + it("getSubmittedResponse → none found", async () => { + formResponseFindManyMock.mockResolvedValue([]); + + const set: any = {}; + + const res = await getSubmittedResponse({ + params: { formId: "f1" }, + user, + set, + } as any); + + expect(res.success).toBe(false); + expect(set.status).toBe(404); + }); + +}); From 948e3c1a8ed98e3c88257db1cd4bbb0c95b52d60 Mon Sep 17 00:00:00 2001 From: Adwaith2207 Date: Sat, 7 Feb 2026 00:35:57 +0530 Subject: [PATCH 2/3] update form-response tests --- src/test/form-response.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/form-response.test.ts b/src/test/form-response.test.ts index c533514..8b73b57 100644 --- a/src/test/form-response.test.ts +++ b/src/test/form-response.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, mock, beforeEach } from "bun:test"; +import { beforeEach, describe, expect, it, mock } from "bun:test"; // ---------------- MOCK PRISMA ---------------- @@ -46,7 +46,6 @@ const { } = await import("../api/form-response/controller"); describe("Form Response Controller Tests", () => { - beforeEach(() => { formFindUniqueMock.mockReset(); formResponseCreateMock.mockReset(); @@ -239,5 +238,4 @@ describe("Form Response Controller Tests", () => { expect(res.success).toBe(false); expect(set.status).toBe(404); }); - }); From 41751e2e3a34490d8c0b5e7c181cd846fd32c9fb Mon Sep 17 00:00:00 2001 From: Adwaith2207 Date: Sat, 7 Feb 2026 14:28:44 +0530 Subject: [PATCH 3/3] update form-response tests --- src/test/form-response.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/form-response.test.ts b/src/test/form-response.test.ts index 8b73b57..3905a94 100644 --- a/src/test/form-response.test.ts +++ b/src/test/form-response.test.ts @@ -177,7 +177,7 @@ describe("Form Response Controller Tests", () => { } as any); expect(res.success).toBe(true); - expect(res.data.length).toBe(1); + expect(res.data!.length).toBe(1); // ✅ FIX }); it("getResponseForFormOwner → form not found", async () => { @@ -222,6 +222,7 @@ describe("Form Response Controller Tests", () => { } as any); expect(res.success).toBe(true); + expect(res.data!.length).toBe(1); // ✅ SAFE ASSERTION }); it("getSubmittedResponse → none found", async () => {