071faa482c
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口 完成项目 TypeScript/Prettier 与 Rust 全量格式化 修复 Pingora expected executable 门禁的空白敏感误报 同步开发运维文档与 AGC skill pack 格式化忽略规则
86 lines
2.5 KiB
TypeScript
86 lines
2.5 KiB
TypeScript
/* @vitest-environment jsdom */
|
|
|
|
import { act, renderHook } from '@testing-library/react';
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
import type { ProfileRechargeCenterResponse } from '../../../packages/shared/src/contracts/runtime';
|
|
import { usePlatformProfileCenterController } from './usePlatformProfileCenterController';
|
|
|
|
const getPlatformProfileRechargeCenterMock = vi.hoisted(() => vi.fn());
|
|
|
|
vi.mock('../../services/platform-entry/platformProfileClient', async () => {
|
|
const actual = await vi.importActual<
|
|
typeof import('../../services/platform-entry/platformProfileClient')
|
|
>('../../services/platform-entry/platformProfileClient');
|
|
return {
|
|
...actual,
|
|
getPlatformProfileRechargeCenter: getPlatformProfileRechargeCenterMock,
|
|
};
|
|
});
|
|
|
|
const rechargeCenter: ProfileRechargeCenterResponse = {
|
|
walletBalance: 100,
|
|
mudPointBalance: {
|
|
totalPoints: 100,
|
|
permanentPoints: 100,
|
|
limitedPoints: 0,
|
|
limitedExpiresAt: null,
|
|
dailyFreePoints: 0,
|
|
dailyFreeResetPoints: 0,
|
|
dailyFreeResetsAt: null,
|
|
},
|
|
membership: {
|
|
status: 'normal',
|
|
tier: 'normal',
|
|
startedAt: null,
|
|
expiresAt: null,
|
|
updatedAt: null,
|
|
cycleStartedAt: null,
|
|
cycleResetsAt: null,
|
|
cycleGrantedPoints: 0,
|
|
cycleRemainingPoints: 0,
|
|
cyclePeriodDays: 30,
|
|
},
|
|
pointProducts: [],
|
|
membershipProducts: [],
|
|
benefits: [],
|
|
latestOrder: null,
|
|
hasPointsRecharged: false,
|
|
};
|
|
|
|
describe('usePlatformProfileCenterController', () => {
|
|
afterEach(() => {
|
|
getPlatformProfileRechargeCenterMock.mockReset();
|
|
});
|
|
|
|
it('aborts an unfinished recharge center read when the consumer unmounts', async () => {
|
|
let resolveRechargeCenter!: (center: ProfileRechargeCenterResponse) => void;
|
|
const pendingRead = new Promise<ProfileRechargeCenterResponse>(
|
|
(resolve) => {
|
|
resolveRechargeCenter = resolve;
|
|
},
|
|
);
|
|
getPlatformProfileRechargeCenterMock.mockReturnValue(pendingRead);
|
|
const { result, unmount } = renderHook(() =>
|
|
usePlatformProfileCenterController({
|
|
activeTab: 'editor-canvas',
|
|
isAuthenticated: false,
|
|
showRechargeEntry: true,
|
|
requestLogin: vi.fn(),
|
|
currentUser: null,
|
|
}),
|
|
);
|
|
|
|
act(() => result.current.loadRechargeCenter());
|
|
const requestOptions =
|
|
getPlatformProfileRechargeCenterMock.mock.calls[0]?.[0];
|
|
expect(requestOptions?.signal.aborted).toBe(false);
|
|
|
|
unmount();
|
|
expect(requestOptions?.signal.aborted).toBe(true);
|
|
|
|
resolveRechargeCenter(rechargeCenter);
|
|
await pendingRead;
|
|
});
|
|
});
|