import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; import { describe, it } from "node:test"; import { extractSearchPage } from "../src/search-page.js"; const fixturePath = join(import.meta.dirname, "fixtures", "search-results.html"); describe("extractSearchPage", () => { it("extracts normalized product candidates from sanitized search HTML", async () => { const html = await readFile(fixturePath, "utf8"); const extracted = extractSearchPage(html, "https://www.amazon.com/s?k=led+bulbs"); assert.equal(extracted.status, "ok"); assert.equal(extracted.products.length, 2); assert.equal(extracted.products[0]?.asin, "B0TESTLED1"); assert.equal(extracted.products[0]?.url, "https://www.amazon.com/dp/B0TESTLED1"); assert.equal(extracted.products[0]?.price?.amount, 18.99); assert.equal(extracted.products[0]?.unitPrice?.amount, 0.38); assert.equal(extracted.products[0]?.rating, 4.6); assert.equal(extracted.products[0]?.reviewCount, 1234); assert.equal(extracted.products[0]?.delivery?.free, true); assert.equal(extracted.products[0]?.isSponsored, false); assert.equal(extracted.products[1]?.isSponsored, true); assert.equal(extracted.nextPageUrl, "https://www.amazon.com/s?k=led+bulbs&page=2"); }); it("detects Amazon challenge pages", () => { const extracted = extractSearchPage("Robot CheckEnter the characters you see below", "https://www.amazon.com/s?k=x"); assert.equal(extracted.status, "challenge"); assert.match(extracted.warnings[0] ?? "", /challenge/i); assert.equal(extracted.products.length, 0); }); it("returns ok with no products for empty or cardless pages", () => { const extracted = extractSearchPage("No results", "https://www.amazon.com/s?k=x"); assert.equal(extracted.status, "ok"); assert.deepEqual(extracted.products, []); assert.equal(extracted.nextPageUrl, undefined); }); it("skips malformed ASINs and cards without titles", () => { const extracted = extractSearchPage(`

Bad ASIN

`, "https://www.amazon.com/s?k=x"); assert.equal(extracted.status, "ok"); assert.equal(extracted.products.length, 0); }); it("keeps candidates with missing price and records missing price later", () => { const extracted = extractSearchPage(`

No Price Product

`, "https://www.amazon.com/s?k=x"); assert.equal(extracted.products.length, 1); assert.equal(extracted.products[0]?.price, undefined); }); it("detects Prime badges even when visible delivery text omits the word Prime", () => { const extracted = extractSearchPage(`

Prime Sofa Bed

$299.99 FREE delivery Tomorrow
`, "https://www.amazon.com/s?k=sofa+bed"); assert.equal(extracted.products.length, 1); assert.equal(extracted.products[0]?.delivery?.prime, true); assert.equal(extracted.products[0]?.delivery?.free, true); assert.match(extracted.products[0]?.delivery?.display ?? "", /Tomorrow/); }); it("does not treat Prime in a product title as Prime delivery", () => { const extracted = extractSearchPage(`

Prime Sofa Bed

FREE delivery Tomorrow
`, "https://www.amazon.com/s?k=sofa+bed"); assert.equal(extracted.products.length, 1); assert.equal(extracted.products[0]?.delivery?.prime, false); }); });