vending-machine/mobile/__tests__/qrcode.property.test.js
2026-04-08 20:45:41 +08:00

37 lines
1.4 KiB
JavaScript
Raw Permalink 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.

import { describe, it, expect } from 'vitest'
import * as fc from 'fast-check'
import { generateQRCodeData, verifyQRCodeData } from '../utils/qrcode.js'
describe('Property 8: 二维码生成Round-Trip', () => {
/**
* **Feature: mobile-app, Property 8: 二维码生成Round-Trip**
* **Validates: Requirements 4.1**
*
* 对于任意有效的token字符串生成二维码后解码应得到与原始token相同的字符串。
* 由于uQRCode不支持解码我们通过重新编码并比较模块数据来验证一致性
* 相同的token输入应始终产生相同的二维码模块数据。
*/
it('相同token生成的二维码模块数据应完全一致确定性', () => {
// 生成可被QR编码的ASCII字符串
const tokenArb = fc.string({ minLength: 1, maxLength: 200 })
.filter(s => s.trim().length > 0)
fc.assert(
fc.property(tokenArb, (token) => {
const qrData = generateQRCodeData(token)
// 验证生成的数据结构正确
expect(qrData).toHaveProperty('modules')
expect(qrData).toHaveProperty('moduleCount')
expect(qrData.moduleCount).toBeGreaterThan(0)
expect(qrData.modules.length).toBe(qrData.moduleCount)
// 验证Round-Trip重新编码相同token应产生相同结果
const verified = verifyQRCodeData(token, qrData)
expect(verified).toBe(true)
}),
{ numRuns: 100 }
)
})
})