// 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)=0,3+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 }); });