SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
10 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
1.8 KB · 26 lines typescript
Raw Blame History
1import { describe, expect, it } from 'vitest';2import metaJson from './meta.json' with { type: 'json' };3import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';4import { localMeta } from '../_lib/local-meta.js';5import createConnector, { parseSearchPage } from './index.js';67const connector = createConnector(localMeta(metaJson));89describe('hifishark', () => {10  runFixtureSuite(connector, it, expect);1112  it('parses server-rendered for-sale rows', async () => {13    const html = `<ul id="result-tabs"><li class="nav-item"><a class="nav-link active">For Sale <span>(60)</span></a></li></ul><a href="/goto/152_abc/xyz" id="152_abc" class="d-flex align-items-center search-product-row"><div class="search-product-img"><span><img class="img-fluid lazy" src="/no.png" data-original="https://img/x.jpg"/></span></div><div class="search-product-info"><span class="search-product-title"><span>marantz 2270</span></span><span class="website"><img src="/_.gif" class="flag flag-it" title="Italy"/> Subito</span><span class="price"><strong>€850</strong></span><span class="first-seen" title="Listed">Aug 2, 2026</span></div></a>`;14    const p = parseSearchPage(html, 'u', 'Marantz 2270');15    expect(p.forSaleCount).toBe(60);16    expect(p.rows[0]).toMatchObject({ id: '152_abc', priceText: '€850', marketplace: 'Subito', countryIso: 'IT', firstSeen: 'Aug 2, 2026', image: 'https://img/x.jpg' });17    const fx = loadFixture('hifishark', 'marantz-2270');18    const out = await connector.normalize(fx.raw);19    expect(out.length).toBeGreaterThan(0);20    const l = out[0]!;21    if (l.kind !== 'listing') throw new Error('expected listing');22    expect(l.attributes).toMatchObject({ categorySlug: 'audio_equipment', brand: 'Marantz', model: '2270', name: 'Marantz 2270' });23    expect(out.some((r) => r.kind === 'listing' && r.price && r.currency)).toBe(true);24  });25});26