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'); const liveSponsoredBrandsDom = new JSDOM( `
Arlo Security for any Home
Sponsored
Video Doorbell
Outdoor Camera
Bundle
Sponsored

Ring Spotlight Cam Plus, Battery

Organic camera

Sponsored
PROTECT YOUR EQUIPMENT & FACILITIES

Vosker VKX Solar Powered 4G-LTE Outdoor Cellular Security Camera

$379.99
`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: liveSponsoredBrandsDom.window.document, Node: liveSponsoredBrandsDom.window.Node, Element: liveSponsoredBrandsDom.window.Element, HTMLElement: liveSponsoredBrandsDom.window.HTMLElement, HTMLAnchorElement: liveSponsoredBrandsDom.window.HTMLAnchorElement, HTMLImageElement: liveSponsoredBrandsDom.window.HTMLImageElement, }); const liveSponsoredBrands = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const liveByAsin = new Map(liveSponsoredBrands.map((item) => [item.asin, item])); assert.equal(liveByAsin.get('B08AR2S6MC')?.adType, 'sponsoredBrands'); assert.equal(liveByAsin.get('B0ARLO0002')?.adType, 'sponsoredBrands'); assert.equal(liveByAsin.get('B0ARLO0003')?.adType, 'sponsoredBrands'); assert.equal(liveByAsin.get('B08AR2S6MC')?.placement, 'topOfSearch'); assert.equal(liveByAsin.get('B09RING001')?.adType, 'sponsoredProducts'); assert.equal(liveByAsin.get('B09ORG0001')?.adType, 'organic'); assert.equal(liveByAsin.get('B0VOSKER01')?.adType, 'sponsoredBrands'); assert.equal(liveByAsin.get('B0VOSKER01')?.adFormat, 'video'); assert.equal(liveByAsin.get('B0VOSKER01')?.placement, 'bottomOfSearch'); assert.equal(liveByAsin.get('B0BRAND001')?.adType, 'sponsoredBrands'); assert.equal(liveByAsin.get('B0BRAND002')?.adType, 'sponsoredBrands'); const lazyImageDom = new JSDOM( `
Arlo Security for any Home
Sponsored

Video Doorbell

`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: lazyImageDom.window.document, Node: lazyImageDom.window.Node, Element: lazyImageDom.window.Element, HTMLElement: lazyImageDom.window.HTMLElement, HTMLAnchorElement: lazyImageDom.window.HTMLAnchorElement, HTMLImageElement: lazyImageDom.window.HTMLImageElement, }); const lazyImageItems = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); assert.equal(lazyImageItems.length, 1); assert.equal(lazyImageItems[0]?.asin, 'B08AR2LAZY'); assert.equal(lazyImageItems[0]?.adType, 'sponsoredBrands'); assert.equal(lazyImageItems[0]?.imageSrc, 'https://example.com/arlo-lazy.jpg'); const classificationBoundaryDom = new JSDOM( `
Arlo Security for any Home
Sponsored
Video Doorbell
Outdoor Camera
Sponsored

Arlo Video Doorbell Wired

Sponsored

Ring Spotlight Cam Plus, Battery

Organic camera

Sponsored

Ring Indoor Cam with demo

Sponsored
PROTECT YOUR EQUIPMENT & FACILITIES

Vosker VKX Solar Powered 4G-LTE Outdoor Cellular Security Camera

Organic with product video

`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: classificationBoundaryDom.window.document, Node: classificationBoundaryDom.window.Node, Element: classificationBoundaryDom.window.Element, HTMLElement: classificationBoundaryDom.window.HTMLElement, HTMLAnchorElement: classificationBoundaryDom.window.HTMLAnchorElement, HTMLImageElement: classificationBoundaryDom.window.HTMLImageElement, }); const classificationBoundary = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const boundaryByAsin = new Map(classificationBoundary.map((item) => [item.asin, item])); assert.equal(boundaryByAsin.get('B08ARLOSB1')?.adType, 'sponsoredBrands'); assert.equal(boundaryByAsin.get('B08ARLOSB2')?.adType, 'sponsoredBrands'); assert.equal(boundaryByAsin.get('B0ARLOGRID')?.adType, 'sponsoredProducts'); assert.equal(boundaryByAsin.get('B09RINGSP1')?.adType, 'sponsoredProducts'); assert.equal(boundaryByAsin.get('B09ORGKEEP')?.adType, 'organic'); assert.equal(boundaryByAsin.get('B0TRACKSP1')?.adType, 'sponsoredProducts'); assert.equal(boundaryByAsin.has('B0TRACKXX2'), false); assert.equal(boundaryByAsin.get('B0DEMOSP01')?.adType, 'sponsoredProducts'); assert.equal(boundaryByAsin.get('B0VOSKER02')?.adType, 'sponsoredBrands'); assert.equal(boundaryByAsin.get('B0VOSKER02')?.adFormat, 'video'); assert.equal(boundaryByAsin.get('B0NOADVID1')?.adType, 'organic'); assert.equal(boundaryByAsin.get('B0BRANDWL1')?.adType, 'sponsoredBrands'); assert.equal(boundaryByAsin.get('B0SIDEBAR1')?.adType, 'sponsoredDisplay'); assert.equal(boundaryByAsin.get('B0SIDEBAR1')?.placement, 'sidebar'); const thematicLoomDom = new JSDOM( `

