geo/frontend/e2e/fixtures/api-mock.ts

69 lines
1.8 KiB
TypeScript

import { type Page, type Route } from "@playwright/test";
/**
* 拦截 API 请求并返回预设数据。
* @param page Playwright Page 对象
* @param endpoint 匹配的端点模式(字符串或正则表达式)
* @param responseData 返回的响应数据
* @param statusCode HTTP 状态码,默认 200
*/
export async function mockApi(
page: Page,
endpoint: string | RegExp,
responseData: unknown,
statusCode: number = 200,
): Promise<void> {
await page.route(endpoint, async (route: Route) => {
await route.fulfill({
status: statusCode,
contentType: "application/json",
body: JSON.stringify(responseData),
});
});
}
/**
* 模拟 API 错误响应。
* @param page Playwright Page 对象
* @param endpoint 匹配的端点模式(字符串或正则表达式)
* @param statusCode HTTP 错误状态码,默认 500
*/
export async function mockApiError(
page: Page,
endpoint: string | RegExp,
statusCode: number = 500,
): Promise<void> {
await page.route(endpoint, async (route: Route) => {
await route.fulfill({
status: statusCode,
contentType: "application/json",
body: JSON.stringify({ error: "Internal Server Error" }),
});
});
}
/**
* 模拟 API 延迟响应。
* @param page Playwright Page 对象
* @param endpoint 匹配的端点模式(字符串或正则表达式)
* @param ms 延迟毫秒数
*/
export async function mockApiDelay(
page: Page,
endpoint: string | RegExp,
ms: number,
): Promise<void> {
await page.route(endpoint, async (route: Route) => {
await new Promise((resolve) => setTimeout(resolve, ms));
await route.continue();
});
}
/**
* 清除所有路由拦截。
* @param page Playwright Page 对象
*/
export async function clearApiMocks(page: Page): Promise<void> {
await page.unrouteAll();
}