import assert from 'node:assert/strict'; import { test } from 'node:test'; import { parseWorksheetExport } from '../src/imports/worksheet-import'; import { worksheetFixture as fixture } from './worksheet-import.fixture'; test('题型导入:JSON Lines、BSON 日期、计数和缺省字段准确保留', () => { const row = { ...fixture, grade: 23, downloads_seed: undefined, contentUpdatedAt: { $date: '2026-06-01T08:00:00+08:00' }, }; const result = parseWorksheetExport(`\uFEFF${JSON.stringify(row)}\n`); const stored = result.rows[0]!.data; assert.equal(stored.downloads, 23n); assert.equal(stored.downloadsSeed, 0n); assert.equal(stored.likesSeed, 14n); assert.equal(stored.grade, 23); assert.equal(stored.subcategory, null); assert.equal(stored.createdAt.toISOString(), fixture.createdAt.$date); assert.equal( stored.contentUpdatedAt?.toISOString(), '2026-06-01T00:00:00.000Z', ); assert.equal(stored.firstPublishedAt, null); assert.equal(stored.rendererKey, null); assert.equal(result.warnings.length, 2); assert.equal( parseWorksheetExport(JSON.stringify([fixture])).rows[0]?.data.path, fixture.path, ); }); test('题型导入:拒绝未知字段、重复 ID、非法日期、类型及计数精度丢失', () => { for (const patch of [ { unknown: true }, { title: 42 }, { category: null }, { difficulty: 0 }, { ageMax: 1 }, { tags: ['a', 1] }, { isNew: 'false' }, { downloads: -1 }, { downloads: Number.MAX_SAFE_INTEGER + 1 }, { grade: 32768 }, { status: 'deleted' }, { previewImg: 'https://example.com/a.jpg' }, { createdAt: { $date: '2026-02-30T00:00:00Z' } }, { createdAt: { $date: '2026-01-01' } }, { createdAt: null }, { createdAt: { $date: fixture.createdAt.$date, injected: true } }, { updatedAt: { $date: '2025-01-01T00:00:00Z' } }, ]) assert.throws(() => parseWorksheetExport(JSON.stringify([{ ...fixture, ...patch }])), ); assert.throws(() => parseWorksheetExport(JSON.stringify([fixture, fixture])), ); for (const value of ['', '[]', '{}', '{broken']) assert.throws(() => parseWorksheetExport(value)); });