FN-5724: fake-timer connectivity recovery app test

Stabilize the connectivity recovery first-run App test by controlling timer-driven state transitions.

- switch the retry/recovery test to `vi.useFakeTimers()` with `try/finally` cleanup
- advance timers explicitly around initial render, retry click, and post-rerender recovery window
- preserve existing assertions while removing `waitFor` timing dependence in this flow

Files changed:
 packages/dashboard/app/components/__tests__/App.test.tsx | 41 ++++++++++++++--------
 1 file changed, 26 insertions(+), 15 deletions(-)

Fusion-Task-Id: FN-5724
Fusion-Task-Lineage: 0dfad0d8-ccf9-4f83-af2e-1057180fe191
This commit is contained in:
gsxdsm
2026-05-30 15:14:01 -07:00
parent 292bf07385
commit 68465228d7

View File

@@ -876,31 +876,42 @@ describe("App backend-unreachable first-run flow", () => {
});
it("retries project loading and resumes setup wizard flow after connectivity recovers", async () => {
mockProjectsState.projects = [];
mockProjectsState.error = "Backend unavailable";
mockCurrentProjectState.currentProject = null;
vi.useFakeTimers();
mockRefreshProjects.mockImplementation(async () => {
mockProjectsState.error = null;
});
try {
mockProjectsState.projects = [];
mockProjectsState.error = "Backend unavailable";
mockCurrentProjectState.currentProject = null;
const { rerender } = render(<App />);
mockRefreshProjects.mockImplementation(async () => {
mockProjectsState.error = null;
});
const { rerender } = render(<App />);
await act(async () => {
await vi.advanceTimersByTimeAsync(1);
});
await waitFor(() => {
expect(screen.getByRole("button", { name: "Retry Connection" })).toBeTruthy();
});
fireEvent.click(screen.getByRole("button", { name: "Retry Connection" }));
await act(async () => {
fireEvent.click(screen.getByRole("button", { name: "Retry Connection" }));
await vi.advanceTimersByTimeAsync(1);
});
await waitFor(() => {
expect(mockRefreshProjects).toHaveBeenCalledTimes(1);
});
rerender(<App />);
rerender(<App />);
await act(async () => {
await vi.advanceTimersByTimeAsync(1000);
});
await waitFor(() => {
expect(screen.getByText("Welcome to Fusion")).toBeTruthy();
}, { timeout: 5000 });
} finally {
vi.useRealTimers();
}
});
});