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

98 lines
3.1 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.

import { describe, it, expect, vi } from 'vitest'
import * as fc from 'fast-check'
/**
* 优惠券页属性测试
*
* Property 12: 优惠券Tab状态参数正确性
* Property 13: 优惠券状态标识显示正确性
*/
// Tab到API status参数的映射与 pages/coupons/coupons.vue 逻辑一致)
const TAB_STATUS_MAP = {
available: 'available',
used: 'used',
expired: 'expired'
}
// 优惠券状态标识解析逻辑(与页面模板逻辑一致)
function resolveCouponStatusBadge(status) {
if (status === 'used') return { show: true, label: 'used' }
if (status === 'expired') return { show: true, label: 'expired' }
return { show: false, label: null }
}
describe('Property 12: 优惠券Tab状态参数正确性', () => {
/**
* **Feature: mobile-app, Property 12: 优惠券Tab状态参数正确性**
* **Validates: Requirements 9.2**
*
* 对于任意Tab切换操作可使用/已使用/已过期),
* API请求中的status参数应分别对应"available"、"used"、"expired"。
*/
it('切换Tab时API请求的status参数应与Tab对应', async () => {
const tabArb = fc.constantFrom('available', 'used', 'expired')
await fc.assert(
fc.asyncProperty(tabArb, async (tab) => {
let requestedStatus = null
// 模拟getMyCoupons捕获传入的status参数
const mockGetMyCoupons = vi.fn(async (status) => {
requestedStatus = status
return { data: [] }
})
// 模拟切换Tab后的加载逻辑
const currentTab = tab
await mockGetMyCoupons(currentTab)
// 验证请求的status参数应等于Tab对应的值
expect(requestedStatus).toBe(TAB_STATUS_MAP[tab])
}),
{ numRuns: 100 }
)
})
})
describe('Property 13: 优惠券状态标识显示正确性', () => {
/**
* **Feature: mobile-app, Property 13: 优惠券状态标识显示正确性**
* **Validates: Requirements 9.3, 9.4**
*
* 对于任意优惠券列表status为"used"的优惠券应显示"已使用"标识,
* status为"expired"的优惠券应显示"已过期"标识,
* status为"available"的优惠券不显示状态标识。
*/
it('优惠券状态标识应与status字段对应', () => {
const statusArb = fc.constantFrom('available', 'used', 'expired')
const couponArb = fc.record({
couponId: fc.uuid(),
name: fc.string({ minLength: 1, maxLength: 20 }),
status: statusArb
})
const couponListArb = fc.array(couponArb, { minLength: 1, maxLength: 20 })
fc.assert(
fc.property(couponListArb, (coupons) => {
for (const coupon of coupons) {
const badge = resolveCouponStatusBadge(coupon.status)
if (coupon.status === 'used') {
expect(badge.show).toBe(true)
expect(badge.label).toBe('used')
} else if (coupon.status === 'expired') {
expect(badge.show).toBe(true)
expect(badge.label).toBe('expired')
} else {
// available状态不显示标识
expect(badge.show).toBe(false)
expect(badge.label).toBeNull()
}
}
}),
{ numRuns: 100 }
)
})
})