Skip to content

Commit d490c47

Browse files
committed
test: add test for form-fields
1 parent 7fcfd65 commit d490c47

1 file changed

Lines changed: 269 additions & 0 deletions

File tree

‎src/test/form-fields.test.ts‎

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
import { beforeEach, describe, expect, it, mock } from "bun:test";
2+
3+
// ---------------- MOCK PRISMA ----------------
4+
5+
const formCountMock = mock();
6+
const formFindFirstMock = mock();
7+
8+
const fieldsFindManyMock = mock();
9+
const fieldsFindFirstMock = mock();
10+
const fieldsCreateMock = mock();
11+
const fieldsUpdateMock = mock();
12+
const fieldsDeleteMock = mock();
13+
const fieldsFindUniqueMock = mock();
14+
15+
const transactionMock = mock(async (cb: any) =>
16+
cb({
17+
formFields: {
18+
findFirst: fieldsFindFirstMock,
19+
create: fieldsCreateMock,
20+
update: fieldsUpdateMock,
21+
delete: fieldsDeleteMock,
22+
},
23+
}),
24+
);
25+
26+
mock.module("../db/prisma", () => ({
27+
prisma: {
28+
form: {
29+
count: formCountMock,
30+
findFirst: formFindFirstMock,
31+
},
32+
formFields: {
33+
findMany: fieldsFindManyMock,
34+
findUnique: fieldsFindUniqueMock,
35+
update: fieldsUpdateMock,
36+
},
37+
$transaction: transactionMock,
38+
},
39+
}));
40+
41+
// ---------------- MOCK LOGGER ----------------
42+
43+
const mockInfo = mock();
44+
const mockWarn = mock();
45+
46+
mock.module("../logger", () => ({
47+
logger: {
48+
info: mockInfo,
49+
warn: mockWarn,
50+
error: mock(),
51+
},
52+
}));
53+
54+
// IMPORT AFTER MOCKS
55+
const { getAllFields, createField, updateField, deleteField } = await import(
56+
"../api/form-fields/controller"
57+
);
58+
59+
describe("Form Fields Controller Tests", () => {
60+
beforeEach(() => {
61+
formCountMock.mockReset();
62+
formFindFirstMock.mockReset();
63+
fieldsFindManyMock.mockReset();
64+
fieldsFindFirstMock.mockReset();
65+
fieldsCreateMock.mockReset();
66+
fieldsUpdateMock.mockReset();
67+
fieldsDeleteMock.mockReset();
68+
fieldsFindUniqueMock.mockReset();
69+
mockInfo.mockReset();
70+
mockWarn.mockReset();
71+
});
72+
73+
const user = { id: "user1" };
74+
75+
// =====================================================
76+
// getAllFields
77+
// =====================================================
78+
79+
it("getAllFields → form not found", async () => {
80+
formCountMock.mockResolvedValue(0);
81+
82+
const set: any = {};
83+
const res = await getAllFields({
84+
params: { formId: "f1" },
85+
set,
86+
} as any);
87+
88+
expect(res.success).toBe(false);
89+
expect(set.status).toBe(404);
90+
});
91+
92+
it("getAllFields → empty fields", async () => {
93+
formCountMock.mockResolvedValue(1);
94+
fieldsFindManyMock.mockResolvedValue([]);
95+
96+
const set: any = {};
97+
const res = await getAllFields({
98+
params: { formId: "f1" },
99+
set,
100+
} as any);
101+
102+
expect(res.success).toBe(true);
103+
expect(res.data!.length).toBe(0);
104+
});
105+
106+
it("getAllFields → success ordered", async () => {
107+
formCountMock.mockResolvedValue(1);
108+
109+
fieldsFindManyMock.mockResolvedValue([
110+
{ id: "1", prevFieldId: null },
111+
{ id: "2", prevFieldId: "1" },
112+
]);
113+
114+
const set: any = {};
115+
const res = await getAllFields({
116+
params: { formId: "f1" },
117+
set,
118+
} as any);
119+
120+
expect(res.success).toBe(true);
121+
expect(res.data!.length).toBe(2);
122+
});
123+
124+
// =====================================================
125+
// createField
126+
// =====================================================
127+
128+
it("createField → form not found", async () => {
129+
formFindFirstMock.mockResolvedValue(null);
130+
131+
const set: any = {};
132+
const res = await createField({
133+
params: { formId: "f1" },
134+
body: {},
135+
set,
136+
user,
137+
} as any);
138+
139+
expect(res.success).toBe(false);
140+
expect(set.status).toBe(404);
141+
});
142+
143+
it("createField → success", async () => {
144+
formFindFirstMock.mockResolvedValue({ id: "f1" });
145+
146+
fieldsCreateMock.mockResolvedValue({ id: "newField" });
147+
148+
const set: any = {};
149+
const res = await createField({
150+
params: { formId: "f1" },
151+
body: {
152+
fieldName: "Name",
153+
label: "Name",
154+
fieldType: "text",
155+
fieldValueType: "string",
156+
},
157+
set,
158+
user,
159+
} as any);
160+
161+
expect(res.success).toBe(true);
162+
});
163+
164+
// =====================================================
165+
// updateField
166+
// =====================================================
167+
168+
it("updateField → not found", async () => {
169+
fieldsFindUniqueMock.mockResolvedValue(null);
170+
171+
const set: any = {};
172+
const res = await updateField({
173+
params: { id: "x" },
174+
body: {},
175+
set,
176+
user,
177+
} as any);
178+
179+
expect(res.success).toBe(false);
180+
expect(set.status).toBe(404);
181+
});
182+
183+
it("updateField → unauthorized", async () => {
184+
fieldsFindUniqueMock.mockResolvedValue({
185+
form: { ownerId: "other" },
186+
});
187+
188+
const set: any = {};
189+
const res = await updateField({
190+
params: { id: "x" },
191+
body: {},
192+
set,
193+
user,
194+
} as any);
195+
196+
expect(res.success).toBe(false);
197+
expect(set.status).toBe(403);
198+
});
199+
200+
it("updateField → success", async () => {
201+
fieldsFindUniqueMock.mockResolvedValue({
202+
form: { ownerId: user.id },
203+
});
204+
205+
fieldsUpdateMock.mockResolvedValue({ id: "1" });
206+
207+
const set: any = {};
208+
const res = await updateField({
209+
params: { id: "1" },
210+
body: {},
211+
set,
212+
user,
213+
} as any);
214+
215+
expect(res.success).toBe(true);
216+
});
217+
218+
// =====================================================
219+
// deleteField
220+
// =====================================================
221+
222+
it("deleteField → not found", async () => {
223+
fieldsFindUniqueMock.mockResolvedValue(null);
224+
225+
const set: any = {};
226+
const res = await deleteField({
227+
params: { id: "x" },
228+
set,
229+
user,
230+
} as any);
231+
232+
expect(res.success).toBe(false);
233+
expect(set.status).toBe(404);
234+
});
235+
236+
it("deleteField → unauthorized", async () => {
237+
fieldsFindUniqueMock.mockResolvedValue({
238+
form: { ownerId: "other" },
239+
});
240+
241+
const set: any = {};
242+
const res = await deleteField({
243+
params: { id: "x" },
244+
set,
245+
user,
246+
} as any);
247+
248+
expect(res.success).toBe(false);
249+
expect(set.status).toBe(403);
250+
});
251+
252+
it("deleteField → success", async () => {
253+
fieldsFindUniqueMock.mockResolvedValue({
254+
id: "1",
255+
formId: "f1",
256+
prevFieldId: null,
257+
form: { ownerId: user.id },
258+
});
259+
260+
const set: any = {};
261+
const res = await deleteField({
262+
params: { id: "1" },
263+
set,
264+
user,
265+
} as any);
266+
267+
expect(res.success).toBe(true);
268+
});
269+
});

0 commit comments

Comments
 (0)