TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import { describe, expect, it } from 'vitest';2import { readFileSync } from 'node:fs';3import path from 'node:path';4import { fileURLToPath } from 'node:url';5import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing';6import { localMeta } from '../_lib/local-meta.js';7import createConnector, { nkCategory, parseProduct } from './index.js';89const dir = path.dirname(fileURLToPath(import.meta.url));10const meta = localMeta(JSON.parse(readFileSync(path.join(dir, 'meta.json'), 'utf8')));11const connector = createConnector(meta);1213const PAGE = `<html><head><script type="application/ld+json">{"@context":"https://schema.org/","@type":"Product","name":"Catan (5th Edition)","image":["https://image.nobleknight.com/g/jpg240/catan.jpg"],"description":"Catan - Catan Studio","sku":"2147354979","mpn":"CN3071","brand":{"@type":"Brand","name":"Catan Studio"},"offers":{"@type":"Offer","url":"https://www.nobleknight.com/P/2147354979/Catan","priceCurrency":"USD","price":"44.95","itemCondition":"https://schema.org/NewCondition","availability":"https://schema.org/InStock"}}</script></head>14<body><div class="info-line"><div class="label"><span>Publisher</span></div><div class="value"><a href="/publisher/catan-studio">Catan Studio</a></div></div>15<div class="info-line"><div class="label"><span>Product Line</span></div><div class="value"><a href="/Products/Catan">Catan</a></div></div>16<div class="info-line"><div class="label"><span>Category</span></div><div class="value"><a href="/main-category/boardgames">Board Games</a></div></div>17<div class="conditions">Condition: SW (MINT/New)</div></body></html>`;1819describe('noble-knight', () => {20 runFixtureSuite(connector, it, expect);2122 it('parses product JSON-LD and info lines', () => {23 const p = parseProduct(PAGE, 'https://www.nobleknight.com/P/2147354979/Catan')!;24 expect(p).toMatchObject({ nkId: '2147354979', name: 'Catan (5th Edition)', mpn: 'CN3071', brand: 'Catan Studio', price: 44.95, currency: 'USD', itemCondition: 'NewCondition', availability: 'InStock', publisher: 'Catan Studio', productLine: 'Catan', category: 'Board Games' });25 expect(nkCategory(p)).toBe('board_games');26 expect(nkCategory({ ...p, category: 'Miniatures', productLine: 'Warhammer 40,000', publisher: 'Games Workshop' })).toBe('warhammer');27 expect(nkCategory({ ...p, category: 'Role Playing Games', productLine: 'D&D' })).toBeNull();28 });2930 it('normalises to a catalog item + listing with a boxed_toys condition', async () => {31 const p = parseProduct(PAGE, 'https://www.nobleknight.com/P/2147354979/Catan')!;32 const out = await connector.normalize({ url: p.url, externalId: p.nkId, kind: 'listing', engine: 'api', fetchedAt: new Date('2026-09-07T00:00:00Z'), payload: { kind: 'product_page', product: p } });33 expect(out.map((r) => r.kind)).toEqual(['catalog_item', 'listing']);34 const l = out[1]!;35 if (l.kind !== 'listing') throw new Error('listing');36 expect(l).toMatchObject({ price: 44.95, currency: 'USD', availability: 'available' });37 expect(l.condition.condition).toBe('mint_in_box');38 expect(l.attributes.identifiers).toMatchObject({ nobleknight_id: '2147354979', mpn: 'CN3071' });39 });4041 it('fixtures normalise', async () => {42 const out = await connector.normalize(loadFixture('noble-knight', 'board-game').raw);43 expect(out.length).toBe(2);44 });45});46