From 0742d8d16518d644dec9c32f25667bfb07d3a522 Mon Sep 17 00:00:00 2001 From: Alan Buscaglia Date: Mon, 29 Jun 2026 20:30:34 +0200 Subject: [PATCH] test(ui): stabilize provider no-scan e2e waits --- ui/tests/providers/providers-page.ts | 23 +++++++++++++---------- ui/tests/providers/providers.spec.ts | 1 + 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/ui/tests/providers/providers-page.ts b/ui/tests/providers/providers-page.ts index 9f5868dffa..c29fc34b9a 100644 --- a/ui/tests/providers/providers-page.ts +++ b/ui/tests/providers/providers-page.ts @@ -936,20 +936,21 @@ export class ProvidersPage extends BasePage { } } - private async waitForProviderReadyToClose(): Promise { + private async waitForProviderReadyToClose(timeout = 30000): Promise { const launchStepReady = this.page .getByText("Account Connected!", { exact: true }) .or(this.page.getByText("Loading scan options...", { exact: true })) .or(this.page.getByRole("button", { name: "Save", exact: true })) - .or(this.page.getByRole("button", { name: "Launch scan", exact: true })); + .or(this.page.getByRole("button", { name: "Launch scan", exact: true })) + .first(); const connectionError = this.page.locator( "div.border-border-error p.text-text-error-primary", ); try { await Promise.race([ - launchStepReady.waitFor({ state: "visible", timeout: 30000 }), - connectionError.waitFor({ state: "visible", timeout: 30000 }), + launchStepReady.waitFor({ state: "visible", timeout }), + connectionError.waitFor({ state: "visible", timeout }), ]); } catch { // Continue and inspect visible state below. @@ -962,11 +963,12 @@ export class ProvidersPage extends BasePage { ); } - await expect(launchStepReady).toBeVisible({ timeout: 30000 }); + await expect(launchStepReady).toBeVisible({ timeout }); } async completeProviderConnectionWithoutLaunchingScan( providerUID: string, + timeout = 30000, ): Promise { await this.verifyWizardModalOpen(); @@ -978,7 +980,8 @@ export class ProvidersPage extends BasePage { .getByText("Account Connected!", { exact: true }) .or(this.page.getByText("Loading scan options...", { exact: true })) .or(this.page.getByRole("button", { name: "Save", exact: true })) - .or(this.page.getByRole("button", { name: "Launch scan", exact: true })); + .or(this.page.getByRole("button", { name: "Launch scan", exact: true })) + .first(); const connectionError = this.page.locator( "div.border-border-error p.text-text-error-primary", ); @@ -988,8 +991,8 @@ export class ProvidersPage extends BasePage { // actions, because those controls are owned by the launch flow and can be // hidden while scan options load. await expect( - checkConnectionButton.or(launchStepReady).or(connectionError), - ).toBeVisible({ timeout: 30000 }); + checkConnectionButton.or(launchStepReady).or(connectionError).first(), + ).toBeVisible({ timeout }); if (await connectionError.isVisible().catch(() => false)) { const errorText = await connectionError.textContent(); @@ -1003,9 +1006,9 @@ export class ProvidersPage extends BasePage { // scan execution itself is covered by scans.spec.ts. if (await checkConnectionButton.isVisible().catch(() => false)) { await checkConnectionButton.click(); - await this.waitForProviderReadyToClose(); + await this.waitForProviderReadyToClose(timeout); } else { - await expect(launchStepReady).toBeVisible({ timeout: 30000 }); + await expect(launchStepReady).toBeVisible({ timeout }); } await this.wizardModal diff --git a/ui/tests/providers/providers.spec.ts b/ui/tests/providers/providers.spec.ts index 4dc8f010ed..1aebb6c12b 100644 --- a/ui/tests/providers/providers.spec.ts +++ b/ui/tests/providers/providers.spec.ts @@ -1501,6 +1501,7 @@ test.describe("Add Provider", () => { // Confirm the provider connection without launching a scan await providersPage.completeProviderConnectionWithoutLaunchingScan( orgDomain, + 60000, ); }, );