服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
64 lines
2.5 KiB
TypeScript
64 lines
2.5 KiB
TypeScript
import { beforeEach, expect, test, vi } from "vitest";
|
|
import { createSSRApp } from "vue";
|
|
import { renderToString } from "@vue/server-renderer";
|
|
import UpdatePrompt from "../src/components/UpdatePrompt.vue";
|
|
|
|
const state = vi.hoisted(() => ({
|
|
listeners: new Map<string, (event: any) => void>(),
|
|
info: vi.fn(), emit: vi.fn().mockResolvedValue(undefined), error: vi.fn(),
|
|
}));
|
|
vi.mock("@wailsio/runtime", () => ({ Events: {
|
|
On: (name: string, callback: (event: any) => void) => {
|
|
state.listeners.set(name, callback);
|
|
return () => state.listeners.delete(name);
|
|
},
|
|
Emit: state.emit,
|
|
} }));
|
|
vi.mock("naive-ui", () => ({
|
|
useDialog: () => ({ info: state.info }),
|
|
useMessage: () => ({ info: vi.fn(), error: state.error }),
|
|
}));
|
|
beforeEach(async () => {
|
|
vi.clearAllMocks();
|
|
state.listeners.clear();
|
|
state.info.mockReturnValue({ destroy: vi.fn() });
|
|
await renderToString(createSSRApp(UpdatePrompt));
|
|
});
|
|
function requestUpdate() {
|
|
state.listeners.get("app:update-available")!({ data: {
|
|
currentVersion: "1.2.3", version: "1.2.4", responseEvent: "app:update-response:1",
|
|
} });
|
|
return state.info.mock.calls.at(-1)![0];
|
|
}
|
|
|
|
test("显示版本且等待明确点击下载,重复点击只提交一次", async () => {
|
|
const prompt = requestUpdate();
|
|
expect(prompt.content).toContain("1.2.3");
|
|
expect(prompt.content).toContain("1.2.4");
|
|
expect(prompt.positiveText).toBe("下载更新");
|
|
expect(prompt.autoFocus).toBe(false);
|
|
expect(state.emit).not.toHaveBeenCalled();
|
|
requestUpdate();
|
|
expect(state.info).toHaveBeenCalledTimes(1);
|
|
await prompt.onPositiveClick();
|
|
await prompt.onPositiveClick();
|
|
expect(state.emit).toHaveBeenCalledExactlyOnceWith("app:update-response:1", { accepted: true });
|
|
});
|
|
for (const action of ["onNegativeClick", "onClose", "onEsc"]) {
|
|
test(`${action} 取消下载并允许再次提示`, async () => {
|
|
const prompt = requestUpdate();
|
|
await prompt[action]();
|
|
expect(state.emit).toHaveBeenCalledExactlyOnceWith("app:update-response:1", { accepted: false });
|
|
requestUpdate();
|
|
expect(state.info).toHaveBeenCalledTimes(2);
|
|
});
|
|
}
|
|
test("确认发送失败时提示错误,允许重试", async () => {
|
|
const prompt = requestUpdate();
|
|
state.emit.mockRejectedValueOnce(new Error("断开连接"));
|
|
await expect(prompt.onPositiveClick()).resolves.toBe(false);
|
|
expect(state.error).toHaveBeenCalled();
|
|
await prompt.onNegativeClick();
|
|
expect(state.emit).toHaveBeenLastCalledWith("app:update-response:1", { accepted: false });
|
|
});
|