diff --git a/.changeset/orange-suns-follow.md b/.changeset/orange-suns-follow.md new file mode 100644 index 0000000..763fd7d --- /dev/null +++ b/.changeset/orange-suns-follow.md @@ -0,0 +1,5 @@ +--- +"@cronn/playwright-utils": patch +--- + +Suspended routes will now fallback to other previously registered routes when they are released. diff --git a/src/api/route-interceptor/interceptor.ts b/src/api/route-interceptor/interceptor.ts index a9dcda3..1a736a2 100644 --- a/src/api/route-interceptor/interceptor.ts +++ b/src/api/route-interceptor/interceptor.ts @@ -95,7 +95,7 @@ async function withSuspendedRoute( return; } - const suspendedRoute = barrier.promise.then(() => route.continue()); + const suspendedRoute = barrier.promise.then(() => route.fallback()); suspendedRoutes.add(suspendedRoute); try { diff --git a/tests/route-interceptor.spec.ts b/tests/route-interceptor.spec.ts index 568dfe7..c99ce42 100644 --- a/tests/route-interceptor.spec.ts +++ b/tests/route-interceptor.spec.ts @@ -304,3 +304,38 @@ customTest("Wait for request and response", async ({ page, intercept }) => { await expect(response).rejects.toThrow(/Timeout 1000ms exceeded/); }); }); + +customTest( + "Released suspended route falls back to surrounding interceptor", + async ({ page, intercept }) => { + const loadingIndicator = page.getByRole("progressbar"); + const fetchUserButton = page.getByRole("button", { name: "Fetch user" }); + const count = page.getByRole("textbox", { name: "Count" }); + const responseStatus = page.locator("#api-response-status"); + + await test.step("Open page", async () => { + await page.goto(serverURL); + await openTestPage(page); + await expect(count).toHaveValue("0"); + }); + + await intercept + .onGetUser() + .respondWith({ + status: 500, + json: { error: "Internal Server Error" }, + }) + .during(async () => { + await intercept + .onGetUser() + .suspend() + .during(async () => { + await fetchUserButton.click(); + await expect(loadingIndicator).toBeVisible(); + }); + + await expect(count).toHaveValue("1"); + await expect(responseStatus).toHaveText("500"); + }); + }, +);