Organic camera

Sponsored
PROTECT YOUR EQUIPMENT & FACILITIES

Vosker VKX Solar Powered camera

Arlo Security for any Home
Sponsored
Video Doorbell
`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: thematicLoomDom.window.document, Node: thematicLoomDom.window.Node, Element: thematicLoomDom.window.Element, HTMLElement: thematicLoomDom.window.HTMLElement, HTMLAnchorElement: thematicLoomDom.window.HTMLAnchorElement, HTMLImageElement: thematicLoomDom.window.HTMLImageElement, }); const thematicLoom = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const thematicByAsin = new Map(thematicLoom.map((item) => [item.asin, item])); assert.equal(thematicByAsin.get('B0ORGLOOM1')?.adType, 'organic'); assert.equal(thematicByAsin.get('B0B2MPYRKP')?.adType, 'sponsoredProducts'); assert.equal(thematicByAsin.get('B0F8HS3RRT')?.adType, 'sponsoredProducts'); assert.equal(thematicByAsin.get('B0GQX6GHK2')?.adType, 'sponsoredProducts'); assert.equal( thematicByAsin.get('B0B2MPYRKP')?.placementId, thematicByAsin.get('B0F8HS3RRT')?.placementId, ); assert.equal(thematicByAsin.get('B0B2MPYRKP')?.adProductIndex, 1); assert.equal(thematicByAsin.get('B0F8HS3RRT')?.adProductIndex, 2); assert.equal(thematicByAsin.get('B0GQX6GHK2')?.adProductIndex, 3); assert.equal(thematicByAsin.has('B0CN95HR9V'), false); assert.equal(thematicByAsin.has('B07M68S376'), false); assert.equal(thematicByAsin.get('B0VOSKERLM')?.adType, 'sponsoredBrands'); assert.equal(thematicByAsin.get('B0VOSKERLM')?.adFormat, 'video'); assert.equal(thematicByAsin.get('B08ARLOLM1')?.adType, 'sponsoredBrands'); const organicLoomDom = new JSDOM( `

Organic camera

Customers frequently viewed

Sponsored

Recently bought and rated

`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: organicLoomDom.window.document, Node: organicLoomDom.window.Node, Element: organicLoomDom.window.Element, HTMLElement: organicLoomDom.window.HTMLElement, HTMLAnchorElement: organicLoomDom.window.HTMLAnchorElement, HTMLImageElement: organicLoomDom.window.HTMLImageElement, }); const organicLoom = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const organicLoomByAsin = new Map(organicLoom.map((item) => [item.asin, item])); assert.equal(organicLoomByAsin.get('B0ORGCFV01')?.adType, 'organic'); assert.equal(organicLoomByAsin.get('B0CFV00001')?.adType, 'organic'); assert.equal(organicLoomByAsin.get('B0CFV00002')?.adType, 'organic'); assert.equal(organicLoomByAsin.get('B0RBR00001')?.adType, 'organic'); assert.equal( organicLoom.some((item) => item.adType === 'sponsoredProducts'), false, ); const organicVideoStripDom = new JSDOM( `

Organic camera

Chamberlain myQ
Control your garage from anywhere

Chamberlain garage opener

Sponsored
PROTECT YOUR EQUIPMENT

Vosker solar camera

Sponsored
PROTECT YOUR EQUIPMENT

Vosker with visible sponsored

