37 lines
1.4 KiB
JavaScript
37 lines
1.4 KiB
JavaScript
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 }
|
||
)
|
||
})
|
||
})
|