diff options
author | Florian Dold <florian@dold.me> | 2023-07-01 00:52:14 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2023-07-01 00:52:14 +0200 |
commit | f93ab03a1b946af441e35b9c057f129d25311273 (patch) | |
tree | 063624453ae0b6a38f859bd530ab0a1e29db93fb /packages/taler-wallet-core/src/operations/testing.ts | |
parent | 7a18e12a175856b3d17d2bb70ec549004c281ff5 (diff) | |
download | wallet-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.ts | 61 |
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!"); } |