aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-harness/src/integrationtests/test-exchange-management.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-02-28 02:04:29 +0100
committerFlorian Dold <florian@dold.me>2024-02-28 02:04:40 +0100
commit8e716c3bff673a35e9f40cb54fca666aee0bd67b (patch)
tree8390a86e54d0fcb04bf1509e56fa72696081bc70 /packages/taler-harness/src/integrationtests/test-exchange-management.ts
parent8b88540037d6f5a6d2d8fa583c6a7d46e7fd6e04 (diff)
downloadwallet-core-8e716c3bff673a35e9f40cb54fca666aee0bd67b.tar.xz
wallet-core: fix exchange entry deletion, test it
Diffstat (limited to 'packages/taler-harness/src/integrationtests/test-exchange-management.ts')
-rw-r--r--packages/taler-harness/src/integrationtests/test-exchange-management.ts250
1 files changed, 22 insertions, 228 deletions
diff --git a/packages/taler-harness/src/integrationtests/test-exchange-management.ts b/packages/taler-harness/src/integrationtests/test-exchange-management.ts
index 37b490d6b..8e2a8f589 100644
--- a/packages/taler-harness/src/integrationtests/test-exchange-management.ts
+++ b/packages/taler-harness/src/integrationtests/test-exchange-management.ts
@@ -17,28 +17,9 @@
/**
* Imports.
*/
-import {
- ExchangesListResponse,
- TalerCorebankApiClient,
- TalerErrorCode,
- URL,
- j2s,
-} from "@gnu-taler/taler-util";
import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
-import { defaultCoinConfig } from "../harness/denomStructures.js";
-import {
- FaultInjectedExchangeService,
- FaultInjectionResponseContext,
-} from "../harness/faultInjection.js";
-import {
- BankService,
- ExchangeService,
- GlobalTestState,
- MerchantService,
- WalletCli,
- generateRandomPayto,
- setupDb,
-} from "../harness/harness.js";
+import { GlobalTestState } from "../harness/harness.js";
+import { createSimpleTestkudosEnvironmentV2 } from "../harness/helpers.js";
/**
* Test if the wallet handles outdated exchange versions correctly.
@@ -48,239 +29,52 @@ export async function runExchangeManagementTest(
): Promise<void> {
// Set up test environment
- const db = await setupDb(t);
+ const { walletClient, bank, exchange } =
+ await createSimpleTestkudosEnvironmentV2(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,
- });
-
- const merchant = await MerchantService.create(t, {
- name: "testmerchant-1",
- currency: "TESTKUDOS",
- httpPort: 8083,
- database: db.connStr,
- });
-
- const exchangeBankAccount = await bank.createExchangeAccount(
- "myexchange",
- "x",
- );
- exchange.addBankAccount("1", exchangeBankAccount);
-
- 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,
- exchangeBankAccount.accountPaytoUri,
- );
-
- await bank.start();
-
- await bank.pingUntilAvailable();
-
- exchange.addOfferedCoins(defaultCoinConfig);
-
- await exchange.start();
- await exchange.pingUntilAvailable();
-
- merchant.addExchange(exchange);
-
- await merchant.start();
- await merchant.pingUntilAvailable();
-
- await merchant.addInstanceWithWireAccount({
- id: "default",
- name: "Default Instance",
- paytoUris: [generateRandomPayto("merchant-default")],
- });
-
- await merchant.addInstanceWithWireAccount({
- id: "minst1",
- name: "minst1",
- paytoUris: [generateRandomPayto("minst1")],
- });
-
- console.log("setup done!");
-
- /*
- * =========================================================================
- * Check that the exchange can be added to the wallet
- * (without any faults active).
- * =========================================================================
- */
-
- const wallet = new WalletCli(t);
-
- let exchangesList: ExchangesListResponse;
-
- exchangesList = await wallet.client.call(
- WalletApiOperation.ListExchanges,
- {},
- );
- console.log("exchanges list:", j2s(exchangesList));
- t.assertTrue(exchangesList.exchanges.length === 0);
-
- // Try before fault is injected
- await wallet.client.call(WalletApiOperation.AddExchange, {
- exchangeBaseUrl: faultyExchange.baseUrl,
- });
-
- exchangesList = await wallet.client.call(
+ const exchangesListResult = await walletClient.call(
WalletApiOperation.ListExchanges,
{},
);
- t.assertTrue(exchangesList.exchanges.length === 1);
-
- await wallet.client.call(WalletApiOperation.ListExchanges, {});
- console.log("listing exchanges");
-
- exchangesList = await wallet.client.call(
- WalletApiOperation.ListExchanges,
- {},
- );
- t.assertTrue(exchangesList.exchanges.length === 1);
+ t.assertDeepEqual(exchangesListResult.exchanges.length, 1);
- console.log("got list", exchangesList);
-
- /*
- * =========================================================================
- * Check what happens if the exchange returns something totally
- * bogus for /keys.
- * =========================================================================
- */
-
- wallet.deleteDatabase();
+ await walletClient.call(WalletApiOperation.UpdateExchangeEntry, {
+ exchangeBaseUrl: exchange.baseUrl,
+ force: true,
+ });
- exchangesList = await wallet.client.call(
+ const exchangesListResult2 = await walletClient.call(
WalletApiOperation.ListExchanges,
{},
);
- t.assertTrue(exchangesList.exchanges.length === 0);
- faultyExchange.faultProxy.addFault({
- async modifyResponse(ctx: FaultInjectionResponseContext) {
- const url = new URL(ctx.request.requestUrl);
- if (url.pathname === "/keys") {
- const body = {
- version: "whaaat",
- };
- ctx.responseBody = Buffer.from(JSON.stringify(body), "utf-8");
- }
- },
- });
+ t.assertDeepEqual(exchangesListResult2.exchanges.length, 2);
- const err1 = await t.assertThrowsTalerErrorAsync(async () => {
- await wallet.client.call(WalletApiOperation.AddExchange, {
- exchangeBaseUrl: faultyExchange.baseUrl,
- });
+ await walletClient.call(WalletApiOperation.DeleteExchange, {
+ exchangeBaseUrl: exchange.baseUrl,
});
- console.log("got error", err1);
-
- // Response is malformed, since it didn't even contain a version code
- // in a format the wallet can understand.
- t.assertTrue(
- err1.errorDetail.code === TalerErrorCode.WALLET_EXCHANGE_UNAVAILABLE,
- );
-
- exchangesList = await wallet.client.call(
+ const exchangesListResult3 = await walletClient.call(
WalletApiOperation.ListExchanges,
{},
);
- console.log("exchanges list", j2s(exchangesList));
- t.assertTrue(exchangesList.exchanges.length === 1);
- t.assertTrue(
- exchangesList.exchanges[0].lastUpdateErrorInfo?.error.code ===
- TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE,
- );
-
- /*
- * =========================================================================
- * Check what happens if the exchange returns an old, unsupported
- * version for /keys
- * =========================================================================
- */
- wallet.deleteDatabase();
- faultyExchange.faultProxy.clearAllFaults();
+ t.assertDeepEqual(exchangesListResult3.exchanges.length, 1);
- faultyExchange.faultProxy.addFault({
- async modifyResponse(ctx: FaultInjectionResponseContext) {
- const url = new URL(ctx.request.requestUrl);
- if (url.pathname === "/keys") {
- const keys = ctx.responseBody?.toString("utf-8");
- t.assertTrue(keys != null);
- const keysJson = JSON.parse(keys);
- keysJson["version"] = "2:0:0";
- ctx.responseBody = Buffer.from(JSON.stringify(keysJson), "utf-8");
- }
- },
- });
+ // Check for regression: Can we re-add a deleted exchange?
- const err2 = await t.assertThrowsTalerErrorAsync(async () => {
- await wallet.client.call(WalletApiOperation.AddExchange, {
- exchangeBaseUrl: faultyExchange.baseUrl,
- });
+ await walletClient.call(WalletApiOperation.UpdateExchangeEntry, {
+ exchangeBaseUrl: exchange.baseUrl,
+ force: true,
});
- t.assertTrue(err2.hasErrorCode(TalerErrorCode.WALLET_EXCHANGE_UNAVAILABLE));
-
- exchangesList = await wallet.client.call(
+ const exchangesListResult4 = await walletClient.call(
WalletApiOperation.ListExchanges,
{},
);
- t.assertTrue(exchangesList.exchanges.length === 1);
- t.assertTrue(
- exchangesList.exchanges[0].lastUpdateErrorInfo?.error.code ===
- TalerErrorCode.WALLET_EXCHANGE_PROTOCOL_VERSION_INCOMPATIBLE,
- );
-
- /*
- * =========================================================================
- * Check that the exchange version is also checked when
- * the exchange is implicitly added via the suggested
- * exchange of a bank-integrated withdrawal.
- * =========================================================================
- */
-
- // Fault from above is still active!
-
- // Create withdrawal operation
-
- const bankClient = new TalerCorebankApiClient(bank.corebankApiBaseUrl);
-
- const user = await bankClient.createRandomBankUser();
- const wop = await bankClient.createWithdrawalOperation(
- user.username,
- "TESTKUDOS:10",
- );
-
- // Hand it to the wallet
-
- const wd = await wallet.client.call(
- WalletApiOperation.GetWithdrawalDetailsForUri,
- {
- talerWithdrawUri: wop.taler_withdraw_uri,
- },
- );
- // Make sure the faulty exchange isn't used for the suggestion.
- t.assertTrue(wd.possibleExchanges.length === 0);
+ t.assertDeepEqual(exchangesListResult4.exchanges.length, 2);
}
runExchangeManagementTest.suites = ["wallet", "exchange"];