diff --git a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts index 58401f52a..f859284e1 100644 --- a/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts +++ b/apps/ai-game-creator-shell/src/features/agent-runtime/directActiveTurns.ts @@ -78,7 +78,7 @@ export function useDirectActiveTurns({ return; } catch { if (attempt < DIRECT_ACTIVE_TURNS_READ_ATTEMPTS) { - await new Promise((resolve) => { + await new Promise((resolve) => { retryTimerRef.current = window.setTimeout(() => { retryTimerRef.current = null; resolve(); diff --git a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx index 5a000bf39..71fc665ef 100644 --- a/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx +++ b/apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx @@ -1,12 +1,49 @@ // @vitest-environment jsdom -import { cleanup, fireEvent, render, screen } from '@testing-library/react'; +import { + act, + cleanup, + fireEvent, + render, + renderHook, + screen, +} from '@testing-library/react'; import { afterEach, expect, it, vi } from 'vitest'; +import { useDirectActiveTurns } from '../src/features/agent-runtime/directActiveTurns'; import { ActiveProjectRunsPanel } from '../src/features/app-shell/ActiveProjectRunsPanel'; afterEach(() => cleanup()); +it('读取失败后的重试定时器会在卸载后清理', async () => { + vi.useFakeTimers(); + const invoke = vi.fn(async () => { + throw new Error('temporarily unavailable'); + }); + const clearTimeoutSpy = vi.spyOn(window, 'clearTimeout'); + + try { + const { unmount } = renderHook(() => + useDirectActiveTurns({ invoke, enabled: true }), + ); + await act(async () => { + await vi.advanceTimersByTimeAsync(0); + }); + expect(invoke).toHaveBeenCalledTimes(1); + + unmount(); + expect(clearTimeoutSpy).toHaveBeenCalled(); + + await act(async () => { + await vi.advanceTimersByTimeAsync(1_000); + }); + expect(invoke).toHaveBeenCalledTimes(1); + } finally { + vi.useRealTimers(); + clearTimeoutSpy.mockRestore(); + } +}); + it('按开始时间展示正在运行的项目并支持进入项目', () => { const onOpenProject = vi.fn(); render(