98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
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 }
|
||
)
|
||
})
|
||
})
|