Files
i/server/test/challenge.test.js
T
wsh5485 65b0bb04f8 feat: import CarLog v2.8 code + dev plan
把 CarLog v2.8 全套源码 + 配置导入到 i 仓库作为 baseline:
- server/src/ (13 个路由 + middleware + services + config)
- server/migrations/ (0001~0018 共 18 个迁移 + mysql)
- server/test/ (12 文件 101 测试)
- client/src/ (20 个 view + components + stores + api + composables)
- client/public/ + client/scripts/
- 全部配置文件 (.editorconfig, .eslintrc.json, .prettierrc.json, vitest.config.js, lighthouserc.json, .pa11yci.json, package.json, carlog-init.sql)
- .husky/pre-commit (git hooks)
- docs/install/ (宝塔部署文档)

不含:
- node_modules/ (本地 npm install)
- .env (敏感, 走 .env.example)
- *.zip / *.log / *.sqlite / .DS_Store

新增文档 docs/DEV-PLAN.md:
- Phase 1: 平台基座 (019 migration + 3 个 platform 路由 + 3 个 view)
- Phase 2: CarLog 子系统化 (后端 routes/ → subsystems/carlog/ + 前端 views/ → views/subsystems/carlog/ + 元数据驱动菜单)
- Phase 3: 验证 (测试 + E2E + DB 完整性)
- 交付清单 + commit 模板 + 给 Mavis review 的材料

后续 Trae 实施, 提交后我 code review + 跑测试。
2026-06-20 22:30:19 +08:00

64 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// server/test/challenge.test.js
import { describe, it, expect } from 'vitest';
import { verifyChallenge } from '../src/services/challenge.js';
describe('verifyChallenge()', () => {
it('加法正确', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: 8 })).toBe(true);
});
it('加法错误', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: 7 })).toBe(false);
});
it('减法正确(含负数)', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '-', answer: -2 })).toBe(true);
});
it('乘法正确', () => {
expect(verifyChallenge({ a: 4, b: 6, op: '*', answer: 24 })).toBe(true);
});
it('answer 是字符串数字也能通过', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: '8' })).toBe(true);
});
it('answer 是非数字 → 拒绝', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: 'abc' })).toBe(false);
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: null })).toBe(false);
expect(verifyChallenge({ a: 3, b: 5, op: '+', answer: undefined })).toBe(false);
});
it('a/b 是非数字 → 拒绝', () => {
expect(verifyChallenge({ a: 'x', b: 5, op: '+', answer: 5 })).toBe(false);
// b=null 会被 Number(null)=03+0=3=answer 3 → 实际算"合法",非 bug
// 我们用更明确的 NaN 来验证
expect(verifyChallenge({ a: 3, b: 'abc', op: '+', answer: 3 })).toBe(false);
});
it('非法 op → 拒绝', () => {
expect(verifyChallenge({ a: 3, b: 5, op: '/', answer: 0.6 })).toBe(false);
expect(verifyChallenge({ a: 3, b: 5, op: '**', answer: 243 })).toBe(false);
expect(verifyChallenge({ a: 3, b: 5, op: '', answer: 8 })).toBe(false);
});
it('challenge 是 null/undefined → 拒绝', () => {
expect(verifyChallenge(null)).toBe(false);
expect(verifyChallenge(undefined)).toBe(false);
expect(verifyChallenge('string')).toBe(false);
});
it('a/b 字符串数字 → 也能算', () => {
expect(verifyChallenge({ a: '3', b: '5', op: '+', answer: 8 })).toBe(true);
});
it('空对象 → 拒绝', () => {
expect(verifyChallenge({})).toBe(false);
});
it('缺失字段 → 拒绝', () => {
expect(verifyChallenge({ a: 3, b: 5, answer: 8 })).toBe(false); // 缺 op
expect(verifyChallenge({ a: 3, op: '+', answer: 3 })).toBe(false); // 缺 b
});
});