import assert from 'node:assert/strict'; import { JSDOM } from 'jsdom'; import { collectAmazonSearchPageData } from '../src/page-worker/web-injectors/amazon-search-parser'; const html = `
Sponsored

Example brand headline

Brand product one

Brand product two

Amazon's Choice

Organic product

$29.99

Sponsored product

$33.93 $39.99 $0.28

Second organic product

Sponsored

Unknown sponsored product

Sponsored

Video brand headline

Sponsored Brands video product

Sponsored

Hidden preloaded product

`; const dom = new JSDOM(html, { url: 'https://www.amazon.com/s?k=mirror' }); Object.assign(globalThis, { document: dom.window.document, Node: dom.window.Node, Element: dom.window.Element, HTMLElement: dom.window.HTMLElement, HTMLAnchorElement: dom.window.HTMLAnchorElement, HTMLImageElement: dom.window.HTMLImageElement, }); async function main() { const items = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); assert.equal(items.length, 8); const byAsin = new Map(items.map((item) => [item.asin, item])); assert.equal(byAsin.get('B000000003')?.adType, 'organic'); assert.equal(byAsin.get('B000000004')?.adType, 'sponsoredProducts'); assert.equal(byAsin.get('B000000004')?.price, '$33.93'); assert.equal(byAsin.get('B000000004')?.strikethroughPrice, '$39.99'); assert.equal(byAsin.get('B000000004')?.link, 'https://www.amazon.com/dp/B000000004'); assert.equal(byAsin.get('B000000004')?.placement, 'middleOfSearch'); assert.equal(byAsin.get('B000000001')?.adType, 'sponsoredBrands'); assert.equal(byAsin.get('B000000002')?.adType, 'sponsoredBrands'); assert.equal(byAsin.get('B000000001')?.placement, 'topOfSearch'); assert.equal(byAsin.get('B000000001')?.placementId, byAsin.get('B000000002')?.placementId); assert.equal(byAsin.get('B000000001')?.adProductIndex, 1); assert.equal(byAsin.get('B000000002')?.adProductIndex, 2); assert.equal(byAsin.get('B000000005')?.adType, 'sponsoredProducts'); assert.equal(byAsin.get('B000000005')?.placement, 'bottomOfSearch'); assert.equal(byAsin.get('B000000006')?.adType, 'sponsoredDisplay'); assert.equal(byAsin.get('B000000006')?.placement, 'sidebar'); assert.equal(byAsin.get('B000000008')?.adType, 'sponsoredBrands'); assert.equal(byAsin.get('B000000008')?.adFormat, 'video'); assert.equal(byAsin.get('B000000008')?.placement, 'bottomOfSearch'); assert.equal(items.filter((item) => item.asin === 'B000000008').length, 1); assert.equal(byAsin.has('B000000009'), false); assert.equal(byAsin.has('B000000010'), false); assert.deepEqual( items.map((item) => item.pageRank), [1, 2, 3, 4, 5, 6, 7, 8], ); const hiddenDisclosureDom = new JSDOM( `

Visible organic product

Sponsored
`, { url: 'https://www.amazon.com/s?k=mirror' }, ); Object.assign(globalThis, { document: hiddenDisclosureDom.window.document, Node: hiddenDisclosureDom.window.Node, Element: hiddenDisclosureDom.window.Element, HTMLElement: hiddenDisclosureDom.window.HTMLElement, HTMLAnchorElement: hiddenDisclosureDom.window.HTMLAnchorElement, HTMLImageElement: hiddenDisclosureDom.window.HTMLImageElement, }); const hiddenDisclosureItems = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); assert.equal(hiddenDisclosureItems.length, 1); assert.equal(hiddenDisclosureItems[0].adType, 'organic'); const groupedAdsDom = new JSDOM( `
Sponsored Hidden brand destination

Grouped sponsored product one

Grouped sponsored product two

`, { url: 'https://www.amazon.com/s?k=mirror&page=8' }, ); Object.assign(globalThis, { document: groupedAdsDom.window.document, Node: groupedAdsDom.window.Node, Element: groupedAdsDom.window.Element, HTMLElement: groupedAdsDom.window.HTMLElement, HTMLAnchorElement: groupedAdsDom.window.HTMLAnchorElement, HTMLImageElement: groupedAdsDom.window.HTMLImageElement, }); const groupedAds = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const groupedAdsByAsin = new Map(groupedAds.map((item) => [item.asin, item])); assert.equal(groupedAdsByAsin.get('B000000012')?.adType, 'sponsoredProducts'); assert.equal(groupedAdsByAsin.get('B000000013')?.adType, 'sponsoredProducts'); assert.equal( groupedAdsByAsin.get('B000000012')?.placementId, groupedAdsByAsin.get('B000000013')?.placementId, ); assert.equal(groupedAdsByAsin.get('B000000012')?.adProductIndex, 1); assert.equal(groupedAdsByAsin.get('B000000013')?.adProductIndex, 2); assert.equal(groupedAdsByAsin.get('B000000014')?.adType, 'sponsoredDisplay'); assert.equal(groupedAdsByAsin.get('B000000014')?.placement, 'sidebar'); console.log('Amazon search parser fixtures passed.'); } main().catch((error) => { console.error(error); process.exitCode = 1; });