cents/tests/e2e/06-多币种/01-外币异步换算.spec.ts

40 lines
2.2 KiB
TypeScript

import { test, expect } from "@playwright/test";
import { makeEntry, mockApi, } from "../测试夹具";
test.describe("多币种:外币记账与异步换算", () => {
test("01-外币账目在汇率返回前也可以完成记账", async ({ page }) => {
const state = await mockApi(page);
await (page);
await page.getByRole("button", { name: "记一笔" }).click();
await page.getByRole("button", { name: /切换币种/ }).click();
await page.getByRole("button", { name: /美元/ }).click();
await page.getByRole("button", { name: "5", exact: true }).click();
const started = Date.now();
await page.getByRole("button", { name: "完成记账" }).click();
await expect(page.getByText("已记入账本")).toBeVisible();
expect(Date.now() - started).toBeLessThan(1500);
expect(state.requestPaths.some((path) => path.includes("exchange-rates"))).toBeTruthy();
});
test("02-汇率失败时保留原币账目并显示待换算状态", async ({ page }) => {
const state = await mockApi(page, { initialEntries: [makeEntry({ id: "entry-usd", currency: "USD", amount: 1000, baseAmount: null, exchangeRate: null, exchangeRateEffectiveDate: null, conversionStatus: "pending" })] });
await (page);
await page.route("**/api/exchange-rates/**", (route) => route.abort("failed"));
await page.reload();
await expect(page.getByRole("status")).toContainText("等待换算");
await expect(page.getByText("立即换算")).toBeVisible();
expect(state.entries).toHaveLength(1);
});
test("03-已换算账目切换显示模式不会重复出现等待换算提示", async ({ page }) => {
await mockApi(page, { initialEntries: [makeEntry({ id: "entry-usd", currency: "USD", amount: 1000, baseAmount: 720, exchangeRate: "7.2", exchangeRateEffectiveDate: "2026-08-01", conversionStatus: "exact" })] });
await (page);
await page.getByRole("button", { name: "更多" }).click();
await page.getByRole("menuitem", { name: "设置" }).click();
await page.getByLabel("流水金额显示").selectOption("original");
await page.getByRole("button", { name: "保存设置" }).click();
await page.goBack();
await expect(page.getByText("等待换算")).not.toBeVisible();
});
});