/** Targeted live fixture: Pokémon Base Set (group 604) cards with multiple price subtypes. */ import { saveFixture } from '@rareindex/connectors/testing'; import { trimProduct } from './index.js'; const UA = { 'user-agent': 'RareIndexBot/0.1 (+https://www.rareindex.io/about/data)' }; const get = async (u: string) => (await (await fetch(u, { headers: UA })).json()) as { results: Record[] }; const stamp = (await (await fetch('https://tcgcsv.com/last-updated.txt', { headers: UA })).text()).trim(); const groups = await get('https://tcgcsv.com/tcgplayer/3/groups'); const group = groups.results.find((g) => g.groupId === 604)!; const products = await get('https://tcgcsv.com/tcgplayer/3/604/products'); const prices = await get('https://tcgcsv.com/tcgplayer/3/604/prices'); const category = { slug: 'pokemon', franchise: 'Pokémon', brand: 'The Pokémon Company', language: 'English' }; for (const [name, match] of [['pokemon-base-charizard', /^Charizard/], ['pokemon-base-energy', /^Psychic Energy/]] as const) { const p = products.results.find((x) => match.test(String(x.name)))!; const product = trimProduct(p); const rows = prices.results.filter((r) => r.productId === product.productId); saveFixture('tcgcsv', name, { raw: { url: String(p.url), externalId: String(product.productId), kind: 'catalog_item', engine: 'api', fetchedAt: new Date(), payload: { categoryId: 3, category, group: { groupId: group.groupId, name: group.name, abbreviation: group.abbreviation, isSupplemental: group.isSupplemental, publishedOn: group.publishedOn, categoryId: 3 }, product, prices: rows, updatedAt: stamp } }, expect: { minCount: 2, kinds: ['catalog_item', 'price_observation'], requiredFields: ['attributes.identifiers.tcgplayer_id', 'attributes.set', 'attributes.number'] }, note: `Live capture ${new Date().toISOString().slice(0, 10)} — tcgcsv.com/tcgplayer/3/604 (Base Set), subtypes ${[...new Set(rows.map((r) => r.subTypeName))].join('/')}`, }); console.log(name, product.productId, rows.map((r) => `${r.subTypeName}:${r.marketPrice}`).join(' ')); }