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%
3.0 KB · 44 lines typescript
Raw Blame History
1import { describe, expect, it } from 'vitest';2import { ConnectorMetaSchema } from '@rareindex/connectors';3import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';4import metaJson from './meta.json' with { type: 'json' };5import createConnector, { parseCotePage, producerFromSlug } from './index.js';67const connector = createConnector(ConnectorMetaSchema.parse(metaJson));89describe('idealwine', () => {10  runFixtureSuite(connector, it, expect);1112  it('emits a catalog item + EUR guide_value observation per wine vintage', async () => {13    const fx = loadFixture('idealwine', 'bordeaux-page-1');14    const out = await connector.normalize(fx.raw);15    const obs = out.filter((r) => r.kind === 'price_observation');16    const items = out.filter((r) => r.kind === 'catalog_item');17    expect(obs.length).toBe(items.length);18    expect(obs.length).toBeGreaterThan(20);19    for (const r of obs) {20      if (r.kind !== 'price_observation') continue;21      expect(r.currency).toBe('EUR');22      expect(r.priceKind).toBe('guide_value');23      expect(r.price).toBeGreaterThan(0);24      expect(r.attributes.categorySlug).toBe('wine');25      expect(r.attributes.set).toBeTruthy();26      expect(r.attributes.identifiers.idealwine_ref).toMatch(/^\d+-/);27      expect(r.sourceUrl).toMatch(/^https:\/\/www\.idealwine\.com\/en\/wine-prices\//);28    }29  });3031  it('parses cards and producer slugs', () => {32    const html = `<div class="cote_gridItem___dC3b"><div class="cote_breadCrumpRegion__xzjeq">Bordeaux<!-- --> &gt; Pessac-Léognan</div><div class="cote_nameWine__v1UwE">Abeille de Fieuzal<!-- --> <span class="cote_colorDisplay__VWf8N">(<!-- -->Red<!-- -->)</span></div><img src="https://www.idealwine.com/media/x.jpg"/><div class="VintageRatingsCards_container__m_TZj"><a href="/en/wine-prices/120055-2021-Bottle-Bordeaux-Pessac-Leognan-Chateau-de-Fieuzal-red"><div class="VintageRatingsCards_cote__H0Z2A">2021<!-- --> <span><span class="Price_units__UHpM6">€<!-- -->13</span></span></div></a><a href="/en/wine-prices/120055-2020-Bottle-Bordeaux-Pessac-Leognan-Chateau-de-Fieuzal-red"><div class="VintageRatingsCards_cote__H0Z2A">2020 <span><span>€1,250</span></span></div></a></div></div><a href="/en/cote/bordeaux?page=58">58</a>`;33    const p = parseCotePage(html, 'u', 'bordeaux', 1);34    expect(p.totalPages).toBe(58);35    expect(p.wines).toHaveLength(1);36    expect(p.wines[0]).toMatchObject({ wineId: '120055', name: 'Abeille de Fieuzal', color: 'Red', region: 'Bordeaux', appellation: 'Pessac-Léognan' });37    expect(p.wines[0]!.vintages).toEqual([38      { vintage: 2021, priceEur: 13, url: 'https://www.idealwine.com/en/wine-prices/120055-2021-Bottle-Bordeaux-Pessac-Leognan-Chateau-de-Fieuzal-red', ref: '120055-2021' },39      { vintage: 2020, priceEur: 1250, url: 'https://www.idealwine.com/en/wine-prices/120055-2020-Bottle-Bordeaux-Pessac-Leognan-Chateau-de-Fieuzal-red', ref: '120055-2020' },40    ]);41    expect(producerFromSlug('Bordeaux-Pessac-Leognan-Chateau-de-Fieuzal-red')).toBe('Bordeaux Pessac Leognan Chateau de Fieuzal');42  });43});44