summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-02-19 23:34:30 +0100
committerFlorian Dold <florian@dold.me>2024-02-19 23:34:30 +0100
commita4d0ad4274c79803f75d53a3642cec163ccf4e53 (patch)
tree04f6cb183fe37dd062970c0c000fcfadf5a974b3
parent862ac9a16aa891c26355f9ad5858283c3aa029d6 (diff)
downloadwallet-core-a4d0ad4274c79803f75d53a3642cec163ccf4e53.tar.gz
wallet-core-a4d0ad4274c79803f75d53a3642cec163ccf4e53.tar.bz2
wallet-core-a4d0ad4274c79803f75d53a3642cec163ccf4e53.zip
wallet-core: emit missing balance-change notification, test for it
-rw-r--r--packages/taler-harness/src/integrationtests/test-wallet-balance-notifications.ts85
-rw-r--r--packages/taler-harness/src/integrationtests/testrunner.ts2
-rw-r--r--packages/taler-wallet-core/src/withdraw.ts10
3 files changed, 97 insertions, 0 deletions
diff --git a/packages/taler-harness/src/integrationtests/test-wallet-balance-notifications.ts b/packages/taler-harness/src/integrationtests/test-wallet-balance-notifications.ts
new file mode 100644
index 000000000..66093410f
--- /dev/null
+++ b/packages/taler-harness/src/integrationtests/test-wallet-balance-notifications.ts
@@ -0,0 +1,85 @@
+/*
+ This file is part of GNU Taler
+ (C) 2020 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 {
+ NotificationType,
+ TalerCorebankApiClient,
+ TransactionMajorState,
+} from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
+import { GlobalTestState } from "../harness/harness.js";
+import { createSimpleTestkudosEnvironmentV2 } from "../harness/helpers.js";
+
+/**
+ * Test behavior when an order is deleted while the wallet is paying for it.
+ */
+export async function runWalletBalanceNotificationsTest(t: GlobalTestState) {
+ // Set up test environment
+
+ const { walletClient, bank, exchange, merchant } =
+ await createSimpleTestkudosEnvironmentV2(t);
+
+ const amount = "TESTKUDOS:20";
+
+ const bankClient = new TalerCorebankApiClient(bank.corebankApiBaseUrl);
+
+ const user = await bankClient.createRandomBankUser();
+ const wop = await bankClient.createWithdrawalOperation(user.username, amount);
+
+ // Hand it to the wallet
+
+ await walletClient.call(WalletApiOperation.GetWithdrawalDetailsForUri, {
+ talerWithdrawUri: wop.taler_withdraw_uri,
+ });
+
+ // Withdraw (AKA select)
+
+ const balanceChangedNotif1 = walletClient.waitForNotificationCond(
+ (x) => x.type === NotificationType.BalanceChange,
+ );
+
+ const acceptRes = await walletClient.call(
+ WalletApiOperation.AcceptBankIntegratedWithdrawal,
+ {
+ exchangeBaseUrl: exchange.baseUrl,
+ talerWithdrawUri: wop.taler_withdraw_uri,
+ },
+ );
+
+ t.logStep("wait-balance-notif-1");
+ await balanceChangedNotif1;
+ t.logStep("done-wait-balance-notif-1");
+
+ const withdrawalFinishedCond = walletClient.waitForNotificationCond(
+ (x) =>
+ x.type === NotificationType.TransactionStateTransition &&
+ x.newTxState.major === TransactionMajorState.Done &&
+ x.transactionId === acceptRes.transactionId,
+ );
+
+ // Confirm it
+
+ await bankClient.confirmWithdrawalOperation(user.username, {
+ withdrawalOperationId: wop.withdrawal_id,
+ });
+
+ await withdrawalFinishedCond;
+}
+
+runWalletBalanceNotificationsTest.suites = ["wallet"];
diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts
index f4401c63c..1fb987802 100644
--- a/packages/taler-harness/src/integrationtests/testrunner.ts
+++ b/packages/taler-harness/src/integrationtests/testrunner.ts
@@ -85,6 +85,7 @@ import { runTimetravelWithdrawTest } from "./test-timetravel-withdraw.js";
import { runTermOfServiceFormatTest } from "./test-tos-format.js";
import { runWalletBackupBasicTest } from "./test-wallet-backup-basic.js";
import { runWalletBackupDoublespendTest } from "./test-wallet-backup-doublespend.js";
+import { runWalletBalanceNotificationsTest } from "./test-wallet-balance-notifications.js";
import { runWalletBalanceTest } from "./test-wallet-balance.js";
import { runWalletCliTerminationTest } from "./test-wallet-cli-termination.js";
import { runWalletCryptoWorkerTest } from "./test-wallet-cryptoworker.js";
@@ -192,6 +193,7 @@ const allTests: TestMainFunction[] = [
runWalletRefreshTest,
runWalletCliTerminationTest,
runOtpTest,
+ runWalletBalanceNotificationsTest,
];
export interface TestRunSpec {
diff --git a/packages/taler-wallet-core/src/withdraw.ts b/packages/taler-wallet-core/src/withdraw.ts
index bfcf23588..2e05f1221 100644
--- a/packages/taler-wallet-core/src/withdraw.ts
+++ b/packages/taler-wallet-core/src/withdraw.ts
@@ -2644,6 +2644,11 @@ export async function acceptWithdrawalFromUri(
const ctx = new WithdrawTransactionContext(ws, withdrawalGroupId);
+ ws.notify({
+ type: NotificationType.BalanceChange,
+ hintTransactionId: ctx.transactionId,
+ });
+
await waitWithdrawalRegistered(ws, ctx);
ws.taskScheduler.startShepherdTask(ctx.taskId);
@@ -2896,6 +2901,11 @@ export async function createManualWithdrawal(
},
);
+ ws.notify({
+ type: NotificationType.BalanceChange,
+ hintTransactionId: ctx.transactionId,
+ });
+
ws.taskScheduler.startShepherdTask(ctx.taskId);
return {