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, { extractJson, setAndVariant } from './index.js'; import { parseCompactGrade } from '../_lib/tcg-shared.js'; const connector = createConnector(localMeta(meta)); describe('pokemonprice', () => { runFixtureSuite(connector, it, expect); it('aligns set names and variants with the pokemontcg vocabulary', () => { expect(setAndVariant('Base Set 1st Edition', 'Holo 1st edition')).toEqual({ set: 'Base Set', variant: '1st Edition Holo' }); expect(setAndVariant('Base Set Unlimited', 'Holo')).toEqual({ set: 'Base Set', variant: 'Holo' }); expect(setAndVariant('Base Set Shadowless', null)).toEqual({ set: 'Base Set', variant: 'Shadowless' }); expect(setAndVariant('Evolving Skies', null)).toEqual({ set: 'Evolving Skies', variant: null }); expect(parseCompactGrade('PSA9')).toEqual({ grader: 'psa', grade: '9' }); expect(parseCompactGrade('Raw')).toEqual({ grader: 'raw', grade: null }); expect(extractJson('x "rows":[{"a":[1,2]},{"b":"]"}] y', 'rows')).toEqual([{ a: [1, 2] }, { b: ']' }]); }); it('emits per-grade guide values with grader/grade and transaction counts', async () => { const [name] = listFixtures('pokemonprice'); const out = await connector.normalize(loadFixture('pokemonprice', name!).raw); const cat = out.find((r) => r.kind === 'catalog_item'); if (!cat || cat.kind !== 'catalog_item') throw new Error('expected catalog item'); expect(cat.attributes.categorySlug).toBe('pokemon'); expect(cat.attributes.set).toBeTruthy(); expect(cat.attributes.number).toMatch(/^\d+/); const obs = out.filter((r) => r.kind === 'price_observation'); expect(obs.length).toBeGreaterThan(3); const graded = obs.filter((o) => o.kind === 'price_observation' && o.grade.grader && o.grade.grader !== 'raw'); expect(graded.length).toBeGreaterThan(0); for (const o of obs) { if (o.kind !== 'price_observation') continue; expect(o.currency).toBe('USD'); expect(o.confidence).toBeLessThanOrEqual(0.8); } }); });