45 lines
2.6 KiB
TypeScript
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 });
|
|
}
|
|
});
|