/* 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 */ /** * Helper functions to deal with the GNU Taler demo bank. * * Mostly useful for automated tests. */ /** * Imports. */ import Axios from "axios"; import querystring = require("querystring"); import URI = require("urijs"); export interface BankUser { username: string; password: string; } function makeId(length: number): string { let result = ""; const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * characters.length)); } return result; } export class Bank { constructor(private bankBaseUrl: string) {} async generateWithdrawUri(bankUser: BankUser, amount: string): Promise { const body = { amount, }; const reqUrl = new URI("api/withdraw-headless-uri") .absoluteTo(this.bankBaseUrl) .href(); const resp = await Axios({ method: "post", url: reqUrl, data: body, responseType: "json", headers: { "X-Taler-Bank-Username": bankUser.username, "X-Taler-Bank-Password": bankUser.password, }, }); if (resp.status != 200) { throw Error("failed to create bank reserve"); } const withdrawUri = resp.data["taler_withdraw_uri"]; if (!withdrawUri) { throw Error("Bank's response did not include withdraw URI"); } return withdrawUri; } async createReserve( bankUser: BankUser, amount: string, reservePub: string, exchangePaytoUri: string, ) { const reqUrl = new URI("api/withdraw-headless") .absoluteTo(this.bankBaseUrl) .href(); const body = { auth: { type: "basic" }, username: bankUser, amount, reserve_pub: reservePub, exchange_wire_detail: exchangePaytoUri, }; const resp = await Axios({ method: "post", url: reqUrl, data: body, responseType: "json", headers: { "X-Taler-Bank-Username": bankUser.username, "X-Taler-Bank-Password": bankUser.password, }, }); if (resp.status != 200) { throw Error("failed to create bank reserve"); } } async registerRandomUser(): Promise { const reqUrl = new URI("api/register").absoluteTo(this.bankBaseUrl).href(); const randId = makeId(8); const bankUser: BankUser = { username: `testuser-${randId}`, password: `testpw-${randId}`, }; const resp = await Axios({ method: "post", url: reqUrl, data: querystring.stringify(bankUser as any), responseType: "json", }); if (resp.status != 200) { throw Error("could not register bank user"); } return bankUser; } }