Files
WonderQ-Project/WonderQ-Admin-UI-Vue/src/api/client-auth.test.ts
duanshuwen 6245159e7c feat: 添加后台登录验证码、记住密码功能,优化媒体资源与前端规范
- 新增后台登录图形验证码功能,完善登录安全防护
- 新增登录rememberMe参数,控制Refresh Token的会话持久化策略
- 实现OSS私有桶媒体URL自动签名,统一处理图片资源的临时访问签名
- 新增素材库数据库表与上传API,规范媒体资源管理流程
- 统一前端UI图标使用@element-plus/icons-vue,重构布局图标组件
- 登录页新增验证码输入、刷新功能,添加账号记忆与记住密码逻辑
- 更新全套文档,补充API契约、技术决策记录与集成流程说明
- 修复多个业务页面的图标展示问题,新增认证流程相关测试用例
2026-08-27 07:50:59 +08:00

44 lines
1.5 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import { getCaptcha, login } from "@/api/client";
describe("admin auth client", () => {
afterEach(() => vi.restoreAllMocks());
it("loads a captcha challenge without an access token", async () => {
const fetchMock = vi.fn().mockResolvedValueOnce(jsonResponse(200, {
captchaEnabled: true,
captchaId: "captcha-1",
image: "data:image/svg+xml;base64,PHN2Zy8+",
expiresIn: 120,
}));
vi.stubGlobal("fetch", fetchMock);
await expect(getCaptcha()).resolves.toMatchObject({ captchaId: "captcha-1", captchaEnabled: true });
expect(fetchMock).toHaveBeenCalledWith("/api/admin/auth/captcha", expect.objectContaining({ credentials: "include" }));
});
it("sends the captcha fields with login", async () => {
const fetchMock = vi.fn().mockResolvedValueOnce(jsonResponse(200, {
token: "access-token",
accessToken: "access-token",
expiresIn: 900,
user: { id: "admin-1", email: "admin@example.com", name: "Admin", role: "admin" },
}));
vi.stubGlobal("fetch", fetchMock);
await login("admin@example.com", "password", "captcha-1", "ABCD", true);
expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toEqual({
email: "admin@example.com",
password: "password",
captchaId: "captcha-1",
captchaCode: "ABCD",
rememberMe: true,
});
});
});
function jsonResponse(code: number, data: unknown) {
return { status: code, json: async () => ({ code, msg: "success", data }) };
}