修复泥点余额明细刷新
钱包明细每次展开并在实时余额变化时读取最新拆分。 图片画板生成扣费或退款后同步刷新总额与充值中心。 充值中心读取增加 latest-wins 门禁并阻止旧响应覆盖权威结果。 补充钱包刷新、画板入口和充值乱序回归测试。 同步更新泥点统一资产入口决策记录。
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user