Files
ttstd-infinite-canvas/web/test/profile-session.test.ts
2026-10-13 05:31:30 +08:00

45 lines
2.6 KiB
TypeScript

import { expect, test } from "bun:test";
import { QueryClient } from "@tanstack/react-query";
import { apiClient } from "../src/services/api/request";
import { loadProfileSession } from "../src/services/profile-session";
import { useUserStore, type LocalUser } from "../src/stores/use-user-store";
const originalUser: LocalUser = { id: "profile-user", username: "user", displayName: "User", role: "user", status: "active", avatarMode: "default", avatarPreset: "person" };
test("profile refresh synchronizes avatars while rejecting stale account and cancelled responses", async () => {
const originalRequest = apiClient.request;
const previousUser = useUserStore.getState().user;
const client = new QueryClient({ defaultOptions: { queries: { retry: false } } });
try {
for (const scenario of ["refresh", "switched-account", "wrong-user", "cancelled", "failure"] as const) {
useUserStore.getState().setUser(originalUser);
let respond!: (value: unknown) => void;
let reject!: (reason: Error) => void;
apiClient.request = (() =>
new Promise((resolve, fail) => {
respond = resolve;
reject = fail;
})) as typeof apiClient.request;
const key = ["user-profile", scenario];
const request = client.fetchQuery({ queryKey: key, queryFn: ({ signal }) => loadProfileSession(originalUser.id, signal) }).catch((error) => error);
if (scenario === "switched-account") useUserStore.getState().setUser({ ...originalUser, id: "other-user" });
if (scenario === "cancelled") {
await client.cancelQueries({ queryKey: key });
useUserStore.getState().setUser({ ...originalUser, avatarPreset: "cat" });
}
if (scenario === "failure") reject(new Error("profile unavailable"));
else respond({ data: { code: 0, data: { user: { ...originalUser, id: scenario === "wrong-user" ? "unexpected-user" : originalUser.id, avatarPreset: "robot" } }, msg: "ok" }, status: 200 });
await request;
await Promise.resolve();
const stored = useUserStore.getState().user;
expect(stored?.id).toBe(scenario === "switched-account" ? "other-user" : originalUser.id);
expect(stored?.avatarPreset).toBe(scenario === "refresh" ? "robot" : scenario === "cancelled" ? "cat" : "person");
}
} finally {
await client.cancelQueries();
client.clear();
apiClient.request = originalRequest;
useUserStore.setState({ user: previousUser });
}
});