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:
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,