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 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 Video brand headline Sponsored Brands video product Sponsored Hidden preloaded product Sponsored Hidden accessibility 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 Brands related to your search Sponsored VOSKER Reolink `, { 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 Arlo Go 2 LTE Security Camera related tracking 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 Brands related to your search Sponsored VOSKER `, { 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 Trending now Sponsored iulock Keypad Smart Door Lock Richelock fingerprint lock Swann MaxRanger4K Solar Fence Lights SECRUI Wireless Doorbell 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 ANNKE security camera Night Owl camera Recently bought and rated Rated doorbell `, { 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 Chamberlain myQ Control your garage from anywhere Chamberlain garage opener Sponsored Vosker PROTECT YOUR EQUIPMENT Vosker solar camera Sponsored Vosker 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 Sponsored Vosker VKX Solar Powered 4G-LTE Outdoor Cellular Security Camera $379.99 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 Related searches home security camera outdoor camera `, { 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; });