commit da4989f6aa179322fa0111146ab18acbc38e667a
parent ca493c76f40e9d9e7c6b28a3bfb528a7ef8362a1
Author: Florian Dold <dold@taler.net>
Date: Mon, 2 Nov 2026 20:45:28 +0100
taler-harness: wait for peer actions after terms acceptance
Diffstat:
1 file changed, 33 insertions(+), 8 deletions(-)
diff --git a/packages/taler-harness/src/integrationtests/test-wallet-web-ui-pwa-peer-tos.ts b/packages/taler-harness/src/integrationtests/test-wallet-web-ui-pwa-peer-tos.ts
@@ -22,6 +22,7 @@ import {
withdrawViaBankV4,
} from "../harness/environments.js";
import { GlobalTestState } from "../harness/harness.js";
+import type { Locator, Page } from "playwright-core";
import { Stage } from "../stagefright/stage.js";
import {
acknowledgeBestEffortStorageForTest,
@@ -30,6 +31,28 @@ import {
waitForPwa,
} from "./wallet-web-ui-test-support.js";
+/**
+ * Wait until `button` is no longer disabled.
+ *
+ * Accepting the exchange's terms comes back to the previous screen before
+ * wallet-core has re-reported the exchange, so the screen keeps its blocked
+ * rendering for a moment after the heading is back. `isDisabled()` does not
+ * wait, so sampling it right away reports a block that is already going away.
+ */
+async function waitUntilEnabled(
+ page: Page,
+ button: Locator,
+ message: string,
+): Promise<void> {
+ try {
+ await button
+ .and(page.locator("button:not([disabled])"))
+ .waitFor({ timeout: 15_000 });
+ } catch (cause) {
+ throw Error(message, { cause });
+ }
+}
+
/** Prove that a prepared peer request survives exchange ToS acceptance. */
export async function runWalletWebUiPwaPeerTosTest(t: GlobalTestState) {
const termsDirectory = path.join(t.testDir, "wallet-webui-peer-terms");
@@ -153,11 +176,11 @@ export async function runWalletWebUiPwaPeerTosTest(t: GlobalTestState) {
const resumedReceive = page.getByRole("button", {
name: "Receive money",
});
- if (await resumedReceive.isDisabled()) {
- throw Error(
- "incoming peer payment stayed blocked after accepting terms",
- );
- }
+ await waitUntilEnabled(
+ page,
+ resumedReceive,
+ "incoming peer payment stayed blocked after accepting terms",
+ );
await resumedReceive.click();
await page
.getByRole("heading", { name: "First incoming browser payment" })
@@ -214,9 +237,11 @@ export async function runWalletWebUiPwaPeerTosTest(t: GlobalTestState) {
await page.getByText("You receive", { exact: true }).waitFor();
const create = page.getByRole("button", { name: "Create link" });
await create.waitFor();
- if (await create.isDisabled()) {
- throw Error("peer request stayed blocked after accepting terms");
- }
+ await waitUntilEnabled(
+ page,
+ create,
+ "peer request stayed blocked after accepting terms",
+ );
await create.click();
await page
.getByRole("heading", { name: "Share payment request" })