TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import { describe, expect, it } from 'vitest';2import type { NormalizedRecord } from '@rareindex/shared';3import { ConnectorMetaSchema } from '@rareindex/connectors';4import { listFixtures, loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';5import metaJson from './meta.json' with { type: 'json' };6import createConnector from './index.js';7import { goauctionPageUrl, parseGoauctionCalendar, parseGoauctionLots } from '../_g8-auctions-eu-apac-lib/goauction-platform.js';89const meta = ConnectorMetaSchema.parse(metaJson);10const connector = createConnector(meta);11const attrsOf = (r: NormalizedRecord) => {12 if (!('attributes' in r)) throw new Error(`record kind ${r.kind} has no attributes`);13 return r.attributes;14};15const HOUSE = { base: 'https://www.dominicwinter.co.uk', currency: 'GBP' as const, listStyle: 'search' as const };1617const CAL = `<div class="auction-calendar-item calendar-standard "> <a href='/Auction/Search?au=885&sd=2'> <div class="auction-calendar-image"> <img src="x" alt="Printed Books, Maps & Documents, Ornithology, Music Manuscripts, British & European Bookplates" /> </div> </a> <div class="auction-calendar-text "> <a href='/Auction/Search?au=885&sd=2'><H4>Printed Books, Maps & Documents</H4></a> <div><h5>Wednesday 28 January 2026</h5> <strong>Results: <a href="https://dominicwinter.bidpath.cloud/results-pdf/x.pdf">Download PDF results</a></strong></div></div></div>`;18const GRID = `<link rel="next" href="/Auction/Search/?au=885&sd=2&pn=2&g=1"/><div class='auction-grid agh'><div class='auction-grid-lot col-sm-6 col-md-4 col-lg-3'> <div class="auction-lot"> <span class="corner-flash corner-flash-sold auction-lot-sold">SOLD</span> <div class="auction-lot-image"> <a href="/Auction/Lot/lot-1---amedeo-luigi-on-the-polar-star-2-volumes-1903/?lot=425001&au=885&sd=1&pp=48&pn=1&g=1"> <img src="https://dominicwinter.goauction.co.uk/stock/722474-0-small.jpg?v=1" alt="Lot 1 - Amedeo (Luigi). On the "Polar Star", 2 volumes, 1903" /> </a> </div> <div class="auction-lot-text "> <p class="auction-lot-title"> <a href="/Auction/Lot/lot-1---amedeo-luigi-on-the-polar-star-2-volumes-1903/?lot=425001&au=885&sd=1"> <span class='lot-title cat-113'>Lot 1 - <span class="req-tag"></span>Amedeo (Luigi). On the "Polar Star", 2 volumes, 1903</span> </a> </p> <p></p> <p> <strong>Sold for £480</strong> </p> </div> </div> </div></div>`;1920describe('dominic-winter', () => {21 runFixtureSuite(connector, it, expect);2223 it('fixtures: GBP book results', async () => {24 let sales = 0;25 for (const name of listFixtures('dominic-winter')) {26 for (const r of await connector.normalize(loadFixture('dominic-winter', name).raw)) {27 if (!('attributes' in r)) continue;28 expect(r.attributes.identifiers.dominic_winter_lot).toMatch(/^\d+\/\S+$/);29 if (r.kind === 'sale') {30 sales++;31 expect(r.currency).toBe('GBP');32 expect(r.auctionHouse).toBe('Dominic Winter Auctioneers');33 }34 }35 }36 expect(sales).toBeGreaterThan(10);37 });3839 it('parses the /Auction/Search style calendar + grid ("Lot 1 - title")', async () => {40 const sales = parseGoauctionCalendar(CAL, HOUSE);41 expect(sales).toHaveLength(1);42 expect(sales[0]).toMatchObject({ id: '885', title: 'Printed Books, Maps & Documents', date: '2026-01-28T00:00:00.000Z', url: 'https://www.dominicwinter.co.uk/Auction/Search?au=885&sd=2' });43 expect(goauctionPageUrl(sales[0]!, 3, HOUSE)).toBe('https://www.dominicwinter.co.uk/Auction/Search?au=885&sd=2&pn=3&g=1');44 const p = parseGoauctionLots(GRID, sales[0]!, HOUSE)!;45 expect(p.hasMore).toBe(true);46 expect(p.lots[0]).toMatchObject({ lotNo: '1', title: 'Amedeo (Luigi). On the "Polar Star", 2 volumes, 1903', price: 480, currency: 'GBP', sold: true });47 const out = await connector.normalize({ url: sales[0]!.url, kind: 'sale', engine: 'api', fetchedAt: new Date(), payload: { kind: 'sale_results', url: sales[0]!.url, sale: sales[0]!, page: 1, totalLots: null, lots: p.lots } });48 expect(attrsOf(out[0]!).categorySlug).toBe('books');49 expect(attrsOf(out[0]!).year).toBe(1903);50 });51});52