wallet-core/src/headless/bank.ts

135 lines
3.4 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");
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;
}
2020-01-17 21:59:47 +01:00
function makeAuth(username: string, password: string): string {
const auth = `${username}:${password}`;
const authEncoded: string = Buffer.from(auth).toString("base64");
return `Basic ${authEncoded}`;
}
2019-08-17 01:54:01 +02:00
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 URL("api/withdraw-headless-uri", this.bankBaseUrl).href;
2019-11-30 00:36:20 +01:00
const resp = await Axios({
method: "post",
url: reqUrl,
data: body,
responseType: "json",
headers: {
2020-01-17 21:59:47 +01:00
"Authorization": makeAuth(bankUser.username, bankUser.password),
2019-11-30 00:36:20 +01:00
},
});
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,
) {
const reqUrl = new URL("api/withdraw-headless", this.bankBaseUrl).href;
2019-08-17 01:54:01 +02:00
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: {
2020-01-17 21:59:47 +01:00
"Authorization": makeAuth(bankUser.username, bankUser.password),
2019-08-17 01:54:01 +02:00
},
});
if (resp.status != 200) {
throw Error("failed to create bank reserve");
}
}
async registerRandomUser(): Promise<BankUser> {
const reqUrl = new URL("api/register", 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;
}
}