Files
Genarrative/src/components/rpg-entry/useRpgEntryBootstrap.test.tsx
T
kdletters 542fb09365 接入微信 Native 充值与订单过期处理
调整网页端充值渠道,微信内浏览器在开放平台接入前走 Native 支付。

拆分 Native 支付二维码弹窗,展示金额和充值内容并取消无效 code_url 跳转。

修复微信 Native 下单 time_expire 秒级 RFC3339 格式,避免小数秒参数错误。

新增充值订单 5 分钟过期调度,过期前查询微信真实订单状态。

补充微信授权绑定、路由加载恢复和后台表时间显示等配套逻辑。

更新 SpacetimeDB schema、绑定和相关文档测试。
2026-07-08 21:35:02 +08:00

94 lines
2.9 KiB
TypeScript

/* @vitest-environment jsdom */
import { renderHook, waitFor } from '@testing-library/react';
import { beforeEach, expect, test, vi } from 'vitest';
import type { AuthUser } from '../../services/authService';
import {
listRpgEntryWorldGallery,
listRpgEntryWorldLibrary,
listRpgProfileBrowseHistory,
listRpgProfileSaveArchives,
} from '../../services/rpg-entry';
import { listRpgCreationWorks } from '../../services/rpg-creation/index';
import { useRpgEntryBootstrap } from './useRpgEntryBootstrap';
vi.mock('../../services/rpg-entry', () => ({
listRpgEntryWorldGallery: vi.fn(),
listRpgEntryWorldLibrary: vi.fn(),
listRpgProfileBrowseHistory: vi.fn(),
listRpgProfileSaveArchives: vi.fn(),
resumeRpgProfileSaveArchive: vi.fn(),
upsertRpgProfileBrowseHistory: vi.fn(),
}));
vi.mock('../../services/rpg-creation/index', () => ({
listRpgCreationWorks: vi.fn(),
}));
const mockListRpgEntryWorldGallery = vi.mocked(listRpgEntryWorldGallery);
const mockListRpgEntryWorldLibrary = vi.mocked(listRpgEntryWorldLibrary);
const mockListRpgCreationWorks = vi.mocked(listRpgCreationWorks);
const mockListRpgProfileBrowseHistory = vi.mocked(listRpgProfileBrowseHistory);
const mockListRpgProfileSaveArchives = vi.mocked(listRpgProfileSaveArchives);
const testUser: AuthUser = {
id: 'user-1',
publicUserCode: '100001',
displayName: 'Test User',
avatarUrl: null,
phoneNumberMasked: null,
loginMethod: 'password',
bindingStatus: 'active',
wechatBound: false,
};
beforeEach(() => {
vi.clearAllMocks();
mockListRpgEntryWorldGallery.mockResolvedValue([]);
mockListRpgEntryWorldLibrary.mockResolvedValue([]);
mockListRpgCreationWorks.mockResolvedValue([]);
mockListRpgProfileBrowseHistory.mockResolvedValue([]);
mockListRpgProfileSaveArchives.mockResolvedValue([]);
});
test('login refreshes platform data without showing page loading again', async () => {
const getProfileDashboard = vi.fn(async () => null);
let resolveInitialGallery: (value: []) => void = () => undefined;
mockListRpgEntryWorldGallery.mockReturnValueOnce(
new Promise<[]>((resolve) => {
resolveInitialGallery = resolve;
}),
);
const { result, rerender } = renderHook(
({ user }: { user: AuthUser | null }) =>
useRpgEntryBootstrap({
user,
canAccessProtectedData: Boolean(user),
getProfileDashboard,
handleContinueGame: vi.fn(),
hasInitialAgentSession: false,
}),
{ initialProps: { user: null as AuthUser | null } },
);
await waitFor(() => {
expect(result.current.isLoadingPlatform).toBe(true);
});
resolveInitialGallery([]);
await waitFor(() => {
expect(result.current.isLoadingPlatform).toBe(false);
});
rerender({ user: testUser });
await waitFor(() => {
expect(mockListRpgEntryWorldLibrary).toHaveBeenCalledTimes(1);
});
expect(result.current.isLoadingPlatform).toBe(false);
expect(result.current.isLoadingDashboard).toBe(false);
});