diff options
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | src/headless/taler-wallet-cli.ts | 33 | ||||
-rw-r--r-- | src/headless/taler-wallet-testing.ts | 155 | ||||
-rw-r--r-- | src/index.ts | 3 | ||||
-rw-r--r-- | tsconfig.json | 3 |
5 files changed, 36 insertions, 160 deletions
diff --git a/package.json b/package.json index a1822d23e..7a4ef23c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "taler-wallet", - "version": "0.0.8", + "version": "0.6.0", "description": "", "main": "dist/node/index.js", "repository": { diff --git a/src/headless/taler-wallet-cli.ts b/src/headless/taler-wallet-cli.ts index 9c4a84e3e..6e2190236 100644 --- a/src/headless/taler-wallet-cli.ts +++ b/src/headless/taler-wallet-cli.ts @@ -17,6 +17,8 @@ import commander = require("commander"); import os = require("os"); import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers"; +import { MerchantBackendConnection } from "./merchant"; +import { runIntegrationTest } from "./integrationtest"; const program = new commander.Command(); program.version("0.0.1"); @@ -36,7 +38,7 @@ program }); program - .command("balance", undefined, { isDefault: true }) + .command("balance") .description("show wallet balance") .action(async () => { console.log("balance command called"); @@ -49,6 +51,35 @@ program process.exit(0); }); + +program + .command("integrationtest") + .option('-e, --exchange <exchange-url>', 'exchange base URL', "https://exchange.test.taler.net/") + .option('-m, --merchant <merchant-url>', 'merchant base URL', "https://backend.test.taler.net/") + .option('-m, --merchant-instance <merchant-instance>', 'merchant instance', "default") + .option('-m, --merchant-api-key <merchant-api-key>', 'merchant API key', "sandbox") + .option('-b, --bank <bank-url>', 'bank base URL', "https://bank.test.taler.net/") + .option('-w, --withdraw-amount <withdraw-amt>', 'amount to withdraw', "TESTKUDOS:10") + .option('-s, --spend-amount <spend-amt>', 'amount to spend', "TESTKUDOS:5") + .description("Run integration test with bank, exchange and merchant.") + .action(async (cmdObj) => { + + await runIntegrationTest({ + amountToSpend: cmdObj.spendAmount, + amountToWithdraw: cmdObj.withdrawAmount, + bankBaseUrl: cmdObj.bank, + exchangeBaseUrl: cmdObj.exchange, + merchantApiKey: cmdObj.merchantApiKey, + merchantBaseUrl: cmdObj.merchant, + merchantInstance: cmdObj.merchantInstance, + }).catch(err => { + console.error("Failed with exception:"); + console.error(err); + }); + + process.exit(0); + }); + // error on unknown commands program.on("command:*", function() { console.error( diff --git a/src/headless/taler-wallet-testing.ts b/src/headless/taler-wallet-testing.ts deleted file mode 100644 index cb0cfeacc..000000000 --- a/src/headless/taler-wallet-testing.ts +++ /dev/null @@ -1,155 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2019 GNUnet e.V. - - 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/> - */ - -/** - * Integration tests against real Taler bank/exchange/merchant deployments. - */ - -import { Wallet } from "../wallet"; -import * as amounts from "../amounts"; -import Axios from "axios"; -import URI = require("urijs"); - -import { CheckPaymentResponse } from "../talerTypes"; -import { getDefaultNodeWallet, withdrawTestBalance } from "./helpers"; -import { Bank } from "./bank"; - -const enableTracing = false; - -class MerchantBackendConnection { - constructor( - public merchantBaseUrl: string, - public merchantInstance: string, - public apiKey: string, - ) {} - - async createOrder( - amount: string, - summary: string, - fulfillmentUrl: string, - ): Promise<{ orderId: string }> { - const reqUrl = new URI("order").absoluteTo(this.merchantBaseUrl).href(); - const orderReq = { - order: { - amount, - summary, - fulfillment_url: fulfillmentUrl, - instance: this.merchantInstance, - }, - }; - const resp = await Axios({ - method: "post", - url: reqUrl, - data: orderReq, - responseType: "json", - headers: { - Authorization: `ApiKey ${this.apiKey}`, - }, - }); - if (resp.status != 200) { - throw Error("failed to create bank reserve"); - } - const orderId = resp.data.order_id; - if (!orderId) { - throw Error("no order id in response"); - } - return { orderId }; - } - - async checkPayment(orderId: string): Promise<CheckPaymentResponse> { - const reqUrl = new URI("check-payment") - .absoluteTo(this.merchantBaseUrl) - .href(); - const resp = await Axios({ - method: "get", - url: reqUrl, - params: { order_id: orderId, instance: this.merchantInstance }, - responseType: "json", - headers: { - Authorization: `ApiKey ${this.apiKey}`, - }, - }); - if (resp.status != 200) { - throw Error("failed to check payment"); - } - return CheckPaymentResponse.checked(resp.data); - } -} - -export async function main() { - const exchangeBaseUrl = "https://exchange.test.taler.net/"; - const bankBaseUrl = "https://bank.test.taler.net/"; - - const myWallet = await getDefaultNodeWallet(); - - await withdrawTestBalance(myWallet); - - const balance = await myWallet.getBalances(); - - console.log(JSON.stringify(balance, null, 2)); - - const myMerchant = new MerchantBackendConnection( - "https://backend.test.taler.net/", - "default", - "sandbox", - ); - - const orderResp = await myMerchant.createOrder( - "TESTKUDOS:5", - "hello world", - "https://example.com/", - ); - - console.log("created order with orderId", orderResp.orderId); - - const paymentStatus = await myMerchant.checkPayment(orderResp.orderId); - - console.log("payment status", paymentStatus); - - const contractUrl = paymentStatus.contract_url; - if (!contractUrl) { - throw Error("no contract URL in payment response"); - } - - const proposalId = await myWallet.downloadProposal(contractUrl); - - console.log("proposal id", proposalId); - - const checkPayResult = await myWallet.checkPay(proposalId); - - console.log("check pay result", checkPayResult); - - const confirmPayResult = await myWallet.confirmPay(proposalId, undefined); - - console.log("confirmPayResult", confirmPayResult); - - const paymentStatus2 = await myMerchant.checkPayment(orderResp.orderId); - - console.log("payment status after wallet payment:", paymentStatus2); - - if (!paymentStatus2.paid) { - throw Error("payment did not succeed"); - } - - myWallet.stop(); -} - -if (require.main === module) { - main().catch(err => { - console.error("Failed with exception:"); - console.error(err); - }); -} diff --git a/src/index.ts b/src/index.ts index 44f030d71..6b04c7e4f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,5 +19,4 @@ */ export { Wallet } from "./wallet"; - -export { main as runIntegrationTest } from "./headless/taler-wallet-testing"; +export { runIntegrationTest } from "./headless/integrationtest"; diff --git a/tsconfig.json b/tsconfig.json index 3e6a0aa14..2b1fe6b05 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -39,8 +39,9 @@ "src/dbTypes.ts", "src/headless/bank.ts", "src/headless/helpers.ts", + "src/headless/integrationtest.ts", + "src/headless/merchant.ts", "src/headless/taler-wallet-cli.ts", - "src/headless/taler-wallet-testing.ts", "src/helpers-test.ts", "src/helpers.ts", "src/http.ts", |