commit 3c497f4ccbd41f2362f65f9d222ac61500492551
parent 8eaa49c812b86b1009fe2e5f9fb1579180bee8df
Author: Florian Dold <florian@dold.me>
Date: Fri, 20 Mar 2026 16:52:18 +0100
-fix tests/transactions
Diffstat:
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();