import { describe, expect, it } from 'vitest'; import metaJson from './meta.json' with { type: 'json' }; import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; import { localMeta } from '../_lib/local-meta.js'; import { conditionFromParens, normalizeConditionWord } from '../_g10-lib/index.js'; import createConnector, { pageUrl, parseCategoryHtml, parsePenTitle } from './index.js'; const connector = createConnector(localMeta(metaJson)); describe('peyton-street-pens', () => { runFixtureSuite(connector, it, expect); it('parses BigCommerce product cards and pagination', () => { const html = String((loadFixture('peyton-street-pens', 'parker-p1').raw.payload as { snapshot?: string }).snapshot ?? ''); const p = parseCategoryHtml(html); expect(p.cards.length).toBeGreaterThanOrEqual(2); const c = p.cards[0]!; expect(c.url).toMatch(/^https:\/\/www\.peytonstreetpens\.com\/.+\.html$/); expect(c.sku).toMatch(/^\d+/); expect(c.price).toBeGreaterThan(0); expect(c.image).toMatch(/cdn11\.bigcommerce\.com/); expect(p.totalPages).toBeGreaterThan(1); expect(pageUrl('/pens-by-brand/parker/', 2)).toBe('https://www.peytonstreetpens.com/pens-by-brand/parker/?page=2'); }); it('parses pen titles, conditions and eras', () => { const t = parsePenTitle('Sheaffer Craftsman Fountain Pen & Pencil Set (1950s) - Burgundy w/GT, Touchdown, Fine 14k #33 Nib (Near Mint, Restored)', 'PEN SET'); expect(t.brand).toBe('Sheaffer'); expect(t.model).toBe('Craftsman'); expect(t.penType).toBe('fountain pen'); expect(t.variant).toMatch(/^Burgundy w\/GT/); const cond = conditionFromParens('Parker 51 Aerometric Fountain Pen (1950s) - Black w/Lustraloy Cap, Fine (Excellent, Works Well)'); expect(cond).toBe('Excellent, Works Well'); expect(normalizeConditionWord(cond)).toBe('excellent'); expect(normalizeConditionWord('Near Mint, Restored')).toBe('near_mint'); const m = parsePenTitle('Montblanc Meisterstuck 149 Fountain Pen - Black w/GT, Medium 18k Nib (Excellent, Works Well)', 'MONTBLANC'); expect(m.brand).toBe('Montblanc'); expect(m.model).toBe('Meisterstuck 149'); }); it('normalises cards into USD dealer listings (pens only, accessories skipped)', async () => { const fx = loadFixture('peyton-street-pens', 'parker-p1'); const out = await connector.normalize(fx.raw); expect(out.length).toBeGreaterThan(0); for (const r of out) { if (r.kind !== 'listing') throw new Error('expected listing'); expect(r.currency).toBe('USD'); expect(r.price).toBeGreaterThan(0); expect(['pens', 'lighters']).toContain(r.attributes.categorySlug); expect(r.seller).toBe('Peyton Street Pens'); expect(r.attributes.brand).toBeTruthy(); } }); });