`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: organicVideoStripDom.window.document, Node: organicVideoStripDom.window.Node, Element: organicVideoStripDom.window.Element, HTMLElement: organicVideoStripDom.window.HTMLElement, HTMLAnchorElement: organicVideoStripDom.window.HTMLAnchorElement, HTMLImageElement: organicVideoStripDom.window.HTMLImageElement, }); const organicVideoStrip = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const videoStripByAsin = new Map(organicVideoStrip.map((item) => [item.asin, item])); assert.equal(videoStripByAsin.get('B0ORGVID01')?.adType, 'organic'); assert.equal(videoStripByAsin.get('B0NOSBV001')?.adType, 'organic'); assert.equal(videoStripByAsin.get('B0HIDDENSB')?.adType, 'organic'); assert.equal(videoStripByAsin.get('B0YESBV001')?.adType, 'sponsoredBrands'); assert.equal(videoStripByAsin.get('B0YESBV001')?.adFormat, 'video'); assert.deepEqual( organicVideoStrip.filter((item) => item.adType === 'sponsoredBrands').map((item) => item.asin), ['B0YESBV001'], ); const liveBrandWallDom = new JSDOM( `

Organic camera

Brands related to your search Sponsored
`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: liveBrandWallDom.window.document, Node: liveBrandWallDom.window.Node, Element: liveBrandWallDom.window.Element, HTMLElement: liveBrandWallDom.window.HTMLElement, HTMLAnchorElement: liveBrandWallDom.window.HTMLAnchorElement, HTMLImageElement: liveBrandWallDom.window.HTMLImageElement, }); const liveBrandWall = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const liveBrandWallByAsin = new Map(liveBrandWall.map((item) => [item.asin, item])); assert.equal(liveBrandWallByAsin.get('B0ORGGRID1')?.adType, 'organic'); assert.equal(liveBrandWallByAsin.get('B0D5Z3V464')?.adType, 'sponsoredBrands'); assert.equal(liveBrandWallByAsin.get('B0C2PY2KTJ')?.adType, 'sponsoredBrands'); assert.equal(liveBrandWallByAsin.get('B0D5Z3V464')?.title, 'Vosker'); assert.equal( liveBrandWallByAsin.get('B0D5Z3V464')?.imageSrc, 'https://example.com/vosker-wall.jpg', ); assert.equal( liveBrandWallByAsin.get('B0C2PY2KTJ')?.imageSrc, 'https://example.com/reolink-wall.jpg', ); assert.equal(liveBrandWallByAsin.has('B0FY2QCXRJ'), false); const influencerPicksDom = new JSDOM( `

Organic camera

Picks from Amazon Influencers

Sponsored From Amazon Influencer storefronts

ANNKE 4K PoE Security Camera System

Night Owl DVR

storefront

Solar Street Lights

jobsite camera packaging
Sponsored

Vosker VKX Solar Powered 4G-LTE Outdoor Cellular Security Camera

$379.99
PROTECT YOUR INVESTMENT CELLULAR SECURITY CAMERA
Sponsored

Vosker VKX Solar Powered camera

Sponsored Previously viewed

Vosker VKX Solar Powered 4G-LTE Outdoor Cellular Security Camera

$149.99
Sponsored

Owl Labs Meeting Owl 3

$1,099.00
`, { url: 'https://www.amazon.com/s?k=home+security' }, ); Object.assign(globalThis, { document: influencerPicksDom.window.document, Node: influencerPicksDom.window.Node, Element: influencerPicksDom.window.Element, HTMLElement: influencerPicksDom.window.HTMLElement, HTMLAnchorElement: influencerPicksDom.window.HTMLAnchorElement, HTMLImageElement: influencerPicksDom.window.HTMLImageElement, }); const influencerPicks = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const influencerByAsin = new Map(influencerPicks.map((item) => [item.asin, item])); assert.equal(influencerByAsin.get('B0ORGINF01')?.adType, 'organic'); assert.equal(influencerByAsin.get('B0ANNKE001')?.adType, 'sponsoredProducts'); assert.equal(influencerByAsin.get('B0NIGHTO01')?.adType, 'sponsoredProducts'); assert.equal(influencerByAsin.get('B0SOLAR001')?.adType, 'sponsoredProducts'); assert.equal( influencerByAsin.get('B0ANNKE001')?.placementId, influencerByAsin.get('B0NIGHTO01')?.placementId, ); assert.equal(influencerByAsin.get('B0VOSKERVK')?.adType, 'sponsoredBrands'); assert.equal(influencerByAsin.get('B0VOSKERVK')?.adFormat, 'standard'); assert.equal(influencerByAsin.get('B0VOSKERSB')?.adType, 'sponsoredBrands'); assert.equal(influencerByAsin.get('B0VIEWVOSK')?.adType, 'sponsoredProducts'); assert.equal(influencerByAsin.get('B0OWLLABS1')?.adType, 'sponsoredProducts'); assert.equal( influencerPicks.some((item) => /related searches/i.test(item.title)), false, ); console.log('Amazon search parser fixtures passed.'); } main().catch((error) => { console.error(error); process.exitCode = 1; });