import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; import { describe, it } from "node:test"; import { extractDetailPage } from "../src/detail-page.js"; const fixturePath = join(import.meta.dirname, "fixtures", "product-detail.html"); describe("extractDetailPage", () => { it("extracts visible product detail fields from sanitized HTML", async () => { const html = await readFile(fixturePath, "utf8"); const details = extractDetailPage(html, { asin: "B0TESTLED1", title: "Search title", url: "https://www.amazon.com/dp/B0TESTLED1", specs: [], bullets: [], matchedFilters: [], missingFields: [], extractionNotes: [] }); assert.equal(details.title, "Bright Daylight LED Bulbs 100W Equivalent, 50 Count"); assert.equal(details.price?.amount, 18.99); assert.equal(details.delivery?.free, true); assert.equal(details.availability, "In Stock"); assert.equal(details.seller, "Ships from Amazon.com"); assert.equal(details.bullets.length, 2); assert.deepEqual(details.specs[0], { name: "Brand", value: "BrightCo" }); assert.equal(details.rating, 4.6); assert.equal(details.reviewCount, 1234); assert.equal(details.starBreakdown?.five, 72); }); it("records missing detail-only fields", () => { const details = extractDetailPage("

Sparse Product

", { asin: "B0SPARSE01", title: "Sparse", url: "https://www.amazon.com/dp/B0SPARSE01", specs: [], bullets: [], matchedFilters: [], missingFields: [], extractionNotes: [] }); assert.equal(details.price, undefined); assert.ok(details.missingFields.includes("price")); assert.ok(details.missingFields.includes("starBreakdown")); }); it("drops script-like spec rows and trims availability metadata", () => { const details = extractDetailPage(`

Messy Product

In Stock {"merchantId":"secretish"}
Special Feature(function(P) { tracking(); }) Real feature text
A19 Add to Cart logShoppableMetrics("x", true)Buying Options
Wattage15 watts
Customer Reviews4.7 out of 5 stars tracking payload
`, { asin: "B0MESSY001", title: "Messy", url: "https://www.amazon.com/dp/B0MESSY001", specs: [], bullets: [], matchedFilters: [], missingFields: [], extractionNotes: [] }); assert.equal(details.availability, "In Stock"); assert.deepEqual(details.specs, [{ name: "Wattage", value: "15 watts" }]); }); });