This commit is contained in:
2026-05-01 16:08:19 +08:00
parent dce84f677d
commit 14208ccb64
15 changed files with 752 additions and 175 deletions

View File

@@ -688,6 +688,76 @@ test('道具使用失败时保留确认弹窗和暂停态', async () => {
expect(onPauseChange).toHaveBeenLastCalledWith(true);
});
test('冻结确认期间后端同步失败态时关闭确认窗并展示失败面板', async () => {
const onUseProp = vi.fn().mockResolvedValue({
...clearedRun,
currentLevel: {
...clearedRun.currentLevel!,
status: 'failed',
elapsedMs: 180_000,
remainingMs: 0,
board: {
...clearedRun.currentLevel!.board,
allTilesResolved: false,
},
},
});
const playingRun: PuzzleRunSnapshot = {
...clearedRun,
currentLevel: {
...clearedRun.currentLevel!,
status: 'playing',
startedAtMs: Date.now(),
remainingMs: 180_000,
board: {
...clearedRun.currentLevel!.board,
allTilesResolved: false,
},
},
};
const { rerender } = renderPuzzleRuntime(
<PuzzleRuntimeShell
run={playingRun}
onBack={vi.fn()}
onSwapPieces={vi.fn()}
onDragPiece={vi.fn()}
onAdvanceNextLevel={vi.fn()}
onUseProp={onUseProp}
/>,
);
fireEvent.click(screen.getByRole('button', { name: '冻结' }));
await act(async () => {
fireEvent.click(screen.getByRole('button', { name: '确定' }));
});
rerender(
<AuthUiContext.Provider value={createAuthValue()}>
<PuzzleRuntimeShell
run={{
...playingRun,
currentLevel: {
...playingRun.currentLevel!,
status: 'failed',
elapsedMs: 180_000,
remainingMs: 0,
},
}}
onBack={vi.fn()}
onSwapPieces={vi.fn()}
onDragPiece={vi.fn()}
onAdvanceNextLevel={vi.fn()}
onUseProp={onUseProp}
/>
</AuthUiContext.Provider>,
);
expect(screen.queryByRole('dialog', { name: '冻结时间' })).toBeNull();
expect(screen.getByRole('dialog', { name: '关卡失败' })).toBeTruthy();
expect(screen.queryByTestId('puzzle-freeze-effect')).toBeNull();
});
test('倒计时归零时通知父层同步失败态', () => {
vi.useFakeTimers();
const onTimeExpired = vi.fn();