taler-typescript-core

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

commit 81644e3d24ff350636955ef1f518c0f50ba05278
parent 7ea4ae8015e945c66e82f57d3834196fd2d215b7
Author: Florian Dold <dold@taler.net>
Date:   Sun, 20 Sep 2026 00:27:51 +0200

wallet-cli: show abort and failure reasons in one-line history

Diffstat:
Mpackages/taler-wallet-cli/src/transactions-pretty.test.ts | 16++++++++++++++++
Mpackages/taler-wallet-cli/src/transactions-pretty.ts | 6++++++
2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/packages/taler-wallet-cli/src/transactions-pretty.test.ts b/packages/taler-wallet-cli/src/transactions-pretty.test.ts @@ -19,6 +19,7 @@ import { TransactionMajorState, TransactionMinorState, TransactionType, + TalerErrorCode, } from "@gnu-taler/taler-util"; import assert from "node:assert"; import { test } from "node:test"; @@ -121,3 +122,18 @@ test("the oneline view stays compact", () => { "#payment:7 payment KUDOS:5.01 [dialog:proposed] — Lunch — The Café — Next: the merchant's offer is waiting to be accepted", ]); }); + +test("one-line transactions include durable abort and failure reasons", () => { + const lines = formatPrettyTransaction( + makeTx({ + txState: { major: TransactionMajorState.Failed }, + abortReason: { code: TalerErrorCode.WALLET_TRANSACTION_ABORTED_BY_USER }, + failReason: { code: TalerErrorCode.WALLET_TRANSACTION_RECOVERY_FAILED }, + }), + { actionable: false } as never, + false, + true, + ); + assert.match(lines[0], /Aborted:.*WALLET_TRANSACTION_ABORTED_BY_USER/); + assert.match(lines[0], /Failed:.*WALLET_TRANSACTION_RECOVERY_FAILED/); +}); diff --git a/packages/taler-wallet-cli/src/transactions-pretty.ts b/packages/taler-wallet-cli/src/transactions-pretty.ts @@ -124,6 +124,12 @@ export function formatPrettyTransaction( if (tx.error != null) { parts.push(`Error: ${summarizeTalerErrorDetail(tx.error)}`); } + if (tx.abortReason != null) { + parts.push(`Aborted: ${summarizeTalerErrorDetail(tx.abortReason)}`); + } + if (tx.failReason != null) { + parts.push(`Failed: ${summarizeTalerErrorDetail(tx.failReason)}`); + } return [parts.join(" — ")]; }