taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 3c497f4ccbd41f2362f65f9d222ac61500492551
parent 8eaa49c812b86b1009fe2e5f9fb1579180bee8df
Author: Florian Dold <florian@dold.me>
Date:   Fri, 20 Mar 2026 16:52:18 +0100

-fix tests/transactions

Diffstat:
Mpackages/taler-harness/src/integrationtests/test-denom-unoffered.ts | 22++++++++++++++++++----
Mpackages/taler-harness/src/integrationtests/test-peer-pull.ts | 33++++++++++++++++++++++++++-------
Mpackages/taler-wallet-core/src/pay-merchant.ts | 10+++++-----
3 files changed, 49 insertions(+), 16 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/test-denom-unoffered.ts b/packages/taler-harness/src/integrationtests/test-denom-unoffered.ts @@ -18,11 +18,13 @@ * Imports. */ import { + j2s, Logger, PreparePayResultType, succeedOrThrow, TalerErrorCode, TalerMerchantInstanceHttpClient, + TransactionMajorState, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { @@ -36,8 +38,13 @@ const logger = new Logger("test-denom-unoffered"); export async function runDenomUnofferedTest(t: GlobalTestState) { // Set up test environment - const { walletClient, bankClient, exchange, merchant, merchantAdminAccessToken } = - await createSimpleTestkudosEnvironmentV3(t); + const { + walletClient, + bankClient, + exchange, + merchant, + merchantAdminAccessToken, + } = await createSimpleTestkudosEnvironmentV3(t); // Withdraw digital cash into the wallet. @@ -82,7 +89,10 @@ export async function runDenomUnofferedTest(t: GlobalTestState) { ); let orderStatus = succeedOrThrow( - await merchantClient.getOrderDetails(merchantAdminAccessToken, orderResp.order_id), + await merchantClient.getOrderDetails( + merchantAdminAccessToken, + orderResp.order_id, + ), ); t.assertTrue(orderStatus.order_status === "unpaid"); @@ -118,8 +128,12 @@ export async function runDenomUnofferedTest(t: GlobalTestState) { transactionId: confirmResp.transactionId, }); + t.assertDeepEqual(tx.txState.major, TransactionMajorState.Failed); + + logger.info(`fail reason: ${j2s(tx.failReason)}`); + t.assertDeepEqual( - (tx.abortReason?.errorDetails as any)?.code, + (tx.failReason?.errorDetails as any)?.code, TalerErrorCode.MERCHANT_GENERIC_EXCHANGE_UNEXPECTED_STATUS, ); diff --git a/packages/taler-harness/src/integrationtests/test-peer-pull.ts b/packages/taler-harness/src/integrationtests/test-peer-pull.ts @@ -194,24 +194,28 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), wallet2.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare2.transactionId, txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), wallet3.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare3.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Failed, }, + timeout: { seconds: 10 }, }), wallet4.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare4.transactionId, txState: { major: TransactionMajorState.Aborted, }, + timeout: { seconds: 10 }, }), ]); @@ -243,12 +247,14 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), wallet1.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare.transactionId, txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), ]); @@ -290,6 +296,7 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), Promise.race([ Promise.all([ @@ -298,26 +305,30 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), wallet3.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare3.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Failed, }, + timeout: { seconds: 10 }, }), ]), Promise.all([ wallet2.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare2.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Failed, }, + timeout: { seconds: 10 }, }), wallet3.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare3.transactionId, txState: { major: TransactionMajorState.Done, }, + timeout: { seconds: 10 }, }), ]), ]), @@ -350,18 +361,21 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Aborted, }, + timeout: { seconds: 10 }, }), wallet2.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare2.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Expired, }, + timeout: { seconds: 10 }, }), wallet3.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare3.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Expired, }, + timeout: { seconds: 10 }, }), ]); @@ -403,6 +417,7 @@ export async function runPeerPullTest(t: GlobalTestState) { major: TransactionMajorState.Aborting, minor: TransactionMinorState.DeletePurse, }, + timeout: { seconds: 10 }, }); // Restart the exchange for the remainder of the test await exchange.start(); @@ -411,6 +426,7 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Aborted, }, + timeout: { seconds: 10 }, }); } @@ -453,18 +469,21 @@ export async function runPeerPullTest(t: GlobalTestState) { txState: { major: TransactionMajorState.Expired, }, + timeout: { seconds: 10 }, }), wallet2.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare2.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Expired, }, + timeout: { seconds: 10 }, }), wallet3.call(WalletApiOperation.TestingWaitTransactionState, { transactionId: prepare3.transactionId, txState: { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Expired, }, + timeout: { seconds: 10 }, }), ]); diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts @@ -365,6 +365,8 @@ export class PayMerchantTransactionContext implements TransactionContext { proposalId: purchaseRec.proposalId, }), abortReason: purchaseRec.abortReason, + failReason: purchaseRec.failReason, + error: payRetryRec?.lastError ? payRetryRec?.lastError : undefined, info, contractTerms, refundQueryActive: @@ -3357,9 +3359,8 @@ async function processPurchasePay( } if (resp.status === HttpStatusCode.UnavailableForLegalReasons) { - logger.warn(`pay transaction aborted, merchant has KYC problems`); - await ctx.failTransaction( - purchase.purchaseStatus, + logger.warn(`pay transaction failed, merchant has KYC problems`); + await ctx.userAbortTransaction( makeTalerErrorDetail(TalerErrorCode.WALLET_PAY_MERCHANT_KYC_MISSING, { exchangeResponse: await resp.json(), }), @@ -3369,8 +3370,7 @@ async function processPurchasePay( if (resp.status === HttpStatusCode.Gone) { logger.warn(`pay transaction aborted, order expired`); - await ctx.failTransaction( - purchase.purchaseStatus, + await ctx.userAbortTransaction( makeTalerErrorDetail(TalerErrorCode.WALLET_PAY_MERCHANT_ORDER_GONE, {}), ); return TaskRunResult.progress();