YD_Event.Web/scripts/website-competition-response-test.mjs
ltx 9d07d9eb51 feat(website): 增加官网赛事信息管理与 Excel 模板
新增隐藏的官网赛事信息后台路由和编辑页面。支持从 Excel 拖拽或选择导入草稿、下载完整示例及当前数据,维护中英文赛事信息、公告、当前/检录场次、赛程与发布状态;通过已有 /api/website-competition 接口加载和保存,失败时提供重试与提示。

新增 Excel 工作簿生成与解析:覆盖赛事设置、赛程、全能/挑战/Battle 成绩、选手和纪录,并校验表头、编号及淘汰赛数据;兼容旧模板和 Excel 时间单元格。新增接口响应解包及工作簿往返、错误场景测试。

验证:node scripts/website-competition-response-test.mjs、node scripts/website-competition-workbook-test.mjs、npm run build:local 与 git diff --cached --check 均通过。此提交只含前端;运行时依赖后端 /api/website-competition 及其服务端密钥配置。
2026-10-19 15:58:41 +08:00

23 lines
1.0 KiB
JavaScript

import assert from 'node:assert/strict';
import { isCompetitionState, unwrapCompetitionResponse } from '../src/views/website/competition/response.mjs';
const state = {
published: false,
competition: {},
notice: {},
schedule: { items: [] },
results: { overall: [], challenge: [], battle: [] },
players: [],
records: [],
};
assert.deepEqual(unwrapCompetitionResponse(state), state);
assert.deepEqual(unwrapCompetitionResponse({ statusCode: 200, data: state }), state);
assert.deepEqual(unwrapCompetitionResponse({ statusCode: 200, data: JSON.stringify(state) }), state);
assert.equal(isCompetitionState(unwrapCompetitionResponse({ statusCode: 200, data: JSON.stringify(state) })), true);
assert.equal(isCompetitionState({ statusCode: 200, data: state }), false);
assert.throws(() => unwrapCompetitionResponse({ statusCode: 401, errors: '401 Unauthorized' }), /401 Unauthorized/);
assert.throws(() => unwrapCompetitionResponse({ statusCode: 200, data: 'invalid JSON' }), /JSON 格式不正确/);
console.log('官网赛事接口响应解包与数据校验通过');