aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/testing.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2023-07-01 00:52:14 +0200
committerFlorian Dold <florian@dold.me>2023-07-01 00:52:14 +0200
commitf93ab03a1b946af441e35b9c057f129d25311273 (patch)
tree063624453ae0b6a38f859bd530ab0a1e29db93fb /packages/taler-wallet-core/src/operations/testing.ts
parent7a18e12a175856b3d17d2bb70ec549004c281ff5 (diff)
downloadwallet-core-f93ab03a1b946af441e35b9c057f129d25311273.tar.xz
wallet-core: get rid of internal runUntilDone usages
Diffstat (limited to 'packages/taler-wallet-core/src/operations/testing.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/testing.ts61
1 files changed, 46 insertions, 15 deletions
diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts
index 2a3584a0a..8c84702b8 100644
--- a/packages/taler-wallet-core/src/operations/testing.ts
+++ b/packages/taler-wallet-core/src/operations/testing.ts
@@ -68,7 +68,7 @@ import {
} from "./pay-peer-push-credit.js";
import { initiatePeerPushDebit } from "./pay-peer-push-debit.js";
import { OpenedPromise, openPromise } from "../index.js";
-import { getTransactionById } from "./transactions.js";
+import { getTransactionById, getTransactions } from "./transactions.js";
const logger = new Logger("operations/testing.ts");
@@ -378,7 +378,7 @@ export async function runIntegrationTest(
bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.info("done withdrawing test balance");
const balance = await getBalances(ws);
@@ -393,7 +393,7 @@ export async function runIntegrationTest(
await makePayment(ws, myMerchant, args.amountToSpend, "hello world");
// Wait until the refresh is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("withdrawing test balance for refund");
const withdrawAmountTwo = Amounts.parseOrThrow(`${currency}:18`);
@@ -408,7 +408,7 @@ export async function runIntegrationTest(
});
// Wait until the withdraw is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
const { orderId: refundOrderId } = await makePayment(
ws,
@@ -432,7 +432,7 @@ export async function runIntegrationTest(
logger.trace("integration test: applied refund");
// Wait until the refund is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("integration test: making payment after refund");
@@ -445,21 +445,52 @@ export async function runIntegrationTest(
logger.trace("integration test: make payment done");
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("integration test: all done!");
}
async function waitUntilDone(ws: InternalWalletState): Promise<void> {
+ logger.info("waiting until all transactions are in a final state");
+ ws.ensureTaskLoopRunning();
let p: OpenedPromise<void> | undefined = undefined;
- ws.addNotificationListener((notif) => {
+ const cancelNotifs = ws.addNotificationListener((notif) => {
if (!p) {
return;
}
if (notif.type === NotificationType.TransactionStateTransition) {
p.resolve();
}
+ // Work-around, refresh transactions don't properly emit transition notifications yet.
+ if (notif.type === NotificationType.PendingOperationProcessed) {
+ p.resolve();
+ }
});
+ while (1) {
+ p = openPromise();
+ const txs = await getTransactions(ws, {
+ includeRefreshes: true,
+ });
+ let finished = true;
+ for (const tx of txs.transactions) {
+ switch (tx.txState.major) {
+ case TransactionMajorState.Pending:
+ case TransactionMajorState.Aborting:
+ finished = false;
+ logger.info(
+ `continuing waiting, ${tx.transactionId} in ${tx.txState.major}(${tx.txState.minor})`,
+ );
+ break;
+ }
+ }
+ if (finished) {
+ break;
+ }
+ // Wait until transaction state changed
+ await p.promise;
+ }
+ cancelNotifs();
+ logger.info("done waiting until all transactions are in a final state");
}
async function waitUntilPendingReady(
@@ -469,7 +500,7 @@ async function waitUntilPendingReady(
logger.info(`starting waiting for ${transactionId} to be in pending(ready)`);
ws.ensureTaskLoopRunning();
let p: OpenedPromise<void> | undefined = undefined;
- ws.addNotificationListener((notif) => {
+ const cancelNotifs = ws.addNotificationListener((notif) => {
if (!p) {
return;
}
@@ -492,7 +523,7 @@ async function waitUntilPendingReady(
await p.promise;
}
logger.info(`done waiting for ${transactionId} to be in pending(ready)`);
- // FIXME: Remove listener!
+ cancelNotifs();
}
export async function runIntegrationTest2(
@@ -516,7 +547,7 @@ export async function runIntegrationTest2(
bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.info("done withdrawing test balance");
const balance = await getBalances(ws);
@@ -536,7 +567,7 @@ export async function runIntegrationTest2(
);
// Wait until the refresh is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("withdrawing test balance for refund");
const withdrawAmountTwo = Amounts.parseOrThrow(`${currency}:18`);
@@ -551,7 +582,7 @@ export async function runIntegrationTest2(
});
// Wait until the withdraw is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
const { orderId: refundOrderId } = await makePayment(
ws,
@@ -575,7 +606,7 @@ export async function runIntegrationTest2(
logger.trace("integration test: applied refund");
// Wait until the refund is done
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("integration test: making payment after refund");
@@ -588,7 +619,7 @@ export async function runIntegrationTest2(
logger.trace("integration test: make payment done");
- await ws.runUntilDone();
+ await waitUntilDone(ws);
const peerPushInit = await initiatePeerPushDebit(ws, {
partialContractTerms: {
@@ -636,7 +667,7 @@ export async function runIntegrationTest2(
peerPullPaymentIncomingId: peerPullInc.peerPullPaymentIncomingId,
});
- await ws.runUntilDone();
+ await waitUntilDone(ws);
logger.trace("integration test: all done!");
}