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:
@@ -876,31 +876,42 @@ describe("App backend-unreachable first-run flow", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("retries project loading and resumes setup wizard flow after connectivity recovers", async () => {
|
it("retries project loading and resumes setup wizard flow after connectivity recovers", async () => {
|
||||||
mockProjectsState.projects = [];
|
vi.useFakeTimers();
|
||||||
mockProjectsState.error = "Backend unavailable";
|
|
||||||
mockCurrentProjectState.currentProject = null;
|
|
||||||
|
|
||||||
mockRefreshProjects.mockImplementation(async () => {
|
try {
|
||||||
mockProjectsState.error = null;
|
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();
|
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);
|
expect(mockRefreshProjects).toHaveBeenCalledTimes(1);
|
||||||
});
|
|
||||||
|
|
||||||
rerender(<App />);
|
rerender(<App />);
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
await vi.advanceTimersByTimeAsync(1000);
|
||||||
|
});
|
||||||
|
|
||||||
await waitFor(() => {
|
|
||||||
expect(screen.getByText("Welcome to Fusion")).toBeTruthy();
|
expect(screen.getByText("Welcome to Fusion")).toBeTruthy();
|
||||||
}, { timeout: 5000 });
|
} finally {
|
||||||
|
vi.useRealTimers();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user