- 新增后台登录图形验证码功能,完善登录安全防护 - 新增登录rememberMe参数,控制Refresh Token的会话持久化策略 - 实现OSS私有桶媒体URL自动签名,统一处理图片资源的临时访问签名 - 新增素材库数据库表与上传API,规范媒体资源管理流程 - 统一前端UI图标使用@element-plus/icons-vue,重构布局图标组件 - 登录页新增验证码输入、刷新功能,添加账号记忆与记住密码逻辑 - 更新全套文档,补充API契约、技术决策记录与集成流程说明 - 修复多个业务页面的图标展示问题,新增认证流程相关测试用例
44 lines
1.5 KiB
TypeScript
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 }) };
|
|
}
|