修复泥点余额明细刷新

钱包明细每次展开并在实时余额变化时读取最新拆分。

图片画板生成扣费或退款后同步刷新总额与充值中心。

充值中心读取增加 latest-wins 门禁并阻止旧响应覆盖权威结果。

补充钱包刷新、画板入口和充值乱序回归测试。

同步更新泥点统一资产入口决策记录。
This commit is contained in:
2026-07-20 12:48:28 +08:00
parent 0c04bbbea3
commit f1f2332e61
7 changed files with 220 additions and 27 deletions
@@ -4465,6 +4465,98 @@ test('logged in mobile recommend page exposes the shared wallet details and rech
expect(within(rechargeDialog).queryByText('会员月卡')).toBeNull();
});
test('the latest recharge center read wins when wallet and recharge overlap', async () => {
const user = userEvent.setup();
mockNarrowMobileLayout();
let resolveWalletRead!: (
center: ProfileRechargeCenterResponse,
) => void;
let resolveRechargeRead!: (
center: ProfileRechargeCenterResponse,
) => void;
const walletReadPromise = new Promise<ProfileRechargeCenterResponse>(
(resolve) => {
resolveWalletRead = resolve;
},
);
const rechargeReadPromise = new Promise<ProfileRechargeCenterResponse>(
(resolve) => {
resolveRechargeRead = resolve;
},
);
mockGetRpgProfileRechargeCenter
.mockReturnValueOnce(walletReadPromise)
.mockReturnValueOnce(rechargeReadPromise);
const { container } = render(
<ProfileHomeViewHarness
activeTab="home"
profileDashboardOverrides={{ walletBalance: 207 }}
/>,
);
const walletLayer = container.querySelector(
'.platform-mobile-recommend-wallet-entry',
);
expect(walletLayer).toBeTruthy();
await user.click(
within(walletLayer as HTMLElement).getByRole('button', {
name: '泥点 207',
}),
);
const rechargeButtons = within(walletLayer as HTMLElement).getAllByRole(
'button',
{ name: '充值' },
);
await user.click(rechargeButtons[0]!);
expect(mockGetRpgProfileRechargeCenter).toHaveBeenCalledTimes(2);
resolveRechargeRead({
walletBalance: 207,
mudPointBalance: {
totalPoints: 207,
permanentPoints: 187,
limitedPoints: 0,
limitedExpiresAt: null,
dailyFreePoints: 20,
dailyFreeResetPoints: 20,
dailyFreeResetsAt: '2026-07-20T16:00:00Z',
},
membership: buildNormalMembership(),
pointProducts: [buildPointProduct()],
membershipProducts: [],
benefits: [],
latestOrder: null,
hasPointsRecharged: false,
});
expect(await screen.findByText('购买更多泥点')).toBeTruthy();
expect(screen.getByText('当前余额 207 泥点')).toBeTruthy();
resolveWalletRead({
walletBalance: 0,
mudPointBalance: {
totalPoints: 0,
permanentPoints: 0,
limitedPoints: 0,
limitedExpiresAt: null,
dailyFreePoints: 0,
dailyFreeResetPoints: 20,
dailyFreeResetsAt: '2026-07-20T16:00:00Z',
},
membership: buildNormalMembership(),
pointProducts: [],
membershipProducts: [],
benefits: [],
latestOrder: null,
hasPointsRecharged: false,
});
await act(async () => undefined);
expect(screen.getByText('当前余额 207 泥点')).toBeTruthy();
});
test('mobile discover search submits public work code', async () => {
const user = userEvent.setup();
const onSearchPublicCode = vi.fn();