From 953cd9dc41ff3d52d23fe77f4ba3c18281e9d58f Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 14 Aug 2020 15:53:50 +0530 Subject: nuke some console.log statements, test wallet testing functionality in integration test --- packages/taler-integrationtests/src/harness.ts | 82 ++++++++++++++++---- .../src/test-wallettesting.ts | 90 ++++++++++++++++++++++ 2 files changed, 158 insertions(+), 14 deletions(-) create mode 100644 packages/taler-integrationtests/src/test-wallettesting.ts (limited to 'packages/taler-integrationtests') diff --git a/packages/taler-integrationtests/src/harness.ts b/packages/taler-integrationtests/src/harness.ts index 8f9c540f6..d710feea4 100644 --- a/packages/taler-integrationtests/src/harness.ts +++ b/packages/taler-integrationtests/src/harness.ts @@ -29,6 +29,7 @@ import * as fs from "fs"; import * as path from "path"; import * as os from "os"; import * as http from "http"; +import { deepStrictEqual } from "assert"; import { ChildProcess, spawn } from "child_process"; import { Configuration, @@ -53,6 +54,18 @@ import { ConfirmPayRequest, ConfirmPayResult, codecForConfirmPayResult, + IntegrationTestArgs, + TestPayArgs, + BalancesResponse, + codecForBalancesResponse, + encodeCrock, + getRandomBytes, + EddsaKeyPair, + eddsaGetPublic, + createEddsaKeyPair, + TransactionsResponse, + codecForTransactionsResponse, + WithdrawTestBalanceRequest, } from "taler-wallet-core"; import { URL } from "url"; import axios from "axios"; @@ -63,14 +76,6 @@ import { PostOrderResponse, MerchantOrderPrivateStatusResponse, } from "./merchantApiTypes"; -import { - EddsaKeyPair, - getRandomBytes, - encodeCrock, - eddsaGetPublic, - createEddsaKeyPair, -} from "taler-wallet-core/lib/crypto/talerCrypto"; -import { WithdrawalDetails } from "taler-wallet-core/lib/types/transactions"; const exec = util.promisify(require("child_process").exec); @@ -277,6 +282,10 @@ export class GlobalTestState { } } + assertDeepEqual(actual: any, expected: any): asserts actual is any { + deepStrictEqual(actual, expected); + } + assertAmountEquals( amtExpected: string | AmountJson, amtActual: string | AmountJson, @@ -521,6 +530,10 @@ export class BankService { config.setString("bank", "suggested_exchange_payto", exchangePayto); } + get baseUrl(): string { + return `http://localhost:${this.bankConfig.httpPort}/`; + } + async createExchangeAccount( accountName: string, password: string, @@ -890,11 +903,10 @@ export interface MerchantConfig { database: string; } - export interface PrivateOrderStatusQuery { - instance?: string, - orderId: string, - sessionId?: string, + instance?: string; + orderId: string; + sessionId?: string; } export class MerchantService { @@ -993,7 +1005,9 @@ export class MerchantService { }); } - async queryPrivateOrderStatus(query: PrivateOrderStatusQuery): Promise { + async queryPrivateOrderStatus( + query: PrivateOrderStatusQuery, + ): Promise { const reqUrl = new URL( `private/orders/${query.orderId}`, this.makeInstanceBaseUrl(query.instance), @@ -1215,6 +1229,46 @@ export class WalletCli { throw new OperationFailedError(resp.error); } + async getBalances(): Promise { + const resp = await this.apiRequest("getBalances", {}); + if (resp.type === "response") { + return codecForBalancesResponse().decode(resp.result); + } + throw new OperationFailedError(resp.error); + } + + async getTransactions(): Promise { + const resp = await this.apiRequest("getTransactions", {}); + if (resp.type === "response") { + return codecForTransactionsResponse().decode(resp.result); + } + throw new OperationFailedError(resp.error); + } + + async runIntegrationtest(args: IntegrationTestArgs): Promise { + const resp = await this.apiRequest("runIntegrationtest", args); + if (resp.type === "response") { + return; + } + throw new OperationFailedError(resp.error); + } + + async testPay(args: TestPayArgs): Promise { + const resp = await this.apiRequest("testPay", args); + if (resp.type === "response") { + return; + } + throw new OperationFailedError(resp.error); + } + + async withdrawTestBalance(args: WithdrawTestBalanceRequest): Promise { + const resp = await this.apiRequest("withdrawTestBalance", args); + if (resp.type === "response") { + return; + } + throw new OperationFailedError(resp.error); + } + async getWithdrawalDetailsForUri( req: GetWithdrawalDetailsForUriRequest, ): Promise { @@ -1222,6 +1276,6 @@ export class WalletCli { if (resp.type === "response") { return codecForWithdrawUriInfoResponse().decode(resp.result); } - throw new OperationFailedError(resp.error); + throw new OperationFailedError(resp.error); } } diff --git a/packages/taler-integrationtests/src/test-wallettesting.ts b/packages/taler-integrationtests/src/test-wallettesting.ts new file mode 100644 index 000000000..de1f1e228 --- /dev/null +++ b/packages/taler-integrationtests/src/test-wallettesting.ts @@ -0,0 +1,90 @@ +/* + 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 + */ + +/** + * Integration test for the wallet testing functionality used by the exchange + * test cases. + */ + +/** + * Imports. + */ +import { runTest, GlobalTestState } from "./harness"; +import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; + +/** + * Run test for basic, bank-integrated withdrawal. + */ +runTest(async (t: GlobalTestState) => { + const { + wallet, + bank, + exchange, + merchant, + } = await createSimpleTestkudosEnvironment(t); + + await wallet.runIntegrationtest({ + amountToSpend: "TESTKUDOS:5", + amountToWithdraw: "TESTKUDOS:10", + bankBaseUrl: bank.baseUrl, + exchangeBaseUrl: exchange.baseUrl, + merchantApiKey: "sandbox", + merchantBaseUrl: merchant.makeInstanceBaseUrl(), + }); + + let txns = await wallet.getTransactions(); + console.log(JSON.stringify(txns, undefined, 2)); + let txTypes = txns.transactions.map((x) => x.type); + + t.assertDeepEqual(txTypes, [ + "withdrawal", + "payment", + "withdrawal", + "payment", + "refund", + "payment", + ]); + + wallet.deleteDatabase(); + + await wallet.withdrawTestBalance({ + amount: "TESTKUDOS:10", + bankBaseUrl: bank.baseUrl, + exchangeBaseUrl: exchange.baseUrl, + }); + + await wallet.runUntilDone(); + + await wallet.testPay({ + amount: "TESTKUDOS:5", + merchantApiKey: "sandbox", + merchantBaseUrl: merchant.makeInstanceBaseUrl(), + summary: "foo", + }); + + await wallet.runUntilDone(); + + txns = await wallet.getTransactions(); + console.log(JSON.stringify(txns, undefined, 2)); + txTypes = txns.transactions.map((x) => x.type); + + t.assertDeepEqual(txTypes, [ + "withdrawal", + "payment", + ]); + + await t.shutdown(); +}); -- cgit v1.2.3