TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import { describe, expect, it } from 'vitest';2import { readFileSync } from 'node:fs';3import path from 'node:path';4import { fileURLToPath } from 'node:url';5import { missingRequirements } from '@rareindex/connectors';6import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';7import { localMeta } from '../_lib/local-meta.js';8import createConnector, { numistaCategory, TypeSchema } from './index.js';910const dir = path.dirname(fileURLToPath(import.meta.url));11const meta = localMeta(JSON.parse(readFileSync(path.join(dir, 'meta.json'), 'utf8')));12const connector = createConnector(meta);1314describe('numista', () => {15 runFixtureSuite(connector, it, expect);1617 it('is gated on NUMISTA_API_KEY', () => {18 expect(meta.requires).toEqual(['NUMISTA_API_KEY']);19 expect(missingRequirements(meta, {})).toEqual(['NUMISTA_API_KEY']);20 expect(missingRequirements(meta, { NUMISTA_API_KEY: 'k' })).toEqual([]);21 });2223 it('normalises documented types into catalog items with N# identifiers and per-grade guide values', async () => {24 const fx = loadFixture('numista', 'types-canada-doc-example');25 const out = await connector.normalize(fx.raw);26 const items = out.filter((r) => r.kind === 'catalog_item');27 const obs = out.filter((r) => r.kind === 'price_observation');28 expect(items.length).toBe(2);29 expect(obs.length).toBe(3); // f, vf and the documented "gradde: xf" typo30 const victoria = items[0]!;31 if (victoria.kind !== 'catalog_item') throw new Error('item');32 expect(victoria.attributes).toMatchObject({ categorySlug: 'coins', name: '5 Cents - Victoria', year: 1858, material: 'silver' });33 expect(victoria.attributes.identifiers).toMatchObject({ numista_id: '420', km_number: '2' });34 expect(victoria.attributes.metadata).toMatchObject({ issuer: 'Canada', issuer_code: 'canada', max_year: 1901, denomination: '5 Cents', attribution: 'Source: Numista (N#420)' });35 expect(victoria.sourceUrl).toBe('https://en.numista.com/420');36 const xf = obs.find((r) => r.kind === 'price_observation' && r.grade.grade === 'XF');37 if (!xf || xf.kind !== 'price_observation') throw new Error('xf');38 expect(xf).toMatchObject({ priceKind: 'guide_value', price: 380, currency: 'EUR', condition: { condition: 'extremely_fine', conditionRaw: 'xf' } });39 expect(xf.observationDate.toISOString()).toBe('2026-09-08T09:00:00.000Z');40 });4142 it('maps Numista categories', () => {43 expect(numistaCategory(TypeSchema.parse({ id: 1, title: 'x', category: 'coin' }))).toBe('coins');44 expect(numistaCategory(TypeSchema.parse({ id: 2, title: 'x', category: 'banknote' }))).toBe('banknotes');45 expect(numistaCategory(TypeSchema.parse({ id: 3, title: 'x', category: 'exonumia' }))).toBe('medals');46 });47});48