import { describe, expect, it } from 'vitest'; import type { NormalizedRecord } from '@rareindex/shared'; import { ConnectorMetaSchema } from '@rareindex/connectors'; import { listFixtures, loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import metaJson from './meta.json' with { type: 'json' }; import createConnector from './index.js'; import { goauctionPageUrl, parseGoauctionCalendar, parseGoauctionLots, parseUkDate } from '../_g8-auctions-eu-apac-lib/goauction-platform.js'; const meta = ConnectorMetaSchema.parse(metaJson); const connector = createConnector(meta); const attrsOf = (r: NormalizedRecord) => { if (!('attributes' in r)) throw new Error(`record kind ${r.kind} has no attributes`); return r.attributes; }; const HOUSE = { base: 'https://www.sworder.co.uk', currency: 'GBP' as const, listStyle: 'details' as const }; const CAL = `
Open House

Open House

Tuesday 1 September - Monday 7 September 2026

Timed Online | Bidding closes on Monday from 7pm

Sale number: A1320
Design

Design

Tuesday 21 April 2026
Sale number: A1277
`; const GRID = `
`; describe('sworders', () => { runFixtureSuite(connector, it, expect); it('fixtures: GBP "Sold for" results, premium basis unknown', async () => { let sales = 0; for (const name of listFixtures('sworders')) { for (const r of await connector.normalize(loadFixture('sworders', name).raw)) { if (!('attributes' in r)) continue; expect(r.attributes.identifiers.sworders_lot).toMatch(/^\d+\/\S+$/); expect(r.sourceUrl).toMatch(/^https:\/\/www\.sworder\.co\.uk\//); if (r.kind === 'sale') { sales++; expect(r.currency).toBe('GBP'); expect(r.buyerPremiumIncluded).toBeNull(); expect(r.auctionHouse).toBe('Sworders'); } } } expect(sales).toBeGreaterThan(10); }); it('parses the results calendar (single dates and ranges) and the lot grid', async () => { const sales = parseGoauctionCalendar(CAL, HOUSE); expect(sales.map((s) => s.id)).toEqual(['1367', '1306']); expect(sales[0]).toMatchObject({ title: 'Open House', date: '2026-09-01T00:00:00.000Z', url: 'https://www.sworder.co.uk/auction/details/a1320-open-house?au=1367' }); expect(sales[0]!.extra).toMatchObject({ sale_number: 'A1320', timed: true }); expect(sales[1]!.date).toBe('2026-04-21T00:00:00.000Z'); expect(parseUkDate('20th August 2026')).toBe('2026-08-20T00:00:00.000Z'); expect(parseUkDate('nonsense')).toBeNull(); expect(goauctionPageUrl(sales[1]!, 2, HOUSE)).toBe('https://www.sworder.co.uk/auction/details/a1277-design?au=1306&g=1&pn=2'); const p = parseGoauctionLots(GRID, sales[1]!, HOUSE)!; expect(p.hasMore).toBe(true); expect(p.lots).toHaveLength(2); expect(p.lots[0]).toMatchObject({ lotNo: '2', title: 'Børge Mogensen (Danish, 1914-1972) for P Lauritsen & Søn', subtitle: 'a teak desk,', price: 1800, currency: 'GBP', premiumIncluded: null, sold: true, image: 'https://sworders.goauction.co.uk/stock/682769-2-small.jpg?v=1', url: 'https://www.sworder.co.uk/auction/lot/lot-2---brge-mogensen/?lot=565336&au=1306&sd=1&pp=96&pn=1&g=1' }); expect(p.lots[1]).toMatchObject({ lotNo: '3', price: null, sold: false }); const out = await connector.normalize({ url: sales[1]!.url, kind: 'sale', engine: 'api', fetchedAt: new Date(), payload: { kind: 'sale_results', url: sales[1]!.url, sale: sales[1]!, page: 1, totalLots: null, lots: p.lots } }); expect(out.map((r) => r.kind)).toEqual(['sale', 'auction_lot']); expect(attrsOf(out[0]!).categorySlug).toBe('design_furniture'); expect(attrsOf(out[1]!).categorySlug).toBe('rolex'); expect(attrsOf(out[1]!).reference).toBe('16233'); expect(parseGoauctionLots('none', sales[1]!, HOUSE)).toBeNull(); }); });