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

109 lines
3.1 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, beforeEach, vi } from 'vitest'
import * as fc from 'fast-check'
/**
* Property 11: 分页加载参数正确性
*
* 对于任意初始页码和连续N次加载更多操作
* 第i次请求的page参数应等于初始页码+i。
*
* 我们通过模拟分页加载逻辑来验证此属性。
*/
/**
* 分页加载器:模拟积分页的分页逻辑
* 与 pages/points/points.vue 中的逻辑一致
*/
function createPaginationLoader(fetchFn, pageSize = 20) {
let page = 1
let noMore = false
let loading = false
const records = []
async function loadRecords(isLoadMore = false) {
if (loading) return
loading = true
try {
const res = await fetchFn({ page, pageSize })
const list = res.data?.records || res.data || []
if (isLoadMore) {
records.push(...list)
} else {
records.length = 0
records.push(...list)
}
noMore = list.length < pageSize
} finally {
loading = false
}
}
async function loadMore() {
if (noMore || loading) return
page++
await loadRecords(true)
}
function reset() {
page = 1
noMore = false
records.length = 0
}
return { loadRecords, loadMore, reset, getPage: () => page, getRecords: () => records }
}
describe('Property 11: 分页加载参数正确性', () => {
/**
* **Feature: mobile-app, Property 11: 分页加载参数正确性**
* **Validates: Requirements 8.4**
*
* 对于任意连续N次加载更多操作
* 第i次请求的page参数应等于1+i初始页码为1
*/
it('连续加载更多时page参数应递增', async () => {
// 生成加载更多次数1到10次
const loadCountArb = fc.integer({ min: 1, max: 10 })
const pageSizeArb = fc.constantFrom(10, 20, 50)
await fc.assert(
fc.asyncProperty(loadCountArb, pageSizeArb, async (loadCount, pageSize) => {
// 记录每次请求的page参数
const requestedPages = []
// 模拟API函数返回满页数据以确保不会触发noMore
const mockFetch = vi.fn(async (params) => {
requestedPages.push(params.page)
// 返回满页数据,确保可以继续加载
const fakeRecords = Array.from({ length: pageSize }, (_, i) => ({
id: `${params.page}-${i}`,
source: '测试',
amount: 10,
createdAt: '2025-01-01'
}))
return { data: { records: fakeRecords } }
})
const loader = createPaginationLoader(mockFetch, pageSize)
// 初始加载page=1
await loader.loadRecords()
// 连续加载更多N次
for (let i = 0; i < loadCount; i++) {
await loader.loadMore()
}
// 验证:总共请求了 1初始 + loadCount 次
expect(requestedPages.length).toBe(1 + loadCount)
// 验证第i次请求的page参数应等于i+1
for (let i = 0; i < requestedPages.length; i++) {
expect(requestedPages[i]).toBe(i + 1)
}
}),
{ numRuns: 100 }
)
})
})