import assert from 'node:assert/strict'; import { readFile } from 'node:fs/promises'; import test from 'node:test'; import { jdVocScorePayloadSchema } from '../src/modules/listing-ai/schemas.js'; const fixture = JSON.parse(await readFile(new URL('./fixtures/jd-voc-score-result.json', import.meta.url), 'utf8')) as Record; test('jd-voc payload accepts the versioned six-dimension fixture', () => { const result = jdVocScorePayloadSchema.safeParse(fixture); assert.equal(result.success, true, result.success ? '' : result.error.message); if (result.success) assert.equal(result.data.dimensions.length, 6); }); test('jd-voc payload rejects legacy rubric versions and unknown statuses', () => { const wrongVersion = { ...fixture, rubricVersion: 'JD-VOC v0.5-evidence-calibrated' }; const wrongStatus = { ...fixture, dimensions: (fixture.dimensions as Array>).map((item, index) => index === 0 ? { ...item, status: 'unknown' } : item), }; assert.equal(jdVocScorePayloadSchema.safeParse(wrongVersion).success, false); assert.equal(jdVocScorePayloadSchema.safeParse(wrongStatus).success, false); }); test('jd-voc payload rejects null dimensions encoded as zero and out-of-range scores', () => { const dimensions = fixture.dimensions as Array>; const nullAsScored = { ...fixture, dimensions: dimensions.map((item, index) => index === 3 ? { ...item, score: null, status: 'scored' } : item) }; const overMax = { ...fixture, dimensions: dimensions.map((item, index) => index === 0 ? { ...item, score: 26 } : item) }; const badHash = { ...fixture, sourceHash: 'not-a-source-hash' }; assert.equal(jdVocScorePayloadSchema.safeParse(nullAsScored).success, false); assert.equal(jdVocScorePayloadSchema.safeParse(overMax).success, false); assert.equal(jdVocScorePayloadSchema.safeParse(badHash).success, false); }); test('jd-voc payload remains strict about the six unique dimension keys', () => { const dimensions = fixture.dimensions as Array>; const duplicate = { ...fixture, dimensions: dimensions.map((item, index) => index === 5 ? { ...item, key: 'search' } : item) }; assert.equal(jdVocScorePayloadSchema.safeParse(duplicate).success, false); });