taler-typescript-core

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

commit 7f7e02836c1ab5faf4999404c71152afca869f61
parent e79cb11dc9890ca4b061d1de5118381ec843d186
Author: Florian Dold <florian@dold.me>
Date:   Sat, 30 May 2026 00:55:02 +0200

remove slow and redundant test, minor confirmPay fixes in tests

Diffstat:
Mpackages/taler-harness/src/integrationtests/test-paivana.ts | 39+++++++++++++++++----------------------
Dpackages/taler-harness/src/integrationtests/test-payment-fault.ts | 249-------------------------------------------------------------------------------
Mpackages/taler-harness/src/integrationtests/test-payment-transient.ts | 25++++++++++++++-----------
Mpackages/taler-harness/src/integrationtests/testrunner.ts | 2--
4 files changed, 31 insertions(+), 284 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/test-paivana.ts b/packages/taler-harness/src/integrationtests/test-paivana.ts @@ -18,26 +18,19 @@ * Imports. */ import { - ConfirmPayResultType, - encodeCrock, - getRandomBytes, Logger, PreparePayResultType, Result, - setPrintHttpRequestAsCurl, - stringToBytes, succeedOrThrow, - TalerErrorCode, TalerMerchantInstanceHttpClient, - TalerProtocolTimestamp, TalerUriAction, TalerUris, - timestampRoundedToBuffer, + TransactionMajorState, + TransactionType, WalletNotification, } from "@gnu-taler/taler-util"; import { createPlatformHttpLib } from "@gnu-taler/taler-util/http"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { HashSha256 } from "../../../taler-util/src/sha256.js"; import { createSimpleTestkudosEnvironmentV3, withdrawViaBankV3, @@ -131,28 +124,30 @@ export async function runPaivanaTest(t: GlobalTestState) { ); t.assertTrue(payStatus.status === PreparePayResultType.PaymentPossible); - const startPayment = await walletClient.call( - WalletApiOperation.ConfirmPay, - { - transactionId: payStatus.transactionId, - }, - ); + await walletClient.call(WalletApiOperation.ConfirmPay, { + transactionId: payStatus.transactionId, + }); - t.assertTrue(startPayment.type === ConfirmPayResultType.Pending); await walletClient.call( WalletApiOperation.TestingWaitTransactionsFinal, {}, ); - const payment = await walletClient.call(WalletApiOperation.ConfirmPay, { - transactionId: payStatus.transactionId, - }); - t.assertTrue(payment.type === ConfirmPayResultType.Done); - logger.info("5) order paid", payment.contractTerms.fulfillment_url); + const paymentTx = await walletClient.call( + WalletApiOperation.GetTransactionById, + { + transactionId: payStatus.transactionId, + includeContractTerms: true, + }, + ); + t.assertDeepEqual(paymentTx.txState.major, TransactionMajorState.Done); + t.assertTrue(paymentTx.type === TransactionType.Payment); + t.assertTrue(paymentTx.contractTerms != null); + logger.info("5) order paid", paymentTx.contractTerms.fulfillment_url); const orderStatus = succeedOrThrow( await merchantClient.getOrderDetails( merchantAdminAccessToken, - payment.contractTerms.order_id, + paymentTx.contractTerms.order_id, { sessionId: session.paivanaId, }, diff --git a/packages/taler-harness/src/integrationtests/test-payment-fault.ts b/packages/taler-harness/src/integrationtests/test-payment-fault.ts @@ -1,249 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2020, 2026 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/> - */ - -/** - * Sample fault injection test. - */ - -/** - * Imports. - */ -import { - ConfirmPayResultType, - succeedOrThrow, - TalerCorebankApiClient, - TalerMerchantInstanceHttpClient, -} from "@gnu-taler/taler-util"; -import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { defaultCoinConfig } from "../harness/denomStructures.js"; -import { - createWalletDaemonWithClient, - withdrawViaBankV3, -} from "../harness/environments.js"; -import { - FaultInjectedExchangeService, - FaultInjectionRequestContext, - FaultInjectionResponseContext, -} from "../harness/faultInjection.js"; -import { - BankService, - ExchangeService, - getTestHarnessPaytoForLabel, - GlobalTestState, - MerchantService, - setupDb, -} from "../harness/harness.js"; - -/** - * FIXME: Clarify why this test is necessary. - * Possible duplication with payment-transient. - */ -export async function runPaymentFaultTest(t: GlobalTestState) { - // Set up test environment - - const db = await setupDb(t); - - const bank = await BankService.create(t, { - allowRegistrations: true, - currency: "TESTKUDOS", - database: db.connStr, - httpPort: 8082, - }); - - const exchange = ExchangeService.create(t, { - name: "testexchange-1", - currency: "TESTKUDOS", - httpPort: 8081, - database: db.connStr, - }); - - let receiverName = "Exchange"; - let exchangeBankUsername = "exchange"; - let exchangeBankPassword = "mypw-password"; - let exchangePaytoUri = getTestHarnessPaytoForLabel(exchangeBankUsername); - - await exchange.addBankAccount("1", { - wireGatewayAuth: { - type: "basic", - username: exchangeBankUsername, - password: exchangeBankPassword, - }, - wireGatewayApiBaseUrl: new URL( - "accounts/exchange/taler-wire-gateway/", - bank.baseUrl, - ).href, - accountPaytoUri: exchangePaytoUri, - }); - - const faultyExchange = new FaultInjectedExchangeService(t, exchange, 8091); - // Base URL must contain port that the proxy is listening on. - await exchange.modifyConfig(async (config) => { - config.setString("exchange", "base_url", "http://localhost:8091/"); - }); - - bank.setSuggestedExchange(faultyExchange, exchangePaytoUri); - - await bank.start(); - - await bank.pingUntilAvailable(); - - const bankClient = new TalerCorebankApiClient(bank.corebankApiBaseUrl, { - auth: { - username: "admin", - password: "admin-password", - }, - }); - - await bankClient.registerAccountExtended({ - name: receiverName, - password: exchangeBankPassword, - username: exchangeBankUsername, - is_taler_exchange: true, - payto_uri: exchangePaytoUri, - }); - - exchange.addOfferedCoins(defaultCoinConfig); - - await exchange.start(); - await exchange.pingUntilAvailable(); - - // Print all requests to the exchange - faultyExchange.faultProxy.addFault({ - async modifyRequest(ctx: FaultInjectionRequestContext) { - console.log("got request", ctx); - }, - async modifyResponse(ctx: FaultInjectionResponseContext) { - console.log("got response", ctx); - }, - }); - - const merchant = await MerchantService.create(t, { - name: "testmerchant-1", - httpPort: 8083, - database: db.connStr, - }); - - merchant.addExchange(faultyExchange); - - await merchant.start(); - await merchant.pingUntilAvailable(); - - const { accessToken: merchantAdminAccessToken } = - await merchant.addInstanceWithWireAccount({ - id: "admin", - name: "Default Instance", - paytoUris: [getTestHarnessPaytoForLabel("merchant-default")], - }); - - const merchantClient = new TalerMerchantInstanceHttpClient( - merchant.makeInstanceBaseUrl(), - ); - - console.log("setup done!"); - - const { walletClient } = await createWalletDaemonWithClient(t, { - name: "default", - }); - - await walletClient.call(WalletApiOperation.GetBalances, {}); - - const wres = await withdrawViaBankV3(t, { - walletClient, - bankClient, - exchange: faultyExchange, - amount: "TESTKUDOS:20", - }); - - await wres.withdrawalFinishedCond; - - // Set up order. - - const orderResp = succeedOrThrow( - await merchantClient.createOrder(merchantAdminAccessToken, { - order: { - summary: "Buy me!", - amount: "TESTKUDOS:5", - fulfillment_url: "taler://fulfillment-success/thx", - }, - }), - ); - - let orderStatus = succeedOrThrow( - await merchantClient.getOrderDetails( - merchantAdminAccessToken, - orderResp.order_id, - ), - ); - - t.assertTrue(orderStatus.order_status === "unpaid"); - - // Make wallet pay for the order - - const prepResp = await walletClient.call( - WalletApiOperation.PreparePayForUri, - { - talerPayUri: orderStatus.taler_pay_uri, - }, - ); - - // Drop one response from the exchange. - let faultCount = 0; - faultyExchange.faultProxy.addFault({ - async modifyResponse(ctx: FaultInjectionResponseContext) { - console.log(`in modifyResponse for ${ctx.request.requestUrl}`); - if ( - !ctx.request.requestUrl.endsWith("/deposit") && - !ctx.request.requestUrl.endsWith("/batch-deposit") - ) { - return; - } - if (faultCount < 1) { - console.log(`blocking /deposit request #${faultCount}`); - faultCount++; - ctx.dropResponse = true; - } else { - console.log(`letting through /deposit request #${faultCount}`); - } - }, - }); - - // confirmPay won't work, as the exchange is unreachable - - const confirmPayResp = await walletClient.call( - WalletApiOperation.ConfirmPay, - { - transactionId: prepResp.transactionId, - }, - ); - - t.assertDeepEqual(confirmPayResp.type, ConfirmPayResultType.Pending); - - await walletClient.call(WalletApiOperation.TestingWaitTransactionsFinal, {}); - - // Check if payment was successful. - - orderStatus = succeedOrThrow( - await merchantClient.getOrderDetails( - merchantAdminAccessToken, - orderResp.order_id, - ), - ); - - t.assertTrue(orderStatus.order_status === "paid"); -} - -runPaymentFaultTest.suites = ["wallet"]; -runPaymentFaultTest.timeoutMs = 120000; diff --git a/packages/taler-harness/src/integrationtests/test-payment-transient.ts b/packages/taler-harness/src/integrationtests/test-payment-transient.ts @@ -24,6 +24,7 @@ import { TalerErrorCode, TalerErrorDetail, TalerMerchantInstanceHttpClient, + TransactionMajorState, URL, codecForMerchantOrderStatusUnpaid, succeedOrThrow, @@ -131,7 +132,8 @@ export async function runPaymentTransientTest(t: GlobalTestState) { publicOrderStatusResp.json(), ); - let faultInjected = false; + let injectFault = true; + let numFaultResponses = 0; faultyMerchant.faultProxy.addFault({ async modifyResponse(ctx: FaultInjectionResponseContext) { @@ -141,11 +143,10 @@ export async function runPaymentTransientTest(t: GlobalTestState) { if (!url.pathname.endsWith("/pay")) { return; } - if (faultInjected) { + if (!injectFault) { console.log("not injecting pay fault"); return; } - faultInjected = true; console.log("injecting pay fault"); const err: TalerErrorDetail = { code: TalerErrorCode.GENERIC_DB_COMMIT_FAILED, @@ -153,6 +154,7 @@ export async function runPaymentTransientTest(t: GlobalTestState) { }; ctx.responseBody = Buffer.from(JSON.stringify(err)); ctx.statusCode = 500; + numFaultResponses++; }, }); @@ -166,16 +168,17 @@ export async function runPaymentTransientTest(t: GlobalTestState) { console.log(confirmPayResp); t.assertTrue(confirmPayResp.type === ConfirmPayResultType.Pending); - t.assertTrue(faultInjected); + t.assertTrue(numFaultResponses > 0); - const confirmPayRespTwo = await walletClient.call( - WalletApiOperation.ConfirmPay, - { - transactionId: proposalTransactionId, - }, - ); + // Stop injecting faults + injectFault = false; - t.assertTrue(confirmPayRespTwo.type === ConfirmPayResultType.Done); + await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { + transactionId: confirmPayResp.transactionId, + txState: { + major: TransactionMajorState.Done, + }, + }); // Now ask the merchant if paid diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -136,7 +136,6 @@ import { runPaymentAbortTest } from "./test-payment-abort.js"; import { runPaymentClaimTest } from "./test-payment-claim.js"; import { runPaymentDeletedTest } from "./test-payment-deleted.js"; import { runPaymentExpiredTest } from "./test-payment-expired.js"; -import { runPaymentFaultTest } from "./test-payment-fault.js"; import { runPaymentForgettableTest } from "./test-payment-forgettable.js"; import { runPaymentIdempotencyTest } from "./test-payment-idempotency.js"; import { runPaymentMultipleTest } from "./test-payment-multiple.js"; @@ -269,7 +268,6 @@ const allTests: TestMainFunction[] = [ runMerchantRefundApiTest, runMerchantSpecPublicOrdersTest, runPaymentClaimTest, - runPaymentFaultTest, runPaymentForgettableTest, runPaymentIdempotencyTest, runPaymentMultipleTest,