mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-21 00:58:29 -06:00
Compare commits
4 Commits
patch-1
...
fix/api-wr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b23a836ab6 | ||
|
|
2785ff3fb3 | ||
|
|
248edd80cb | ||
|
|
b2506ffde1 |
@@ -1,4 +1,5 @@
|
|||||||
import { ZodRawShape, z } from "zod";
|
import { ZodRawShape, z } from "zod";
|
||||||
|
import { logger } from "@formbricks/logger";
|
||||||
import { TAuthenticationApiKey } from "@formbricks/types/auth";
|
import { TAuthenticationApiKey } from "@formbricks/types/auth";
|
||||||
import { TApiAuditLog } from "@/app/lib/api/with-api-logging";
|
import { TApiAuditLog } from "@/app/lib/api/with-api-logging";
|
||||||
import { formatZodError, handleApiError } from "@/modules/api/v2/lib/utils";
|
import { formatZodError, handleApiError } from "@/modules/api/v2/lib/utils";
|
||||||
@@ -67,7 +68,22 @@ export const apiWrapper = async <S extends ExtendedSchemas>({
|
|||||||
let parsedInput: ParsedSchemas<S> = {} as ParsedSchemas<S>;
|
let parsedInput: ParsedSchemas<S> = {} as ParsedSchemas<S>;
|
||||||
|
|
||||||
if (schemas?.body) {
|
if (schemas?.body) {
|
||||||
const bodyData = await request.json();
|
let bodyData;
|
||||||
|
try {
|
||||||
|
bodyData = await request.json();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error({ error, url: request.url }, "Error parsing JSON input");
|
||||||
|
return handleApiError(request, {
|
||||||
|
type: "bad_request",
|
||||||
|
details: [
|
||||||
|
{
|
||||||
|
field: "error",
|
||||||
|
issue: "Malformed JSON input, please check your request body",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const bodyResult = schemas.body.safeParse(bodyData);
|
const bodyResult = schemas.body.safeParse(bodyData);
|
||||||
|
|
||||||
if (!bodyResult.success) {
|
if (!bodyResult.success) {
|
||||||
|
|||||||
@@ -132,6 +132,71 @@ describe("apiWrapper", () => {
|
|||||||
expect(handler).not.toHaveBeenCalled();
|
expect(handler).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("should handle malformed JSON input in request body", async () => {
|
||||||
|
const request = new Request("http://localhost", {
|
||||||
|
method: "POST",
|
||||||
|
body: "{ invalid json }",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mocked(authenticateRequest).mockResolvedValue(ok(mockAuthentication));
|
||||||
|
vi.mocked(handleApiError).mockResolvedValue(new Response("error", { status: 400 }));
|
||||||
|
|
||||||
|
const bodySchema = z.object({ key: z.string() });
|
||||||
|
const handler = vi.fn();
|
||||||
|
|
||||||
|
const response = await apiWrapper({
|
||||||
|
request,
|
||||||
|
schemas: { body: bodySchema },
|
||||||
|
rateLimit: false,
|
||||||
|
handler,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.status).toBe(400);
|
||||||
|
expect(handler).not.toHaveBeenCalled();
|
||||||
|
expect(handleApiError).toHaveBeenCalledWith(request, {
|
||||||
|
type: "bad_request",
|
||||||
|
details: [
|
||||||
|
{
|
||||||
|
field: "error",
|
||||||
|
issue: "Malformed JSON input, please check your request body",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should handle empty body when body schema is provided", async () => {
|
||||||
|
const request = new Request("http://localhost", {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mocked(authenticateRequest).mockResolvedValue(ok(mockAuthentication));
|
||||||
|
vi.mocked(handleApiError).mockResolvedValue(new Response("error", { status: 400 }));
|
||||||
|
|
||||||
|
const bodySchema = z.object({ key: z.string() });
|
||||||
|
const handler = vi.fn();
|
||||||
|
|
||||||
|
const response = await apiWrapper({
|
||||||
|
request,
|
||||||
|
schemas: { body: bodySchema },
|
||||||
|
rateLimit: false,
|
||||||
|
handler,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.status).toBe(400);
|
||||||
|
expect(handler).not.toHaveBeenCalled();
|
||||||
|
expect(handleApiError).toHaveBeenCalledWith(request, {
|
||||||
|
type: "bad_request",
|
||||||
|
details: [
|
||||||
|
{
|
||||||
|
field: "error",
|
||||||
|
issue: "Malformed JSON input, please check your request body",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test("should parse query schema correctly", async () => {
|
test("should parse query schema correctly", async () => {
|
||||||
const request = new Request("http://localhost?key=value");
|
const request = new Request("http://localhost?key=value");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user