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, ); const shopByTypeDom = new JSDOM( `

Organic camera

Sponsored
STEALTH CAM

Stealth Cam trail camera

Shop cameras by type

Sponsored

security system

Night Owl 2-Way Audio

$549.99

webcam

Prisual PTZ Camera

$494.09

instant print

Kids Instant Print Camera

point and shoot

Digital Camera 4K

film camera

Kodak EKTAR H35N

`, { url: 'https://www.amazon.com/s?k=camera' }, ); Object.assign(globalThis, { document: shopByTypeDom.window.document, Node: shopByTypeDom.window.Node, Element: shopByTypeDom.window.Element, HTMLElement: shopByTypeDom.window.HTMLElement, HTMLAnchorElement: shopByTypeDom.window.HTMLAnchorElement, HTMLImageElement: shopByTypeDom.window.HTMLImageElement, }); const shopByType = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const shopByTypeByAsin = new Map(shopByType.map((item) => [item.asin, item])); const shopByTypeAsins = ['B0NIGHTOWL', 'B0PRISUAL1', 'B0KIDINST1', 'B0POINTSH1', 'B0KODAKH35']; const shopByTypeItems = shopByTypeAsins.map((asin) => shopByTypeByAsin.get(asin)); assert.ok(shopByTypeItems.filter(Boolean).length > 0, 'Shop by type cards must be collected'); assert.equal(shopByTypeItems.filter(Boolean).length, 5); assert.equal(shopByTypeByAsin.get('B0NIGHTOWL')?.asin, 'B0NIGHTOWL'); assert.equal(shopByTypeByAsin.get('B0NIGHTOWL')?.title, 'Night Owl 2-Way Audio'); assert.equal( shopByTypeByAsin.get('B0NIGHTOWL')?.imageSrc, 'https://example.com/nightowl-type.jpg', ); assert.equal(shopByTypeByAsin.get('B0NIGHTOWL')?.price, '$549.99'); assert.equal(shopByTypeByAsin.get('B0PRISUAL1')?.asin, 'B0PRISUAL1'); assert.equal(shopByTypeByAsin.get('B0PRISUAL1')?.title, 'Prisual PTZ Camera'); assert.equal(shopByTypeByAsin.get('B0KIDINST1')?.asin, 'B0KIDINST1'); assert.equal(shopByTypeByAsin.get('B0KIDINST1')?.title, 'Kids Instant Print Camera'); assert.equal(shopByTypeByAsin.get('B0POINTSH1')?.asin, 'B0POINTSH1'); assert.equal(shopByTypeByAsin.get('B0POINTSH1')?.title, 'Digital Camera 4K'); assert.equal(shopByTypeByAsin.get('B0KODAKH35')?.asin, 'B0KODAKH35'); assert.equal(shopByTypeByAsin.get('B0KODAKH35')?.title, 'Kodak EKTAR H35N'); assert.ok(shopByTypeItems.every((item) => item?.asin && item.title && item.imageSrc)); assert.equal(shopByTypeByAsin.get('B0ORGCAM01')?.adType, 'organic'); assert.equal(shopByTypeByAsin.get('B0STEALTH1')?.adType, 'sponsoredBrands'); assert.equal(shopByTypeByAsin.get('B0STEALTH1')?.adFormat, 'video'); assert.ok(shopByTypeItems.every((item) => item?.adType === 'sponsoredProducts')); assert.equal( shopByTypeByAsin.get('B0NIGHTOWL')?.placementId, shopByTypeByAsin.get('B0PRISUAL1')?.placementId, ); assert.equal(shopByTypeByAsin.get('B0NIGHTOWL')?.adProductIndex, 1); assert.equal(shopByTypeByAsin.get('B0PRISUAL1')?.adProductIndex, 2); assert.equal( shopByType.some((item) => /^(security system|webcam|instant print|point and shoot|film camera)$/i.test(item.title), ), false, ); const organicShopByTypeDom = new JSDOM( `

Organic camera

Shop cameras by type

webcam

Organic type webcam

film camera

Organic type film camera

`, { url: 'https://www.amazon.com/s?k=camera' }, ); Object.assign(globalThis, { document: organicShopByTypeDom.window.document, Node: organicShopByTypeDom.window.Node, Element: organicShopByTypeDom.window.Element, HTMLElement: organicShopByTypeDom.window.HTMLElement, HTMLAnchorElement: organicShopByTypeDom.window.HTMLAnchorElement, HTMLImageElement: organicShopByTypeDom.window.HTMLImageElement, }); const organicShopByType = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const organicShopByTypeByAsin = new Map(organicShopByType.map((item) => [item.asin, item])); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE1')?.asin, 'B0ORGTYPE1'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE1')?.title, 'Organic type webcam'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE2')?.asin, 'B0ORGTYPE2'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE2')?.title, 'Organic type film camera'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE0')?.adType, 'organic'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE1')?.adType, 'organic'); assert.equal(organicShopByTypeByAsin.get('B0ORGTYPE2')?.adType, 'organic'); assert.equal( organicShopByType.some( (item) => item.adType === 'sponsoredProducts' || item.adType === 'sponsoredBrands', ), false, ); const unknownTemplatesDom = new JSDOM( `

Generic organic product

A heading that is not Shop by type

Sponsored

Future SP one

Future SP two

Sponsored

Future Brand collection

Future SB product

Sponsored

Future SD product

`, { url: 'https://www.amazon.com/s?k=future-layout' }, ); Object.assign(globalThis, { document: unknownTemplatesDom.window.document, Node: unknownTemplatesDom.window.Node, Element: unknownTemplatesDom.window.Element, HTMLElement: unknownTemplatesDom.window.HTMLElement, HTMLAnchorElement: unknownTemplatesDom.window.HTMLAnchorElement, HTMLImageElement: unknownTemplatesDom.window.HTMLImageElement, }); const unknownTemplates = await collectAmazonSearchPageData({ pattern: 'pattern-2' }); const unknownTemplatesByAsin = new Map(unknownTemplates.map((item) => [item.asin, item])); assert.equal(unknownTemplatesByAsin.get('B0GENORG01')?.adType, 'organic'); assert.equal(unknownTemplatesByAsin.get('B0GENSP001')?.adType, 'sponsoredProducts'); assert.equal(unknownTemplatesByAsin.get('B0GENSP002')?.adType, 'sponsoredProducts'); assert.equal( unknownTemplatesByAsin.get('B0GENSP001')?.placementId, unknownTemplatesByAsin.get('B0GENSP002')?.placementId, ); assert.equal(unknownTemplatesByAsin.get('B0GENSB001')?.adType, 'sponsoredBrands'); assert.equal(unknownTemplatesByAsin.get('B0GENSD001')?.adType, 'sponsoredDisplay'); assert.ok( ['B0GENSP001', 'B0GENSP002', 'B0GENSB001', 'B0GENSD001'].every((asin) => unknownTemplatesByAsin.has(asin), ), 'Visible SP/SB/SD products must be collected even when their wrapper classes are unknown', ); console.log('Amazon search parser fixtures passed.'); } main().catch((error) => { console.error(error); process.exitCode = 1; });