wallet-core/src/headless/bank.ts

134 lines
3.3 KiB
TypeScript
Raw Normal View History

2019-08-17 01:54:01 +02:00
/*
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/>
*/
/**
* 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) {}
2019-11-30 00:36:20 +01:00
async generateWithdrawUri(bankUser: BankUser, amount: string): Promise<string> {
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;
}
2019-08-17 01:54:01 +02:00
async createReserve(
bankUser: BankUser,
amount: string,
reservePub: string,
exchangePaytoUri: string,
) {
2019-08-28 02:49:27 +02:00
const reqUrl = new URI("api/withdraw-headless")
2019-08-17 01:54:01 +02:00
.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<BankUser> {
2019-08-28 02:49:27 +02:00
const reqUrl = new URI("api/register").absoluteTo(this.bankBaseUrl).href();
2019-08-17 01:54:01 +02:00
const randId = makeId(8);
const bankUser: BankUser = {
username: `testuser-${randId}`,
password: `testpw-${randId}`,
};
const resp = await Axios({
method: "post",
url: reqUrl,
2019-08-20 11:58:22 +02:00
data: querystring.stringify(bankUser as any),
2019-08-17 01:54:01 +02:00
responseType: "json",
});
if (resp.status != 200) {
throw Error("could not register bank user");
}
return bankUser;
}
}