import { describe, expect, it } from 'vitest'; import meta from './meta.json' with { type: 'json' }; import { localMeta } from '../_lib/local-meta.js'; import { listFixtures, loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import createConnector from './index.js'; import { variantFromSubType, splitNumber } from '../_lib/tcg-shared.js'; const connector = createConnector(localMeta(meta)); describe('tcgcsv', () => { runFixtureSuite(connector, it, expect); it('maps TCGplayer subtypes to the shared variant vocabulary', () => { expect(variantFromSubType('Normal')).toBeNull(); expect(variantFromSubType('Holofoil')).toBe('Holo'); expect(variantFromSubType('Reverse Holofoil')).toBe('Reverse Holo'); expect(variantFromSubType('1st Edition Holofoil')).toBe('1st Edition Holo'); expect(variantFromSubType('Foil')).toBe('Foil'); expect(splitNumber('4/102')).toEqual({ number: '4', total: 102 }); }); it('emits a catalog item per printing subtype and dated price observations', async () => { const names = listFixtures('tcgcsv'); const pokemon = names.find((n) => n.startsWith('pokemon')) ?? names[0]!; const fx = loadFixture('tcgcsv', pokemon); const out = await connector.normalize(fx.raw); const cats = out.filter((r) => r.kind === 'catalog_item'); const obs = out.filter((r) => r.kind === 'price_observation'); expect(cats.length).toBeGreaterThanOrEqual(1); expect(obs.length).toBeGreaterThanOrEqual(1); for (const c of cats) { if (c.kind !== 'catalog_item') continue; expect(c.attributes.identifiers.tcgplayer_id).toMatch(/^\d+$/); expect(c.attributes.set).toBeTruthy(); } for (const o of obs) { if (o.kind !== 'price_observation') continue; expect(o.currency).toBe('USD'); expect(['market', 'low', 'mid', 'high']).toContain(o.priceKind); // dated by the mirror's last-updated stamp, never in the future expect(o.observationDate.getTime()).toBeLessThanOrEqual(Date.now()); } }); });