taler-typescript-core

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

commit 0c154d644dc2c809e56e50bf48b90663a0b17088
parent 16712a2c4530602277cb2ceaa1b2987420abb1ce
Author: Florian Dold <florian@dold.me>
Date:   Wed, 27 May 2026 11:18:19 +0200

harness: add merchant-refund-fees test

Issue: https://bugs.taler.net/n/11054

Diffstat:
Apackages/taler-harness/src/integrationtests/test-merchant-refund-fees.ts | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/taler-harness/src/integrationtests/testrunner.ts | 2++
2 files changed, 135 insertions(+), 0 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/test-merchant-refund-fees.ts b/packages/taler-harness/src/integrationtests/test-merchant-refund-fees.ts @@ -0,0 +1,133 @@ +/* + This file is part of GNU Taler + (C) 2021 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * Imports. + */ +import { + j2s, + succeedOrThrow, + TalerMerchantInstanceHttpClient, + TransactionMajorState, +} from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { + createSimpleTestkudosEnvironmentV3, + withdrawViaBankV4, +} from "../harness/environments.js"; +import { GlobalTestState } from "../harness/harness.js"; + +/** + * Test for refunds with deposits. + * + * https://bugs.taler.net/n/11054 + */ +export async function runMerchantRefundFeesTest(t: GlobalTestState) { + // Set up test environment + + const { + bankClient, + walletClient, + exchange, + merchant, + merchantAdminAccessToken, + bank, + } = await createSimpleTestkudosEnvironmentV3(t); + + // Withdraw digital cash into the wallet. + + t.assertTrue(bankClient !== undefined); + const wres = await withdrawViaBankV4(t, { + walletClient, + exchange, + amount: "TESTKUDOS:20", + bank, + }); + await wres.withdrawalFinishedCond; + + const merchantClient = new TalerMerchantInstanceHttpClient( + merchant.makeInstanceBaseUrl(), + ); + + const orderResp = succeedOrThrow( + await merchantClient.createOrder(merchantAdminAccessToken, { + order: { + amount: "TESTKUDOS:10", + summary: "test", + }, + }), + ); + + const orderStatus = succeedOrThrow( + await merchantClient.getOrderDetails( + merchantAdminAccessToken, + orderResp.order_id, + ), + ); + t.assertDeepEqual(orderStatus.order_status, "unpaid"); + + const prepResp = await walletClient.call( + WalletApiOperation.PreparePayForUri, + { + talerPayUri: orderStatus.taler_pay_uri, + }, + ); + await walletClient.call(WalletApiOperation.ConfirmPay, { + transactionId: prepResp.transactionId, + }); + await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { + transactionId: prepResp.transactionId, + txState: { + major: TransactionMajorState.Done, + }, + }); + + const refundResp = succeedOrThrow( + await merchantClient.addRefund( + merchantAdminAccessToken, + orderResp.order_id, + { + reason: "foo", + refund: "TESTKUDOS:10", + }, + ), + ); + await walletClient.call(WalletApiOperation.StartRefundQueryForUri, { + talerRefundUri: refundResp.taler_refund_uri, + }); + await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { + transactionId: prepResp.transactionId, + txState: { + major: TransactionMajorState.Done, + }, + }); + const bal = await walletClient.call(WalletApiOperation.GetBalances, {}); + console.log(j2s(bal)); + // This is the request that caused a merchant crash in + // https://bugs.taler.net/n/11054 + const orderStatus2 = succeedOrThrow( + await merchantClient.getOrderDetails( + merchantAdminAccessToken, + orderResp.order_id, + ), + ); + console.log(j2s(orderStatus2)); + t.assertDeepEqual(orderStatus2.order_status, "paid"); + // Wallet must have picked up refund by now. + t.assertDeepEqual(orderStatus2.refund_pending, false); +} + +runMerchantRefundFeesTest.suites = ["merchant"]; diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -118,6 +118,7 @@ import { runMerchantKycAuthMultiTest } from "./test-merchant-kyc-auth-multi.js"; import { runMerchantLongpollingTest } from "./test-merchant-longpolling.js"; import { runMerchantPaytoReuseTest } from "./test-merchant-payto-reuse.js"; import { runMerchantRefundApiTest } from "./test-merchant-refund-api.js"; +import { runMerchantRefundFeesTest } from "./test-merchant-refund-fees.js"; import { runMerchantReportsTest } from "./test-merchant-reports.js"; import { runMerchantSelfProvisionActivationTwoBankAccountsTest } from "./test-merchant-self-provision-activation-two-bank-account.js"; import { runMerchantSelfProvisionActivationTest } from "./test-merchant-self-provision-activation.js"; @@ -440,6 +441,7 @@ const allTests: TestMainFunction[] = [ runKycFormValidationTest, runKycMerchantWalletReuseTest, runWithdrawalShortenTest, + runMerchantRefundFeesTest, ]; export interface TestRunSpec {