All checks were successful
Build & Deploy to Staging / Build & Deploy to Staging (push) Successful in 12m44s
98 lines
3.3 KiB
TypeScript
98 lines
3.3 KiB
TypeScript
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: "<h1>Test</h1>", 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: "<h1>Test</h1>", 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");
|
|
});
|
|
});
|