import { describe, expect, it } from 'vitest'; import { getConnectorMeta } from '@rareindex/connectors'; import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import createConnector, { normaliseGradeText, parseJapaneseDate, parseSearchPage } from './index.js'; const connector = createConnector(getConnectorMeta('aucfree')); describe('aucfree', () => { runFixtureSuite(connector, it, expect); it('maps closed lots to JPY auction sales with parsed PSA grades', async () => { const fx = loadFixture('aucfree', 'pokemon-psa10-page1'); const out = await connector.normalize(fx.raw); expect(out.length).toBeGreaterThanOrEqual(40); const graded = out.filter((r) => r.kind === 'sale' && r.grade.grader === 'psa' && r.grade.grade === '10'); expect(graded.length).toBeGreaterThan(20); for (const r of out) { if (r.kind !== 'sale') throw new Error(); expect(r.currency).toBe('JPY'); expect(r.saleType).toBe('auction'); expect(r.buyerPremiumIncluded).toBe(false); expect(r.attributes.categorySlug).toBe('pokemon'); expect(r.attributes.language).toBe('Japanese'); expect(r.sourceUrl).toMatch(/^https:\/\/aucfree\.com\/items\/[a-z0-9]+$/); expect(r.saleDate.getUTCHours()).toBe(0); } }); it('helpers', () => { expect(parseJapaneseDate('2026年9月6日')?.toISOString()).toBe('2026-09-06T00:00:00.000Z'); expect(parseJapaneseDate('nope')).toBeNull(); expect(normaliseGradeText('【PSA10】ポケモンカード')).toContain('PSA 10'); expect(normaliseGradeText('BGS9.5 カード')).toContain('BGS 9.5'); const html = `
テスト カード PSA10
12,345円3件2026年9月1日
`; const p = parseSearchPage(html, 'u', { q: 'q', category: 'pokemon', language: 'Japanese' }, 1); expect(p.rows).toEqual([{ id: 'x123', url: 'https://aucfree.com/items/x123', title: 'テスト カード PSA10', priceJpy: 12345, bids: 3, endedOn: '2026年9月1日', image: 'https://img.aucfree.com/x123.1.jpg' }]); }); });