Add input validation for waitUntil and size limits for headerTemplate/footerTemplate
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
Some checks failed
Build & Deploy to Staging / Build & Deploy to Staging (push) Has been cancelled
- Add waitUntil validation with allowed values: load, domcontentloaded, networkidle0, networkidle2 - Add size limit validation for headerTemplate and footerTemplate (100KB max) - Follow TDD approach: 15 new failing tests, then implementation - All 462 tests passing (was 447)
This commit is contained in:
parent
646a94dd6a
commit
7d44524ae0
2 changed files with 146 additions and 3 deletions
|
|
@ -159,4 +159,117 @@ describe("validatePdfOptions", () => {
|
|||
expect(validatePdfOptions({ pageRanges: "all" }).valid).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
// --- waitUntil ---
|
||||
describe("waitUntil", () => {
|
||||
const validValues = ["load", "domcontentloaded", "networkidle0", "networkidle2"];
|
||||
for (const value of validValues) {
|
||||
it(`accepts "${value}"`, () => {
|
||||
const result = validatePdfOptions({ waitUntil: value });
|
||||
expect(result.valid).toBe(true);
|
||||
if (result.valid) {
|
||||
expect(result.sanitized.waitUntil).toBe(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
it("rejects invalid string", () => {
|
||||
const result = validatePdfOptions({ waitUntil: "invalid" });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("waitUntil");
|
||||
expect(result.error).toContain("load");
|
||||
expect(result.error).toContain("domcontentloaded");
|
||||
expect(result.error).toContain("networkidle0");
|
||||
expect(result.error).toContain("networkidle2");
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects number", () => {
|
||||
const result = validatePdfOptions({ waitUntil: 123 as any });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("waitUntil");
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects boolean", () => {
|
||||
const result = validatePdfOptions({ waitUntil: true as any });
|
||||
expect(result.valid).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
// --- headerTemplate ---
|
||||
describe("headerTemplate", () => {
|
||||
it("accepts string under size limit", () => {
|
||||
const template = "<html><head></head><body>Header</body></html>";
|
||||
const result = validatePdfOptions({ headerTemplate: template });
|
||||
expect(result.valid).toBe(true);
|
||||
if (result.valid) {
|
||||
expect(result.sanitized.headerTemplate).toBe(template);
|
||||
}
|
||||
});
|
||||
|
||||
it("accepts exactly 100KB", () => {
|
||||
const template = "a".repeat(102400); // exactly 100KB
|
||||
const result = validatePdfOptions({ headerTemplate: template });
|
||||
expect(result.valid).toBe(true);
|
||||
});
|
||||
|
||||
it("rejects over 100KB", () => {
|
||||
const template = "a".repeat(102401); // 100KB + 1 char
|
||||
const result = validatePdfOptions({ headerTemplate: template });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("headerTemplate");
|
||||
expect(result.error).toContain("100KB");
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects non-string", () => {
|
||||
const result = validatePdfOptions({ headerTemplate: 123 as any });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("headerTemplate");
|
||||
expect(result.error).toContain("string");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// --- footerTemplate ---
|
||||
describe("footerTemplate", () => {
|
||||
it("accepts string under size limit", () => {
|
||||
const template = "<html><head></head><body>Footer</body></html>";
|
||||
const result = validatePdfOptions({ footerTemplate: template });
|
||||
expect(result.valid).toBe(true);
|
||||
if (result.valid) {
|
||||
expect(result.sanitized.footerTemplate).toBe(template);
|
||||
}
|
||||
});
|
||||
|
||||
it("accepts exactly 100KB", () => {
|
||||
const template = "a".repeat(102400); // exactly 100KB
|
||||
const result = validatePdfOptions({ footerTemplate: template });
|
||||
expect(result.valid).toBe(true);
|
||||
});
|
||||
|
||||
it("rejects over 100KB", () => {
|
||||
const template = "a".repeat(102401); // 100KB + 1 char
|
||||
const result = validatePdfOptions({ footerTemplate: template });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("footerTemplate");
|
||||
expect(result.error).toContain("100KB");
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects non-string", () => {
|
||||
const result = validatePdfOptions({ footerTemplate: 123 as any });
|
||||
expect(result.valid).toBe(false);
|
||||
if (!result.valid) {
|
||||
expect(result.error).toContain("footerTemplate");
|
||||
expect(result.error).toContain("string");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue