import { describe, expect, it } from 'vitest'; import { getConnectorMeta } from '@rareindex/connectors'; import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import createConnector, { TCGPLAYER_VARIANTS } from './index.js'; const connector = createConnector(getConnectorMeta('pokemontcg')); describe('pokemontcg', () => { runFixtureSuite(connector, it, expect); it('maps Base Set Charizard to a Holo variant with TCGplayer + Cardmarket observations', async () => { const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4').raw); const cats = out.filter((r) => r.kind === 'catalog_item'); expect(cats).toHaveLength(1); const cat = cats[0]!; if (cat.kind !== 'catalog_item') throw new Error('kind'); expect(cat.attributes).toMatchObject({ categorySlug: 'pokemon', set: 'Base', setCode: 'BS', number: '4', year: 1999, rarity: 'Rare Holo', variant: 'Holo', language: 'English' }); expect(cat.attributes.identifiers.pokemontcg_id).toBe('base1-4'); expect(cat.rawTitle).toBe('Charizard ยท Base #4/102 Holo (1999)'); expect(cat.releaseDate?.toISOString()).toBe('1999-01-09T00:00:00.000Z'); const obs = out.filter((r) => r.kind === 'price_observation'); const usd = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'USD'); const eur = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'EUR'); expect(usd.map((o) => (o.kind === 'price_observation' ? o.priceKind : '')).sort()).toEqual(['high', 'low', 'market', 'mid']); expect(eur.length).toBeGreaterThanOrEqual(3); for (const o of usd) if (o.kind === 'price_observation') expect(o.observationDate.toISOString().slice(0, 10)).toMatch(/^\d{4}-\d{2}-\d{2}$/); // observation dates come from the source's updatedAt, not the crawl time const tcgMarket = usd.find((o) => o.kind === 'price_observation' && o.priceKind === 'market'); expect(tcgMarket && tcgMarket.kind === 'price_observation' ? tcgMarket.observationDate.getTime() : 0).not.toBe(loadFixture('pokemontcg', 'base1-4').raw.fetchedAt.getTime()); expect(obs.every((o) => o.kind === 'price_observation' && o.attributes.variant === 'Holo')).toBe(true); }); it('keeps base (normal) printings with variant null', async () => { const out = await connector.normalize(loadFixture('pokemontcg', 'base1-58').raw); const cat = out.find((r) => r.kind === 'catalog_item'); expect(cat && cat.kind === 'catalog_item' ? cat.attributes.variant : 'x').toBeNull(); }); it('handles the GitHub mirror payload (catalog only, no prices)', async () => { const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4-mirror').raw); expect(out).toHaveLength(1); expect(out[0]?.kind).toBe('catalog_item'); expect(out[0] && 'attributes' in out[0] ? out[0].attributes.metadata.dataSource : '').toBe('github-mirror'); }); it('covers the known TCGplayer variant keys', () => { expect(TCGPLAYER_VARIANTS['1stEditionHolofoil']).toBe('1st Edition Holo'); expect(TCGPLAYER_VARIANTS.reverseHolofoil).toBe('Reverse Holo'); }); });