import { describe, it, expect, vi, beforeEach } from "vitest"; import express from "express"; import request from "supertest"; vi.mock("node:dns/promises", () => ({ default: { lookup: vi.fn() }, lookup: vi.fn(), })); let app: express.Express; beforeEach(async () => { vi.clearAllMocks(); vi.resetModules(); const { renderPdf, renderUrlPdf } = await import("../services/browser.js"); vi.mocked(renderPdf).mockResolvedValue(Buffer.from("%PDF-1.4 mock")); vi.mocked(renderUrlPdf).mockResolvedValue(Buffer.from("%PDF-1.4 mock url")); const dns = await import("node:dns/promises"); vi.mocked(dns.default.lookup).mockResolvedValue({ address: "93.184.216.34", family: 4 } as any); const { convertRouter } = await import("../routes/convert.js"); const { demoRouter } = await import("../routes/demo.js"); app = express(); app.use(express.json({ limit: "500kb" })); app.use("/v1/convert", convertRouter); app.use("/v1/demo", demoRouter); }); describe("convert routes use sanitized PDF options", () => { it("POST /v1/convert/html passes sanitized format (a4 → A4)", async () => { const { renderPdf } = await import("../services/browser.js"); await request(app) .post("/v1/convert/html") .set("content-type", "application/json") .send({ html: "

Test

", format: "a4" }); expect(vi.mocked(renderPdf)).toHaveBeenCalledOnce(); const opts = vi.mocked(renderPdf).mock.calls[0][1]; expect(opts.format).toBe("A4"); }); it("POST /v1/convert/markdown passes sanitized format (letter → Letter)", async () => { const { renderPdf } = await import("../services/browser.js"); await request(app) .post("/v1/convert/markdown") .set("content-type", "application/json") .send({ markdown: "# Test", format: "letter" }); expect(vi.mocked(renderPdf)).toHaveBeenCalledOnce(); const opts = vi.mocked(renderPdf).mock.calls[0][1]; expect(opts.format).toBe("Letter"); }); it("POST /v1/convert/url passes sanitized format (a3 → A3)", async () => { const { renderUrlPdf } = await import("../services/browser.js"); await request(app) .post("/v1/convert/url") .set("content-type", "application/json") .send({ url: "https://example.com", format: "a3" }); expect(vi.mocked(renderUrlPdf)).toHaveBeenCalledOnce(); const opts = vi.mocked(renderUrlPdf).mock.calls[0][1]; expect(opts.format).toBe("A3"); }); }); describe("demo routes use sanitized PDF options", () => { it("POST /v1/demo/html passes sanitized format (a4 → A4)", async () => { const { renderPdf } = await import("../services/browser.js"); await request(app) .post("/v1/demo/html") .set("content-type", "application/json") .send({ html: "

Test

", format: "a4" }); expect(vi.mocked(renderPdf)).toHaveBeenCalledOnce(); const opts = vi.mocked(renderPdf).mock.calls[0][1]; expect(opts.format).toBe("A4"); }); it("POST /v1/demo/markdown passes sanitized format (a4 → A4)", async () => { const { renderPdf } = await import("../services/browser.js"); await request(app) .post("/v1/demo/markdown") .set("content-type", "application/json") .send({ markdown: "# Test", format: "a4" }); expect(vi.mocked(renderPdf)).toHaveBeenCalledOnce(); const opts = vi.mocked(renderPdf).mock.calls[0][1]; expect(opts.format).toBe("A4"); }); });