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.9 KB · 81 lines typescript
Raw Blame History
1import { describe, expect, it } from 'vitest';2import meta from './meta.json' with { type: 'json' };3import { localMeta } from '../../api/_lib/local-meta.js';4import { listFixtures, loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';5import createConnector, { auctionStatus, parseTitlePage, yearOfPublished, type PagePayload } from './index.js';6import { parseComicGrade, parseLabelNumber } from '../../api/_g6-comics-toys-games-lib/comics.js';78const connector = createConnector(localMeta(meta));910describe('mycomicshop', () => {11  runFixtureSuite(connector, it, expect);1213  it('parses issue blocks and schema.org stock rows from the saved title page', () => {14    const fx = loadFixture('mycomicshop', 'tid-78991');15    const p = fx.raw.payload as PagePayload;16    const parsed = parseTitlePage(p.snapshot!, fx.raw.url, '78991');17    expect(parsed.title).toContain('Amazing Spider-Man');18    expect(parsed.issues.length).toBeGreaterThanOrEqual(1);19    const blk = parsed.issues[0]!;20    expect(blk.seriesTitle).toBe('Amazing Spider-Man (1963 1st Series)');21    expect(blk.tid).toBe('78991');22    expect(blk.publisher).toBe('Marvel');23    expect(blk.issue).toMatch(/^-?\d+/);24    expect(blk.items.length).toBeGreaterThan(0);25    for (const it of blk.items) {26      expect(it.itemId).toMatch(/^\d+$/);27      expect(it.url).toContain(`ItemID=${it.itemId}`);28      if (!it.auction) expect(it.priceMicro ?? it.priceShown).toBeGreaterThan(0);29    }30  });3132  it('extracts CGC/CBCS certification numbers, consignment premiums and auction rows across fixtures', async () => {33    let certs = 0;34    let consignments = 0;35    let auctions = 0;36    for (const name of listFixtures('mycomicshop')) {37      const out = await connector.normalize(loadFixture('mycomicshop', name).raw);38      for (const r of out) {39        if (r.kind === 'listing') {40          expect(r.currency).toBe('USD');41          expect(r.price).toBeGreaterThan(0);42          expect(r.attributes.categorySlug).toMatch(/_comics$/);43          expect(r.attributes.brand).toBeTruthy();44          expect(r.attributes.number).toBeTruthy();45          if (r.grade.certificationNumber) {46            certs++;47            expect(['cgc', 'cbcs', 'pgx']).toContain(r.grade.grader);48            expect(r.grade.grade).toMatch(/^\d/);49          }50          if (r.attributes.metadata.consignment) {51            consignments++;52            expect(r.attributes.metadata.buyer_premium_pct).toBe(3);53            expect(r.seller).toMatch(/Consignment/);54          }55        } else if (r.kind === 'auction_lot') {56          auctions++;57          expect(r.auctionHouse).toBe('MyComicShop');58          expect(['upcoming', 'live', 'unknown']).toContain(r.status);59        } else throw new Error(`unexpected kind ${r.kind}`);60      }61    }62    expect(certs).toBeGreaterThan(0);63    expect(consignments).toBeGreaterThan(0);64    expect(auctions).toBeGreaterThan(0);65  });6667  it('parses grades, labels and published years in the store vocabulary', () => {68    expect(parseComicGrade('CGC 9.6')).toMatchObject({ grader: 'cgc', grade: '9.6' });69    expect(parseComicGrade('CBCS 9.6')).toMatchObject({ grader: 'cbcs', grade: '9.6' });70    expect(parseComicGrade('FN 6.0')).toMatchObject({ grader: 'raw', grade: '6.0', label: 'FN' });71    expect(parseComicGrade('Fine')).toMatchObject({ grader: 'raw', grade: null, label: 'Fine' });72    expect(parseLabelNumber('Paper: White | Label #4013069001 | Consignment. 3% buyer\'s premium')).toBe('4013069001');73    expect(parseLabelNumber('Label #16-19B5702-003')).toBe('16-19B5702-003');74    expect(parseLabelNumber('Paper: Off white')).toBeNull();75    expect(yearOfPublished('May 1988')).toBe(1988);76    expect(yearOfPublished(null)).toBeNull();77    expect(auctionStatus({ currentBid: 11, bids: 4, timeLeft: '6d 16h 3m', opens: null })).toBe('live');78    expect(auctionStatus({ currentBid: null, bids: null, timeLeft: null, opens: 'September 14' })).toBe('upcoming');79  });80});81