import { describe, expect, it } from 'vitest'; import { getConnectorMeta } from '@rareindex/connectors'; import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import createConnector, { parseGoldinDisplayDate, parseGoldinGrade, soldPageUrl } from './index.js'; import { classifyGoldinTitle, isBundleTitle, parseCardAttributes } from './classify.js'; const connector = createConnector(getConnectorMeta('goldin')); describe('goldin connector', () => { runFixtureSuite(connector, it, expect); it('applies buyer premium and keeps the hammer price', async () => { const fx = loadFixture('goldin', 'pokemon-sold-page'); const out = await connector.normalize(fx.raw); const lot = (fx.raw.payload as { lots: Array<{ lot_id: string; current_price: number; buyer_premium: number; title: string; end_timestamp: string }> }).lots[0]!; const rec = out.find((r) => r.kind === 'sale' && r.externalId === lot.lot_id); expect(rec && rec.kind === 'sale').toBe(true); if (!rec || rec.kind !== 'sale') return; expect(rec.price).toBeCloseTo(lot.current_price * (1 + lot.buyer_premium / 100), 2); expect(rec.buyerPremiumIncluded).toBe(true); expect(rec.attributes.metadata.hammer_price).toBe(lot.current_price); expect(rec.saleDate.toISOString().slice(0, 19)).toBe(new Date(lot.end_timestamp).toISOString().slice(0, 19)); expect(rec.currency).toBe('USD'); expect(rec.auctionHouse).toBe('Goldin'); expect(rec.sourceUrl).toMatch(/^https:\/\/goldin\.co\/item\//); expect(rec.attributes.categorySlug).toBe('pokemon'); }); it('extracts grades from Goldin titles', async () => { const fx = loadFixture('goldin', 'pokemon-sold-page'); const out = await connector.normalize(fx.raw); const graded = out.flatMap((r) => (r.kind === 'sale' && /PSA GEM MT 10/.test(r.rawTitle) ? [r] : [])); expect(graded.length).toBeGreaterThan(0); for (const g of graded) expect(g.grade).toMatchObject({ grader: 'psa', grade: '10' }); }); it('skips placeholder future end dates and unsold lots', async () => { const fx = loadFixture('goldin', 'pokemon-sold-page'); const payload = structuredClone(fx.raw.payload) as { lots: Array> }; const keepId = payload.lots[0]!.lot_id; payload.lots = [ { ...payload.lots[0]!, lot_id: 'future', end_timestamp: '2235-06-04T00:00:00Z' }, { ...payload.lots[0]!, lot_id: 'unsold', status: 'Completed_Unsold' }, { ...payload.lots[0]!, lot_id: 'zero', current_price: 0 }, payload.lots[0]!, ]; const out = await connector.normalize({ ...fx.raw, payload }); expect(out.map((r) => (r.kind === 'sale' ? r.externalId : null))).toEqual([keepId]); }); it('normalises a sold item page (lookup) with cert number', async () => { const fx = loadFixture('goldin', 'item-sold-page'); const out = await connector.normalize(fx.raw); expect(out.length).toBe(1); const r = out[0]!; expect(r.kind).toBe('sale'); if (r.kind !== 'sale') return; expect(r.price).toBe(25726); expect(r.attributes.metadata.hammer_price).toBe(21438); expect(r.saleDate.toISOString()).toBe('2012-11-18T02:16:00.000Z'); expect(r.buyerPremiumIncluded).toBe(true); }); it('helpers', () => { expect(parseGoldinGrade('2019 Pokemon Sun & Moon Team Up #33 Pikachu & Zekrom GX Tag Team - PSA GEM MT 10')).toMatchObject({ grader: 'psa', grade: '10' }); expect(parseGoldinGrade('2003-04 Topps Chrome #111 LeBron James Rookie Card')).toMatchObject({ grader: null, grade: null }); expect(soldPageUrl('/buy/sc/pokemon', 2, 240)).toBe('https://goldin.co/buy/sc/pokemon?page=2&number_of_lots=240&show_only=Sold%20Items&sort=Most_Recent_Bids'); expect(parseGoldinDisplayDate('Sat, 11/17/12, 10:16 PM EDT')?.toISOString()).toBe('2012-11-18T02:16:00.000Z'); expect(parseGoldinDisplayDate('Sun, 9/06/26, 9:02 PM PDT')?.toISOString()).toBe('2026-09-07T04:02:00.000Z'); expect(classifyGoldinTitle('2003-04 Topps Chrome #111 LeBron James Rookie Card - PSA GEM MT 10', { path: '/buy/sc/Basketball', categorySlug: 'basketball_cards', sport: 'basketball' })).toBe('basketball_cards'); expect(classifyGoldinTitle('1994-95 Patrick Ewing Game Used New York Knicks Home Jersey (Beckett)', { path: '/buy/sc/Basketball', categorySlug: 'basketball_cards', sport: 'basketball' })).toBe('sports_memorabilia'); expect(classifyGoldinTitle('Amazing Spider-Man #300 (1988 Marvel) - CGC 9.8', { path: '/buy/sc/Marvel', categorySlug: 'marvel_comics' })).toBe('marvel_comics'); expect(isBundleTitle('1993 Magic: The Gathering Unlimited Collection (250+)')).toBe(true); expect(isBundleTitle('2000 Pokemon Black Star Promo #23 Zapdos - PSA GEM MT 10')).toBe(false); const a = parseCardAttributes('2000 Pokemon Black Star Promo #23 Zapdos - PSA GEM MT 10', 'pokemon'); expect(a).toMatchObject({ brand: 'Pokemon', set: 'Black Star Promo', number: '23', name: 'Zapdos' }); const b = parseCardAttributes('2003-04 Topps Chrome #111 LeBron James Rookie Card - PSA GEM MT 10', 'basketball_cards'); expect(b.brand).toBe('Topps Chrome'); expect(b.number).toBe('111'); expect(b.name).toMatch(/^LeBron James/); }); });