Files
doodle-store/apps/server/test/worksheet-import.test.ts
T

63 lines
2.3 KiB
TypeScript

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));
});