TypeScript 61.9%
HTML 37.2%
SQL 0.7%
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