1import { describe, expect, it } from 'vitest';2import { CATEGORIES, FAMILIES, getCategory, normalizeCondition, parseGradeFromTitle, variantKey, indexForCategory, descendants } from './index.js';34describe('taxonomy', () => {5 it('loads a large, consistent tree', () => {6 expect(FAMILIES.length).toBeGreaterThan(90);7 expect(CATEGORIES.length).toBeGreaterThan(FAMILIES.length);8 const slugs = new Set(CATEGORIES.map((c) => c.slug));9 expect(slugs.size).toBe(CATEGORIES.length);10 expect(getCategory('pokemon')?.familySlug).toBe('trading_cards');11 expect(getCategory('pokemon')?.index).toBe('RARE-TCG');12 expect(descendants('trading_cards')).toContain('pokemon');13 });14 it('normalises conditions per scale', () => {15 expect(normalizeCondition('pokemon', 'Near Mint')).toBe('near_mint');16 expect(normalizeCondition('nintendo_games', 'Complete In Box')).toBe('cib');17 expect(normalizeCondition('nike_jordan', 'DS')).toBe('deadstock');18 expect(normalizeCondition('rolex', 'Unworn')).toBe('unworn');19 expect(normalizeCondition('rolex', 'weird')).toBeNull();20 });21 it('parses grades', () => {22 expect(parseGradeFromTitle('1999 Pokemon Base Charizard 1st PSA 10')).toMatchObject({ grader: 'psa', grade: '10' });23 expect(parseGradeFromTitle('Charizard BGS 9.5 Black Label')).toMatchObject({ grader: 'bgs', grade: '9.5', qualifier: 'Black Label' });24 expect(parseGradeFromTitle('Amazing Fantasy 15 CGC 3.0')).toMatchObject({ grader: 'cgc', grade: '3.0' });25 expect(parseGradeFromTitle('Super Mario 64 WATA 9.8 A++')).toMatchObject({ grader: 'wata', grade: '9.8' });26 expect(parseGradeFromTitle('Rolex Daytona 116500LN')).toMatchObject({ grader: null, grade: null });27 expect(parseGradeFromTitle('1952 Topps Mantle raw')).toMatchObject({ grader: 'raw' });28 });29 it('builds variant keys', () => {30 expect(variantKey({ grader: 'psa', grade: '10' })).toEqual({ key: 'psa|10', label: 'PSA 10' });31 expect(variantKey({ completeness: 'sealed' })).toEqual({ key: 'raw|sealed', label: 'Sealed' });32 expect(variantKey({ size: '10' }).key).toBe('raw|size_10');33 expect(indexForCategory('rolex')?.ticker).toBe('RARE-WATCH');34 });35});3637describe('parseGradeFromTitle ambiguity', () => {38 it('does not mistake Tag Team for the TAG grader', () => {39 expect(parseGradeFromTitle('2019 Pokemon Tag Team GX Pikachu & Zekrom PSA GEM MT 10')).toMatchObject({ grader: 'psa', grade: '10' });40 expect(parseGradeFromTitle('Pokemon Tag Team Pikachu raw')).toMatchObject({ grader: 'raw' });41 expect(parseGradeFromTitle('Charizard TAG 10')).toMatchObject({ grader: 'tag', grade: '10' });42 });43});44