aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/testing.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/operations/testing.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/testing.ts194
1 files changed, 74 insertions, 120 deletions
diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts
index f71d842c7..607d03470 100644
--- a/packages/taler-wallet-core/src/operations/testing.ts
+++ b/packages/taler-wallet-core/src/operations/testing.ts
@@ -23,12 +23,16 @@ import {
ConfirmPayResultType,
Duration,
IntegrationTestV2Args,
+ j2s,
Logger,
NotificationType,
+ RegisterAccountRequest,
stringToBytes,
+ TalerCorebankApiClient,
TestPayResult,
TransactionMajorState,
TransactionMinorState,
+ TransactionState,
TransactionType,
WithdrawTestBalanceRequest,
} from "@gnu-taler/taler-util";
@@ -73,16 +77,6 @@ import { getTransactionById, getTransactions } from "./transactions.js";
const logger = new Logger("operations/testing.ts");
-interface BankUser {
- username: string;
- password: string;
-}
-
-interface BankWithdrawalResponse {
- taler_withdraw_uri: string;
- withdrawal_id: string;
-}
-
interface MerchantBackendInfo {
baseUrl: string;
authToken?: string;
@@ -102,34 +96,27 @@ function makeId(length: number): string {
return result;
}
-/**
- * Helper function to generate the "Authorization" HTTP header.
- * FIXME: redundant, put in taler-util
- */
-function makeBasicAuthHeader(username: string, password: string): string {
- const auth = `${username}:${password}`;
- const authEncoded: string = base64FromArrayBuffer(stringToBytes(auth));
- return `Basic ${authEncoded}`;
-}
-
export async function withdrawTestBalance(
ws: InternalWalletState,
req: WithdrawTestBalanceRequest,
): Promise<void> {
const amount = req.amount;
const exchangeBaseUrl = req.exchangeBaseUrl;
- const bankAccessApiBaseUrl = req.bankAccessApiBaseUrl;
+ const corebankApiBaseUrl = req.corebankApiBaseUrl;
logger.trace(
- `Registered bank user, bank access base url ${bankAccessApiBaseUrl}`,
+ `Registering bank user, bank access base url ${corebankApiBaseUrl}`,
);
- const bankUser = await registerRandomBankUser(ws.http, bankAccessApiBaseUrl);
+
+ const corebankClient = new TalerCorebankApiClient(corebankApiBaseUrl);
+
+ const bankUser = await corebankClient.createRandomBankUser();
logger.trace(`Registered bank user ${JSON.stringify(bankUser)}`);
- const wresp = await createDemoBankWithdrawalUri(
- ws.http,
- bankAccessApiBaseUrl,
- bankUser,
+ corebankClient.setAuth(bankUser);
+
+ const wresp = await corebankClient.createWithdrawalOperation(
+ bankUser.username,
amount,
);
@@ -139,14 +126,14 @@ export async function withdrawTestBalance(
forcedDenomSel: req.forcedDenomSel,
});
- await confirmBankWithdrawalUri(
- ws.http,
- bankAccessApiBaseUrl,
- bankUser,
- wresp.withdrawal_id,
- );
+ await corebankClient.confirmWithdrawalOperation(bankUser.username, {
+ withdrawalOperationId: wresp.withdrawal_id,
+ });
}
+/**
+ * FIXME: User MerchantApiClient instead.
+ */
function getMerchantAuthHeader(m: MerchantBackendInfo): Record<string, string> {
if (m.authToken) {
return {
@@ -157,80 +144,8 @@ function getMerchantAuthHeader(m: MerchantBackendInfo): Record<string, string> {
}
/**
- * Use the testing API of a demobank to create a taler://withdraw URI
- * that the wallet can then use to make a withdrawal.
+ * FIXME: User MerchantApiClient instead.
*/
-export async function createDemoBankWithdrawalUri(
- http: HttpRequestLibrary,
- bankAccessApiBaseUrl: string,
- bankUser: BankUser,
- amount: AmountString,
-): Promise<BankWithdrawalResponse> {
- const reqUrl = new URL(
- `accounts/${bankUser.username}/withdrawals`,
- bankAccessApiBaseUrl,
- ).href;
- const resp = await http.postJson(
- reqUrl,
- {
- amount,
- },
- {
- headers: {
- Authorization: makeBasicAuthHeader(
- bankUser.username,
- bankUser.password,
- ),
- },
- },
- );
- const respJson = await readSuccessResponseJsonOrThrow(resp, codecForAny());
- return respJson;
-}
-
-async function confirmBankWithdrawalUri(
- http: HttpRequestLibrary,
- bankAccessApiBaseUrl: string,
- bankUser: BankUser,
- withdrawalId: string,
-): Promise<void> {
- const reqUrl = new URL(
- `accounts/${bankUser.username}/withdrawals/${withdrawalId}/confirm`,
- bankAccessApiBaseUrl,
- ).href;
- const resp = await http.postJson(
- reqUrl,
- {},
- {
- headers: {
- Authorization: makeBasicAuthHeader(
- bankUser.username,
- bankUser.password,
- ),
- },
- },
- );
- await readSuccessResponseJsonOrThrow(resp, codecForAny());
- return;
-}
-
-async function registerRandomBankUser(
- http: HttpRequestLibrary,
- bankAccessApiBaseUrl: string,
-): Promise<BankUser> {
- const reqUrl = new URL("testing/register", bankAccessApiBaseUrl).href;
- const randId = makeId(8);
- const bankUser: BankUser = {
- // euFin doesn't allow resource names to have upper case letters.
- username: `testuser-${randId.toLowerCase()}`,
- password: `testpw-${randId}`,
- };
-
- const resp = await http.postJson(reqUrl, bankUser);
- await checkSuccessResponseOrThrow(resp);
- return bankUser;
-}
-
async function refund(
http: HttpRequestLibrary,
merchantBackend: MerchantBackendInfo,
@@ -258,6 +173,9 @@ async function refund(
return refundUri;
}
+/**
+ * FIXME: User MerchantApiClient instead.
+ */
async function createOrder(
http: HttpRequestLibrary,
merchantBackend: MerchantBackendInfo,
@@ -287,6 +205,9 @@ async function createOrder(
return { orderId };
}
+/**
+ * FIXME: User MerchantApiClient instead.
+ */
async function checkPayment(
http: HttpRequestLibrary,
merchantBackend: MerchantBackendInfo,
@@ -300,16 +221,6 @@ async function checkPayment(
return readSuccessResponseJsonOrThrow(resp, codecForCheckPaymentResponse());
}
-interface BankUser {
- username: string;
- password: string;
-}
-
-interface BankWithdrawalResponse {
- taler_withdraw_uri: string;
- withdrawal_id: string;
-}
-
async function makePayment(
ws: InternalWalletState,
merchant: MerchantBackendInfo,
@@ -376,7 +287,7 @@ export async function runIntegrationTest(
logger.info("withdrawing test balance");
await withdrawTestBalance(ws, {
amount: args.amountToWithdraw,
- bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
+ corebankApiBaseUrl: args.corebankApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});
await waitUntilDone(ws);
@@ -404,7 +315,7 @@ export async function runIntegrationTest(
await withdrawTestBalance(ws, {
amount: Amounts.stringify(withdrawAmountTwo),
- bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
+ corebankApiBaseUrl: args.corebankApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});
@@ -585,6 +496,49 @@ async function waitUntilPendingReady(
cancelNotifs();
}
+/**
+ * Wait until a transaction is in a particular state.
+ */
+export async function waitTransactionState(
+ ws: InternalWalletState,
+ transactionId: string,
+ txState: TransactionState,
+): Promise<void> {
+ logger.info(
+ `starting waiting for ${transactionId} to be in ${JSON.stringify(
+ txState,
+ )})`,
+ );
+ ws.ensureTaskLoopRunning();
+ let p: OpenedPromise<void> | undefined = undefined;
+ const cancelNotifs = ws.addNotificationListener((notif) => {
+ if (!p) {
+ return;
+ }
+ if (notif.type === NotificationType.TransactionStateTransition) {
+ p.resolve();
+ }
+ });
+ while (1) {
+ p = openPromise();
+ const tx = await getTransactionById(ws, {
+ transactionId,
+ });
+ if (
+ tx.txState.major === txState.major &&
+ tx.txState.minor === txState.minor
+ ) {
+ break;
+ }
+ // Wait until transaction state changed
+ await p.promise;
+ }
+ logger.info(
+ `done waiting for ${transactionId} to be in ${JSON.stringify(txState)}`,
+ );
+ cancelNotifs();
+}
+
export async function runIntegrationTest2(
ws: InternalWalletState,
args: IntegrationTestV2Args,
@@ -603,7 +557,7 @@ export async function runIntegrationTest2(
logger.info("withdrawing test balance");
await withdrawTestBalance(ws, {
amount: Amounts.stringify(amountToWithdraw),
- bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
+ corebankApiBaseUrl: args.corebankApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});
await waitUntilDone(ws);
@@ -636,7 +590,7 @@ export async function runIntegrationTest2(
await withdrawTestBalance(ws, {
amount: Amounts.stringify(withdrawAmountTwo),
- bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
+ corebankApiBaseUrl: args.corebankApiBaseUrl,
exchangeBaseUrl: args.exchangeBaseUrl,
});