taler-typescript-core

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

commit c405f5e36043699d20f3c45680e0e589a7622bc0
parent c5b3c8e2172062e91659f10837c60ad51364d5f2
Author: Florian Dold <florian@dold.me>
Date:   Mon, 22 Sep 2025 15:10:41 +0200

donau: separate test for bug repro

Diffstat:
Apackages/taler-harness/src/integrationtests/test-donau-compat.ts | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/taler-harness/src/integrationtests/testrunner.ts | 4+++-
Apackages/taler-wallet-core/src/donau.ts | 25+++++++++++++++++++++++++
3 files changed, 176 insertions(+), 1 deletion(-)

diff --git a/packages/taler-harness/src/integrationtests/test-donau-compat.ts b/packages/taler-harness/src/integrationtests/test-donau-compat.ts @@ -0,0 +1,148 @@ +/* + This file is part of GNU Taler + (C) 2020-2025 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 { + ConfirmPayResultType, + DonauHttpClient, + j2s, + OrderOutputType, + OrderVersion, + PreparePayResultType, + succeedOrThrow, + TalerMerchantInstanceHttpClient, +} from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { defaultCoinConfig } from "../harness/denomStructures.js"; +import { + createSimpleTestkudosEnvironmentV3, + withdrawViaBankV3, +} from "../harness/environments.js"; +import { DonauService } from "../harness/harness-donau.js"; +import { GlobalTestState } from "../harness/harness.js"; + +/** + * Test that sets up DONAU but pays without enabling + * DONAU on the client side. + */ +export async function runDonauCompatTest(t: GlobalTestState) { + // Set up test environment + + const { + walletClient, + bankClient, + exchange, + merchant, + merchantAdminAccessToken, + commonDb, + } = await createSimpleTestkudosEnvironmentV3(t); + + const wres = await withdrawViaBankV3(t, { + walletClient, + bankClient, + amount: "TESTKUDOS:20", + exchange, + }); + await wres.withdrawalFinishedCond; + + const donau = DonauService.create(t, { + currency: "KUDOS", + database: commonDb.connStr, + httpPort: 8084, + name: "donau", + domain: "Bern", + }); + + donau.addCoinConfigList(defaultCoinConfig.map((x) => x("TESTKUDOS"))); + + await donau.start(); + + const donauClient = new DonauHttpClient(donau.baseUrl); + + const config = await donauClient.getConfig(); + console.log(`config: ${j2s(config)}`); + + const keys = await donauClient.getKeys(); + console.log(`keys: ${j2s(keys)}`); + + const merchantClient = new TalerMerchantInstanceHttpClient( + merchant.makeInstanceBaseUrl(), + ); + + const orderResp = succeedOrThrow( + await merchantClient.createOrder(merchantAdminAccessToken, { + order: { + version: OrderVersion.V1, + summary: "Test Donation", + choices: [ + { + amount: "TESTKUDOS:10", + outputs: [ + { + type: OrderOutputType.TaxReceipt, + amount: "TESTKUDOS:5", + donau_urls: [donau.baseUrl], + }, + ], + }, + ], + }, + }), + ); + + console.log(`order resp: ${j2s(orderResp)}`); + + let orderStatus = succeedOrThrow( + await merchantClient.getOrderDetails( + merchantAdminAccessToken, + orderResp.order_id, + ), + ); + + t.assertTrue(orderStatus.order_status === "unpaid"); + + const preparePayResult = await walletClient.call( + WalletApiOperation.PreparePayForUri, + { + talerPayUri: orderStatus.taler_pay_uri, + }, + ); + + t.assertTrue( + preparePayResult.status === PreparePayResultType.PaymentPossible, + ); + + const r2 = await walletClient.call(WalletApiOperation.ConfirmPay, { + transactionId: preparePayResult.transactionId, + }); + + t.assertDeepEqual(r2.type, ConfirmPayResultType.Done); + + // Check if payment was successful. + + orderStatus = succeedOrThrow( + await merchantClient.getOrderDetails( + merchantAdminAccessToken, + orderResp.order_id, + ), + ); + + t.assertDeepEqual(orderStatus.order_status, "paid"); +} + +runDonauCompatTest.suites = ["donau"]; diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -51,6 +51,8 @@ import { runDepositLargeTest } from "./test-deposit-large.js"; import { runDepositMergeTest } from "./test-deposit-merge.js"; import { runDepositTooLargeTest } from "./test-deposit-too-large.js"; import { runDepositTest } from "./test-deposit.js"; +import { runDonauCompatTest } from "./test-donau-compat.js"; +import { runDonauTest } from "./test-donau.js"; import { runExchangeDepositTest } from "./test-exchange-deposit.js"; import { runExchangeKycAuthTest } from "./test-exchange-kyc-auth.js"; import { runExchangeManagementFaultTest } from "./test-exchange-management-fault.js"; @@ -196,7 +198,6 @@ import { runWithdrawalHugeTest } from "./test-withdrawal-huge.js"; import { runWithdrawalIdempotentTest } from "./test-withdrawal-idempotent.js"; import { runWithdrawalManualTest } from "./test-withdrawal-manual.js"; import { runWithdrawalPrepareTest } from "./test-withdrawal-prepare.js"; -import { runDonauTest } from "./test-donau.js"; /** * Test runner. @@ -378,6 +379,7 @@ const allTests: TestMainFunction[] = [ runMerchantAcctselTest, runLibeufinConversionTest, runDenomLostComplexTest, + runDonauCompatTest, runDonauTest, ]; diff --git a/packages/taler-wallet-core/src/donau.ts b/packages/taler-wallet-core/src/donau.ts @@ -0,0 +1,25 @@ +/* + This file is part of GNU Taler + (C) 2025 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/> + */ + +import { EmptyObject, SetDonauRequest } from "@gnu-taler/taler-util"; +import { WalletExecutionContext } from "./index.js"; + +export async function handleSetDonau( + wex: WalletExecutionContext, + req: SetDonauRequest, +): Promise<EmptyObject> { + throw Error("not implemented"); +}