|
1 | 1 | import { screen, waitFor, within } from "@testing-library/react"; |
2 | | -import { beforeEach, describe, expect, it, vi } from "vitest"; |
| 2 | +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; |
3 | 3 | import { CredentialsPage } from "../CredentialsPage"; |
4 | 4 | import { |
5 | 5 | expandCredentialGroups, jsonResponse, makeCredential, renderPage, settle, userEvent, |
@@ -27,6 +27,12 @@ async function openAddDialog() { |
27 | 27 | await screen.findByTestId("add-credential-dialog"); |
28 | 28 | } |
29 | 29 |
|
| 30 | +// 导出用例会替换全局 URL(createObjectURL 在 jsdom 缺失);不在用例末尾 |
| 31 | +// 手动恢复的话,后续 describe 的 useSearchParams 会拿到残缺的 URL 构造器。 |
| 32 | +afterEach(() => { |
| 33 | + vi.unstubAllGlobals(); |
| 34 | +}); |
| 35 | + |
30 | 36 | describe("CredentialsPage", () => { |
31 | 37 | beforeEach(() => { |
32 | 38 | vi.unstubAllGlobals(); |
@@ -1706,6 +1712,36 @@ describe("CredentialsPage", () => { |
1706 | 1712 | expect(screen.getByTestId("tags-cred_1")).toBeInTheDocument(); |
1707 | 1713 | expect(screen.getByTestId("credential-tag-filter")).toBeInTheDocument(); |
1708 | 1714 | }); |
| 1715 | + |
| 1716 | + it("导出凭证:请求 export 端点并落盘 JSON", async () => { |
| 1717 | + const blobs: string[] = []; |
| 1718 | + vi.stubGlobal("URL", { |
| 1719 | + ...URL, |
| 1720 | + createObjectURL: () => { blobs.push("blob"); return "blob:x"; }, |
| 1721 | + revokeObjectURL: () => undefined, |
| 1722 | + }); |
| 1723 | + const fetchSpy = mockFetch({ |
| 1724 | + "/export": { |
| 1725 | + provider: "trae", nickname: "主账号", tags: ["生产"], |
| 1726 | + credential: { accessToken: "secret" }, |
| 1727 | + }, |
| 1728 | + "/api/credentials": listBody([makeCredential({ id: "cred_1", provider: "trae" })]), |
| 1729 | + }); |
| 1730 | + renderPage(<CredentialsPage />, ADMIN); |
| 1731 | + await settle(); |
| 1732 | + await expandCredentialGroups(); |
| 1733 | + |
| 1734 | + await userEvent.click(screen.getByTestId("actions-cred_1")); |
| 1735 | + await userEvent.click(screen.getByRole("menuitem", { name: "导出凭证" })); |
| 1736 | + |
| 1737 | + await waitFor(() => { |
| 1738 | + expect(fetchSpy.mock.calls.some(([url]) => |
| 1739 | + String(url).includes("/api/credentials/cred_1/export"))).toBe(true); |
| 1740 | + }); |
| 1741 | + await waitFor(() => expect(blobs).toHaveLength(1)); |
| 1742 | + expect(await screen.findByTestId("credentials-notice")) |
| 1743 | + .toHaveTextContent("已导出凭证 JSON"); |
| 1744 | + }); |
1709 | 1745 | }); |
1710 | 1746 |
|
1711 | 1747 |
|
|
0 commit comments