diff options
author | Florian Dold <florian@dold.me> | 2024-03-05 10:30:25 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-03-05 10:30:30 +0100 |
commit | 63aedafd841f3a3d7d3b7974d4e5b8fbd02afd3d (patch) | |
tree | 98a92ffb670e63f2253ee9b2a068f7234634eda2 | |
parent | 187031b9336e3c81aaa05c79e345adf5ac997980 (diff) |
wallet-core: have balance item even on zero balance
Also add a test for this.
5 files changed, 76 insertions, 3 deletions
diff --git a/packages/taler-harness/src/harness/denomStructures.ts b/packages/taler-harness/src/harness/denomStructures.ts index b12857c7e..2d5e719b0 100644 --- a/packages/taler-harness/src/harness/denomStructures.ts +++ b/packages/taler-harness/src/harness/denomStructures.ts @@ -136,7 +136,7 @@ export function makeNoFeeCoinConfig(curr: string): CoinConfig[] { const ct = 2 ** i; const unit = Math.floor(ct / 100); - const cent = ct % 100; + const cent = `${ct % 100}`.padStart(2, "0"); cc.push({ cipher: "RSA", diff --git a/packages/taler-harness/src/integrationtests/test-wallet-balance-zero.ts b/packages/taler-harness/src/integrationtests/test-wallet-balance-zero.ts new file mode 100644 index 000000000..7d65b60cf --- /dev/null +++ b/packages/taler-harness/src/integrationtests/test-wallet-balance-zero.ts @@ -0,0 +1,64 @@ +/* + 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 { j2s } from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { makeNoFeeCoinConfig } from "../harness/denomStructures.js"; +import { GlobalTestState } from "../harness/harness.js"; +import { + createSimpleTestkudosEnvironmentV2, + makeTestPaymentV2, + withdrawViaBankV2, +} from "../harness/helpers.js"; + +/** + * Related bugs: + * https://bugs.taler.net/n/8323 + */ +export async function runWalletBalanceZeroTest(t: GlobalTestState) { + // Set up test environment + + const coinConfig = makeNoFeeCoinConfig("TESTKUDOS"); + console.log(`coin config ${j2s(coinConfig)}`); + const { merchant, walletClient, exchange, bank } = + await createSimpleTestkudosEnvironmentV2(t, coinConfig); + + const wres = await withdrawViaBankV2(t, { + amount: "TESTKUDOS:10", + bank, + exchange, + walletClient, + }); + await wres.withdrawalFinishedCond; + + await makeTestPaymentV2(t, { + walletClient, + merchant, + order: { + summary: "Hello, World!", + amount: "TESTKUDOS:10", + }, + }); + + const bal = await walletClient.call(WalletApiOperation.GetBalances, {}); + console.log(`${j2s(bal)}`); + t.assertAmountEquals(bal.balances[0].available, "TESTKUDOS:0"); +} + +runWalletBalanceZeroTest.suites = ["wallet"]; diff --git a/packages/taler-harness/src/integrationtests/test-wallet-balance.ts b/packages/taler-harness/src/integrationtests/test-wallet-balance.ts index c4ca94dc0..0e4452892 100644 --- a/packages/taler-harness/src/integrationtests/test-wallet-balance.ts +++ b/packages/taler-harness/src/integrationtests/test-wallet-balance.ts @@ -32,7 +32,9 @@ import { } from "../harness/helpers.js"; /** - * Test for wallet balance error messages / different types of insufficient balance. + * Test wallet: + * - balance error messages + * - different types of insufficient balance. * * Related bugs: * https://bugs.taler.net/n/7299 diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts index 07bf8e34d..803e68e6b 100644 --- a/packages/taler-harness/src/integrationtests/testrunner.ts +++ b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -87,6 +87,7 @@ 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 { runWalletBalanceZeroTest } from "./test-wallet-balance-zero.js"; import { runWalletBalanceTest } from "./test-wallet-balance.js"; import { runWalletCliTerminationTest } from "./test-wallet-cli-termination.js"; import { runWalletConfigTest } from "./test-wallet-config.js"; @@ -202,6 +203,7 @@ const allTests: TestMainFunction[] = [ runWalletConfigTest, runWalletObservabilityTest, runWalletDevExperimentsTest, + runWalletBalanceZeroTest, ]; export interface TestRunSpec { diff --git a/packages/taler-wallet-core/src/balance.ts b/packages/taler-wallet-core/src/balance.ts index 3b53699ac..6dc0783c0 100644 --- a/packages/taler-wallet-core/src/balance.ts +++ b/packages/taler-wallet-core/src/balance.ts @@ -80,7 +80,7 @@ import { getExchangeScopeInfo, getExchangeWireDetailsInTx, } from "./exchanges.js"; -import { InternalWalletState, WalletExecutionContext } from "./wallet.js"; +import { WalletExecutionContext } from "./wallet.js"; /** * Logger. @@ -178,6 +178,10 @@ class BalancesStore { return this.balanceStore[balanceKey]; } + async addZero(currency: string, exchangeBaseUrl: string): Promise<void> { + await this.initBalance(currency, exchangeBaseUrl); + } + async addAvailable( currency: string, exchangeBaseUrl: string, @@ -304,6 +308,7 @@ export async function getBalancesInsideTransaction( await tx.coinAvailability.iter().forEachAsync(async (ca) => { const count = ca.visibleCoinCount ?? 0; + await balanceStore.addZero(ca.currency, ca.exchangeBaseUrl); for (let i = 0; i < count; i++) { await balanceStore.addAvailable( ca.currency, |