diff options
Diffstat (limited to 'packages/taler-harness/src/integrationtests')
3 files changed, 182 insertions, 2 deletions
| diff --git a/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts b/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts new file mode 100644 index 000000000..7df1047ea --- /dev/null +++ b/packages/taler-harness/src/integrationtests/test-exchange-deposit.ts @@ -0,0 +1,152 @@ +/* + 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 { +  encodeCrock, +  getRandomBytes, +  j2s, +  TalerError, +} from "@gnu-taler/taler-util"; +import { createPlatformHttpLib } from "@gnu-taler/taler-util/http"; +import { +  checkReserve, +  CryptoDispatcher, +  depositCoin, +  downloadExchangeInfo, +  findDenomOrThrow, +  refreshCoin, +  SynchronousCryptoWorkerFactoryPlain, +  topupReserveWithDemobank, +  withdrawCoin, +} from "@gnu-taler/taler-wallet-core"; +import { GlobalTestState } from "../harness/harness.js"; +import { createSimpleTestkudosEnvironment } from "../harness/helpers.js"; + +/** + * Run test for basic, bank-integrated withdrawal and payment. + */ +export async function runExchangeDepositTest(t: GlobalTestState) { +  // Set up test environment + +  const { bank, exchange } = await createSimpleTestkudosEnvironment(t); + +  const http = createPlatformHttpLib(); +  const cryptiDisp = new CryptoDispatcher( +    new SynchronousCryptoWorkerFactoryPlain(), +  ); +  const cryptoApi = cryptiDisp.cryptoApi; + +  try { +    // Withdraw digital cash into the wallet. + +    const exchangeInfo = await downloadExchangeInfo(exchange.baseUrl, http); + +    const reserveKeyPair = await cryptoApi.createEddsaKeypair({}); + +    await topupReserveWithDemobank( +      http, +      reserveKeyPair.pub, +      bank.baseUrl, +      bank.bankAccessApiBaseUrl, +      exchangeInfo, +      "TESTKUDOS:10", +    ); + +    await exchange.runWirewatchOnce(); + +    await checkReserve(http, exchange.baseUrl, reserveKeyPair.pub); + +    const d1 = findDenomOrThrow(exchangeInfo, "TESTKUDOS:8"); + +    const coin = await withdrawCoin({ +      http, +      cryptoApi, +      reserveKeyPair: { +        reservePriv: reserveKeyPair.priv, +        reservePub: reserveKeyPair.pub, +      }, +      denom: d1, +      exchangeBaseUrl: exchange.baseUrl, +    }); + +    const wireSalt = encodeCrock(getRandomBytes(16)); +    const merchantPub = encodeCrock(getRandomBytes(32)); +    const contractTermsHash = encodeCrock(getRandomBytes(64)); + +    await depositCoin({ +      contractTermsHash, +      merchantPub, +      wireSalt, +      amount: "TESTKUDOS:4", +      coin: coin, +      cryptoApi, +      exchangeBaseUrl: exchange.baseUrl, +      http, +    }); + +    // Idempotency +    await depositCoin({ +      contractTermsHash, +      merchantPub, +      wireSalt, +      amount: "TESTKUDOS:4", +      coin: coin, +      cryptoApi, +      exchangeBaseUrl: exchange.baseUrl, +      http, +    }); + +    try { +      // Non-idempotent request with different amount +      await depositCoin({ +        contractTermsHash, +        merchantPub, +        wireSalt, +        amount: "TESTKUDOS:3.5", +        coin: coin, +        cryptoApi, +        exchangeBaseUrl: exchange.baseUrl, +        http, +      }); +    } catch (e) { +      if (e instanceof TalerError && e.errorDetail.code === 7005) { +        if (e.errorDetail.httpStatusCode === 400) { +          console.log("got expected error response from exchange"); +          console.log(e); +          console.log(j2s(e.errorDetail)); +        } else { +          console.log("did not expect deposit error from exchange"); +          throw e; +        } +      } else { +        throw e; +      } +    } +  } catch (e) { +    if (e instanceof TalerError) { +      console.log(e); +      console.log(j2s(e.errorDetail)); +    } else { +      console.log(e); +    } +    throw e; +  } +} + +runExchangeDepositTest.suites = ["exchange"]; diff --git a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts index 08c10fd91..a1de7617b 100644 --- a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts +++ b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts @@ -17,7 +17,12 @@  /**   * Imports.   */ -import { j2s, TalerError } from "@gnu-taler/taler-util"; +import { +  encodeCrock, +  getRandomBytes, +  j2s, +  TalerError, +} from "@gnu-taler/taler-util";  import { createPlatformHttpLib } from "@gnu-taler/taler-util/http";  import {    checkReserve, @@ -80,7 +85,26 @@ export async function runWalletDblessTest(t: GlobalTestState) {        exchangeBaseUrl: exchange.baseUrl,      }); +    const wireSalt = encodeCrock(getRandomBytes(16)); +    const merchantPub = encodeCrock(getRandomBytes(32)); +    const contractTermsHash = encodeCrock(getRandomBytes(64)); + +    await depositCoin({ +      contractTermsHash, +      merchantPub, +      wireSalt, +      amount: "TESTKUDOS:4", +      coin: coin, +      cryptoApi, +      exchangeBaseUrl: exchange.baseUrl, +      http, +    }); + +    // Idempotency      await depositCoin({ +      contractTermsHash, +      merchantPub, +      wireSalt,        amount: "TESTKUDOS:4",        coin: coin,        cryptoApi, diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts index a20300e02..38047a850 100644 --- a/packages/taler-harness/src/integrationtests/testrunner.ts +++ b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -101,6 +101,7 @@ import { runPaymentAbortTest } from "./test-payment-abort.js";  import { runWithdrawalFeesTest } from "./test-withdrawal-fees.js";  import { runWalletBalanceTest } from "./test-wallet-balance.js";  import { runPaymentTemplateTest } from "./test-payment-template.js"; +import { runExchangeDepositTest } from "./test-exchange-deposit.js";  /**   * Test runner. @@ -131,6 +132,7 @@ const allTests: TestMainFunction[] = [    runFeeRegressionTest,    runForcedSelectionTest,    runKycTest, +  runExchangeDepositTest,    runLibeufinAnastasisFacadeTest,    runLibeufinApiBankaccountTest,    runLibeufinApiBankconnectionTest, @@ -340,7 +342,9 @@ export async function runTests(spec: TestRunSpec) {        console.log(`running ${testName} with timeout ${testTimeoutMs}ms`);      } -    const token = spec.noTimeout ? CancellationToken.CONTINUE : CancellationToken.timeout(testTimeoutMs).token; +    const token = spec.noTimeout +      ? CancellationToken.CONTINUE +      : CancellationToken.timeout(testTimeoutMs).token;      const resultPromise: Promise<TestRunResult> = new Promise(        (resolve, reject) => { | 
