SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
10 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
3.0 KB · 51 lines typescript
Raw Blame History
1import { describe, expect, it } from 'vitest';2import { getConnectorMeta } from '@rareindex/connectors';3import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';4import createConnector, { TCGPLAYER_VARIANTS } from './index.js';56const connector = createConnector(getConnectorMeta('pokemontcg'));78describe('pokemontcg', () => {9  runFixtureSuite(connector, it, expect);1011  it('maps Base Set Charizard to a Holo variant with TCGplayer + Cardmarket observations', async () => {12    const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4').raw);13    const cats = out.filter((r) => r.kind === 'catalog_item');14    expect(cats).toHaveLength(1);15    const cat = cats[0]!;16    if (cat.kind !== 'catalog_item') throw new Error('kind');17    expect(cat.attributes).toMatchObject({ categorySlug: 'pokemon', set: 'Base', setCode: 'BS', number: '4', year: 1999, rarity: 'Rare Holo', variant: 'Holo', language: 'English' });18    expect(cat.attributes.identifiers.pokemontcg_id).toBe('base1-4');19    expect(cat.rawTitle).toBe('Charizard · Base #4/102 Holo (1999)');20    expect(cat.releaseDate?.toISOString()).toBe('1999-01-09T00:00:00.000Z');21    const obs = out.filter((r) => r.kind === 'price_observation');22    const usd = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'USD');23    const eur = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'EUR');24    expect(usd.map((o) => (o.kind === 'price_observation' ? o.priceKind : '')).sort()).toEqual(['high', 'low', 'market', 'mid']);25    expect(eur.length).toBeGreaterThanOrEqual(3);26    for (const o of usd) if (o.kind === 'price_observation') expect(o.observationDate.toISOString().slice(0, 10)).toMatch(/^\d{4}-\d{2}-\d{2}$/);27    // observation dates come from the source's updatedAt, not the crawl time28    const tcgMarket = usd.find((o) => o.kind === 'price_observation' && o.priceKind === 'market');29    expect(tcgMarket && tcgMarket.kind === 'price_observation' ? tcgMarket.observationDate.getTime() : 0).not.toBe(loadFixture('pokemontcg', 'base1-4').raw.fetchedAt.getTime());30    expect(obs.every((o) => o.kind === 'price_observation' && o.attributes.variant === 'Holo')).toBe(true);31  });3233  it('keeps base (normal) printings with variant null', async () => {34    const out = await connector.normalize(loadFixture('pokemontcg', 'base1-58').raw);35    const cat = out.find((r) => r.kind === 'catalog_item');36    expect(cat && cat.kind === 'catalog_item' ? cat.attributes.variant : 'x').toBeNull();37  });3839  it('handles the GitHub mirror payload (catalog only, no prices)', async () => {40    const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4-mirror').raw);41    expect(out).toHaveLength(1);42    expect(out[0]?.kind).toBe('catalog_item');43    expect(out[0] && 'attributes' in out[0] ? out[0].attributes.metadata.dataSource : '').toBe('github-mirror');44  });4546  it('covers the known TCGplayer variant keys', () => {47    expect(TCGPLAYER_VARIANTS['1stEditionHolofoil']).toBe('1st Edition Holo');48    expect(TCGPLAYER_VARIANTS.reverseHolofoil).toBe('Reverse Holo');49  });50});51