fix(*): 模型与数据同步 - 完善鉴权、供应商模型和本地持久化能力

This commit is contained in:
ddCat
2026-08-20 22:58:31 +08:00
parent 36666a53a2
commit 11ee5aafec
30 changed files with 688 additions and 203 deletions

View File

@@ -36,6 +36,11 @@ test("Dreamina submit failure categories have bounded user-facing messages", ()
}
});
test("resource storage 403 is not reported as generation channel authentication", () => {
const raw = "参考图片上传失败:OSS 上传失败:403 Forbidden <Code>UserDisable</Code><Message>UserDisable</Message>";
expect(generationErrorMessage(raw)).toBe("对象存储账号已停用,请检查或更换对象存储配置。");
});
test("durable Dreamina submit failures keep their stable user-facing category in task center", () => {
const task = projectLocalDreaminaTask({
id: "dreamina-submit-timeout-task-0001",

View File

@@ -3978,6 +3978,7 @@ test("account scope transition drains an active remote deletion before entering
const localStorageValues = new Map<string, string>();
const previousAdapter = apiClient.defaults.adapter;
const previousAssets = useAssetStore.getState().assets;
const requestUrls: string[] = [];
let releaseDelete!: () => void;
const deleteReleased = new Promise<void>((resolve) => {
releaseDelete = resolve;
@@ -3985,12 +3986,13 @@ test("account scope transition drains an active remote deletion before entering
let deleteStarted = false;
apiClient.defaults.adapter = async (config) => {
const url = String(config.url || "");
requestUrls.push(url);
if (config.method === "delete") {
deleteStarted = true;
await deleteReleased;
return { data: { code: 0, data: { id: "shared-asset" }, msg: "" }, status: 200, statusText: "OK", headers: {}, config };
}
const data = url.includes("canvas-projects") ? { projects: [] } : { assets: [] };
const data = url.includes("user-data/snapshot") ? { projects: [], assets: [] } : url.includes("canvas-projects") ? { projects: [] } : { assets: [] };
return { data: { code: 0, data, msg: "" }, status: 200, statusText: "OK", headers: {}, config };
};
Object.defineProperty(globalThis, "window", {
@@ -4013,6 +4015,8 @@ test("account scope transition drains an active remote deletion before entering
try {
useAssetStore.getState().replaceAssets([]);
await syncRemoteUserData("account-A");
expect(requestUrls.filter((url) => url.includes("user-data/snapshot"))).toHaveLength(1);
expect(requestUrls.some((url) => /\/(assets|canvas-projects)\/[^/]+/.test(url))).toBe(false);
useAssetStore.getState().replaceAssets([
{
id: "shared-asset",