wallet-core: implement runIntegrationTestV2
This commit is contained in:
parent
cefec08ce7
commit
07d8498abc
@ -1247,6 +1247,21 @@ export const codecForIntegrationTestArgs = (): Codec<IntegrationTestArgs> =>
|
|||||||
.property("bankAccessApiBaseUrl", codecOptional(codecForAmountString()))
|
.property("bankAccessApiBaseUrl", codecOptional(codecForAmountString()))
|
||||||
.build("IntegrationTestArgs");
|
.build("IntegrationTestArgs");
|
||||||
|
|
||||||
|
export interface IntegrationTestV2Args {
|
||||||
|
exchangeBaseUrl: string;
|
||||||
|
bankAccessApiBaseUrl: string;
|
||||||
|
merchantBaseUrl: string;
|
||||||
|
merchantAuthToken?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const codecForIntegrationTestV2Args = (): Codec<IntegrationTestV2Args> =>
|
||||||
|
buildCodecForObject<IntegrationTestV2Args>()
|
||||||
|
.property("exchangeBaseUrl", codecForString())
|
||||||
|
.property("merchantBaseUrl", codecForString())
|
||||||
|
.property("merchantAuthToken", codecOptional(codecForString()))
|
||||||
|
.property("bankAccessApiBaseUrl", codecForAmountString())
|
||||||
|
.build("IntegrationTestV2Args");
|
||||||
|
|
||||||
export interface AddExchangeRequest {
|
export interface AddExchangeRequest {
|
||||||
exchangeBaseUrl: string;
|
exchangeBaseUrl: string;
|
||||||
forceUpdate?: boolean;
|
forceUpdate?: boolean;
|
||||||
|
@ -1000,7 +1000,7 @@ export async function processPeerPushCredit(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function confirmPeerPushPayment(
|
export async function confirmPeerPushCredit(
|
||||||
ws: InternalWalletState,
|
ws: InternalWalletState,
|
||||||
req: ConfirmPeerPushCreditRequest,
|
req: ConfirmPeerPushCreditRequest,
|
||||||
): Promise<AcceptPeerPushPaymentResponse> {
|
): Promise<AcceptPeerPushPaymentResponse> {
|
||||||
@ -1119,7 +1119,7 @@ export async function processPeerPullDebit(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function acceptIncomingPeerPullPayment(
|
export async function confirmPeerPullDebit(
|
||||||
ws: InternalWalletState,
|
ws: InternalWalletState,
|
||||||
req: ConfirmPeerPullDebitRequest,
|
req: ConfirmPeerPullDebitRequest,
|
||||||
): Promise<AcceptPeerPullPaymentResponse> {
|
): Promise<AcceptPeerPullPaymentResponse> {
|
||||||
|
@ -18,8 +18,11 @@
|
|||||||
* Imports.
|
* Imports.
|
||||||
*/
|
*/
|
||||||
import {
|
import {
|
||||||
|
AbsoluteTime,
|
||||||
base64FromArrayBuffer,
|
base64FromArrayBuffer,
|
||||||
ConfirmPayResultType,
|
ConfirmPayResultType,
|
||||||
|
Duration,
|
||||||
|
IntegrationTestV2Args,
|
||||||
Logger,
|
Logger,
|
||||||
stringToBytes,
|
stringToBytes,
|
||||||
TestPayResult,
|
TestPayResult,
|
||||||
@ -46,6 +49,15 @@ import { applyRefund, confirmPay, preparePayForUri } from "./pay-merchant.js";
|
|||||||
import { getBalances } from "./balance.js";
|
import { getBalances } from "./balance.js";
|
||||||
import { checkLogicInvariant } from "../util/invariants.js";
|
import { checkLogicInvariant } from "../util/invariants.js";
|
||||||
import { acceptWithdrawalFromUri } from "./withdraw.js";
|
import { acceptWithdrawalFromUri } from "./withdraw.js";
|
||||||
|
import { updateExchangeFromUrl } from "./exchanges.js";
|
||||||
|
import {
|
||||||
|
confirmPeerPullDebit,
|
||||||
|
confirmPeerPushCredit,
|
||||||
|
initiatePeerPullPayment,
|
||||||
|
initiatePeerPushPayment,
|
||||||
|
preparePeerPullDebit,
|
||||||
|
preparePeerPushCredit,
|
||||||
|
} from "./pay-peer.js";
|
||||||
|
|
||||||
const logger = new Logger("operations/testing.ts");
|
const logger = new Logger("operations/testing.ts");
|
||||||
|
|
||||||
@ -429,6 +441,146 @@ export async function runIntegrationTest(
|
|||||||
logger.trace("integration test: all done!");
|
logger.trace("integration test: all done!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function runIntegrationTest2(
|
||||||
|
ws: InternalWalletState,
|
||||||
|
args: IntegrationTestV2Args,
|
||||||
|
): Promise<void> {
|
||||||
|
logger.info("running test with arguments", args);
|
||||||
|
|
||||||
|
const exchangeInfo = await updateExchangeFromUrl(ws, args.exchangeBaseUrl);
|
||||||
|
|
||||||
|
const currency = exchangeInfo.exchangeDetails.currency;
|
||||||
|
|
||||||
|
const amountToWithdraw = Amounts.parseOrThrow(`${currency}:10`);
|
||||||
|
const amountToSpend = Amounts.parseOrThrow(`${currency}:2`);
|
||||||
|
|
||||||
|
logger.info("withdrawing test balance");
|
||||||
|
await withdrawTestBalance(ws, {
|
||||||
|
amount: Amounts.stringify(amountToWithdraw),
|
||||||
|
bankBaseUrl: args.bankAccessApiBaseUrl /* FIXME: not necessary */,
|
||||||
|
bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
|
||||||
|
exchangeBaseUrl: args.exchangeBaseUrl,
|
||||||
|
});
|
||||||
|
await ws.runUntilDone();
|
||||||
|
logger.info("done withdrawing test balance");
|
||||||
|
|
||||||
|
const balance = await getBalances(ws);
|
||||||
|
|
||||||
|
logger.trace(JSON.stringify(balance, null, 2));
|
||||||
|
|
||||||
|
const myMerchant: MerchantBackendInfo = {
|
||||||
|
baseUrl: args.merchantBaseUrl,
|
||||||
|
authToken: args.merchantAuthToken,
|
||||||
|
};
|
||||||
|
|
||||||
|
await makePayment(
|
||||||
|
ws,
|
||||||
|
myMerchant,
|
||||||
|
Amounts.stringify(amountToSpend),
|
||||||
|
"hello world",
|
||||||
|
);
|
||||||
|
|
||||||
|
// Wait until the refresh is done
|
||||||
|
await ws.runUntilDone();
|
||||||
|
|
||||||
|
logger.trace("withdrawing test balance for refund");
|
||||||
|
const withdrawAmountTwo = Amounts.parseOrThrow(`${currency}:18`);
|
||||||
|
const spendAmountTwo = Amounts.parseOrThrow(`${currency}:7`);
|
||||||
|
const refundAmount = Amounts.parseOrThrow(`${currency}:6`);
|
||||||
|
const spendAmountThree = Amounts.parseOrThrow(`${currency}:3`);
|
||||||
|
|
||||||
|
await withdrawTestBalance(ws, {
|
||||||
|
amount: Amounts.stringify(withdrawAmountTwo),
|
||||||
|
bankBaseUrl: args.bankAccessApiBaseUrl /* FIXME: not necessary */,
|
||||||
|
bankAccessApiBaseUrl: args.bankAccessApiBaseUrl,
|
||||||
|
exchangeBaseUrl: args.exchangeBaseUrl,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wait until the withdraw is done
|
||||||
|
await ws.runUntilDone();
|
||||||
|
|
||||||
|
const { orderId: refundOrderId } = await makePayment(
|
||||||
|
ws,
|
||||||
|
myMerchant,
|
||||||
|
Amounts.stringify(spendAmountTwo),
|
||||||
|
"order that will be refunded",
|
||||||
|
);
|
||||||
|
|
||||||
|
const refundUri = await refund(
|
||||||
|
ws.http,
|
||||||
|
myMerchant,
|
||||||
|
refundOrderId,
|
||||||
|
"test refund",
|
||||||
|
Amounts.stringify(refundAmount),
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.trace("refund URI", refundUri);
|
||||||
|
|
||||||
|
await applyRefund(ws, refundUri);
|
||||||
|
|
||||||
|
logger.trace("integration test: applied refund");
|
||||||
|
|
||||||
|
// Wait until the refund is done
|
||||||
|
await ws.runUntilDone();
|
||||||
|
|
||||||
|
logger.trace("integration test: making payment after refund");
|
||||||
|
|
||||||
|
await makePayment(
|
||||||
|
ws,
|
||||||
|
myMerchant,
|
||||||
|
Amounts.stringify(spendAmountThree),
|
||||||
|
"payment after refund",
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.trace("integration test: make payment done");
|
||||||
|
|
||||||
|
await ws.runUntilDone();
|
||||||
|
|
||||||
|
const peerPushInit = await initiatePeerPushPayment(ws, {
|
||||||
|
partialContractTerms: {
|
||||||
|
amount: `${currency}:1`,
|
||||||
|
summary: "Payment Peer Push Test",
|
||||||
|
purse_expiration: AbsoluteTime.toTimestamp(
|
||||||
|
AbsoluteTime.addDuration(
|
||||||
|
AbsoluteTime.now(),
|
||||||
|
Duration.fromSpec({ hours: 1 }),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const peerPushCredit = await preparePeerPushCredit(ws, {
|
||||||
|
talerUri: peerPushInit.talerUri,
|
||||||
|
});
|
||||||
|
|
||||||
|
await confirmPeerPushCredit(ws, {
|
||||||
|
peerPushPaymentIncomingId: peerPushCredit.peerPushPaymentIncomingId,
|
||||||
|
});
|
||||||
|
|
||||||
|
const peerPullInit = await initiatePeerPullPayment(ws, {
|
||||||
|
partialContractTerms: {
|
||||||
|
amount: `${currency}:1`,
|
||||||
|
summary: "Payment Peer Pull Test",
|
||||||
|
purse_expiration: AbsoluteTime.toTimestamp(
|
||||||
|
AbsoluteTime.addDuration(
|
||||||
|
AbsoluteTime.now(),
|
||||||
|
Duration.fromSpec({ hours: 1 }),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const peerPullInc = await preparePeerPullDebit(ws, {
|
||||||
|
talerUri: peerPullInit.talerUri,
|
||||||
|
});
|
||||||
|
|
||||||
|
await confirmPeerPullDebit(ws, {
|
||||||
|
peerPullPaymentIncomingId: peerPullInc.peerPullPaymentIncomingId,
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.trace("integration test: all done!");
|
||||||
|
}
|
||||||
|
|
||||||
export async function testPay(
|
export async function testPay(
|
||||||
ws: InternalWalletState,
|
ws: InternalWalletState,
|
||||||
args: TestPayArgs,
|
args: TestPayArgs,
|
||||||
|
@ -132,6 +132,7 @@ export enum WalletApiOperation {
|
|||||||
PreparePayForTemplate = "preparePayForTemplate",
|
PreparePayForTemplate = "preparePayForTemplate",
|
||||||
GetContractTermsDetails = "getContractTermsDetails",
|
GetContractTermsDetails = "getContractTermsDetails",
|
||||||
RunIntegrationTest = "runIntegrationTest",
|
RunIntegrationTest = "runIntegrationTest",
|
||||||
|
RunIntegrationTestV2 = "runIntegrationTestV2",
|
||||||
TestCrypto = "testCrypto",
|
TestCrypto = "testCrypto",
|
||||||
TestPay = "testPay",
|
TestPay = "testPay",
|
||||||
AddExchange = "addExchange",
|
AddExchange = "addExchange",
|
||||||
@ -759,6 +760,16 @@ export type RunIntegrationTestOp = {
|
|||||||
response: EmptyObject;
|
response: EmptyObject;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a simple integration test on a test deployment
|
||||||
|
* of the exchange and merchant.
|
||||||
|
*/
|
||||||
|
export type RunIntegrationTestV2Op = {
|
||||||
|
op: WalletApiOperation.RunIntegrationTest;
|
||||||
|
request: IntegrationTestArgs;
|
||||||
|
response: EmptyObject;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test crypto worker.
|
* Test crypto worker.
|
||||||
*/
|
*/
|
||||||
@ -931,6 +942,7 @@ export type WalletOperations = {
|
|||||||
[WalletApiOperation.RemoveBackupProvider]: RemoveBackupProviderOp;
|
[WalletApiOperation.RemoveBackupProvider]: RemoveBackupProviderOp;
|
||||||
[WalletApiOperation.GetBackupInfo]: GetBackupInfoOp;
|
[WalletApiOperation.GetBackupInfo]: GetBackupInfoOp;
|
||||||
[WalletApiOperation.RunIntegrationTest]: RunIntegrationTestOp;
|
[WalletApiOperation.RunIntegrationTest]: RunIntegrationTestOp;
|
||||||
|
[WalletApiOperation.RunIntegrationTestV2]: RunIntegrationTestV2Op;
|
||||||
[WalletApiOperation.TestCrypto]: TestCryptoOp;
|
[WalletApiOperation.TestCrypto]: TestCryptoOp;
|
||||||
[WalletApiOperation.WithdrawTestBalance]: WithdrawTestBalanceOp;
|
[WalletApiOperation.WithdrawTestBalance]: WithdrawTestBalanceOp;
|
||||||
[WalletApiOperation.TestPay]: TestPayOp;
|
[WalletApiOperation.TestPay]: TestPayOp;
|
||||||
|
@ -112,6 +112,7 @@ import {
|
|||||||
validateIban,
|
validateIban,
|
||||||
codecForValidateIbanRequest,
|
codecForValidateIbanRequest,
|
||||||
ValidateIbanResponse,
|
ValidateIbanResponse,
|
||||||
|
codecForIntegrationTestV2Args,
|
||||||
} from "@gnu-taler/taler-util";
|
} from "@gnu-taler/taler-util";
|
||||||
import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
|
import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js";
|
||||||
import {
|
import {
|
||||||
@ -200,8 +201,8 @@ import {
|
|||||||
processPurchase,
|
processPurchase,
|
||||||
} from "./operations/pay-merchant.js";
|
} from "./operations/pay-merchant.js";
|
||||||
import {
|
import {
|
||||||
acceptIncomingPeerPullPayment,
|
confirmPeerPullDebit,
|
||||||
confirmPeerPushPayment,
|
confirmPeerPushCredit,
|
||||||
preparePeerPullDebit,
|
preparePeerPullDebit,
|
||||||
preparePeerPushCredit,
|
preparePeerPushCredit,
|
||||||
initiatePeerPullPayment,
|
initiatePeerPullPayment,
|
||||||
@ -226,6 +227,7 @@ import {
|
|||||||
} from "./operations/refresh.js";
|
} from "./operations/refresh.js";
|
||||||
import {
|
import {
|
||||||
runIntegrationTest,
|
runIntegrationTest,
|
||||||
|
runIntegrationTest2,
|
||||||
testPay,
|
testPay,
|
||||||
withdrawTestBalance,
|
withdrawTestBalance,
|
||||||
} from "./operations/testing.js";
|
} from "./operations/testing.js";
|
||||||
@ -1046,6 +1048,11 @@ async function dispatchRequestInternal<Op extends WalletApiOperation>(
|
|||||||
await runIntegrationTest(ws, req);
|
await runIntegrationTest(ws, req);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
case WalletApiOperation.RunIntegrationTestV2: {
|
||||||
|
const req = codecForIntegrationTestV2Args().decode(payload);
|
||||||
|
await runIntegrationTest2(ws, req);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
case WalletApiOperation.ValidateIban: {
|
case WalletApiOperation.ValidateIban: {
|
||||||
const req = codecForValidateIbanRequest().decode(payload);
|
const req = codecForValidateIbanRequest().decode(payload);
|
||||||
const valRes = validateIban(req.iban);
|
const valRes = validateIban(req.iban);
|
||||||
@ -1461,7 +1468,7 @@ async function dispatchRequestInternal<Op extends WalletApiOperation>(
|
|||||||
}
|
}
|
||||||
case WalletApiOperation.ConfirmPeerPushCredit: {
|
case WalletApiOperation.ConfirmPeerPushCredit: {
|
||||||
const req = codecForConfirmPeerPushPaymentRequest().decode(payload);
|
const req = codecForConfirmPeerPushPaymentRequest().decode(payload);
|
||||||
return await confirmPeerPushPayment(ws, req);
|
return await confirmPeerPushCredit(ws, req);
|
||||||
}
|
}
|
||||||
case WalletApiOperation.CheckPeerPullCredit: {
|
case WalletApiOperation.CheckPeerPullCredit: {
|
||||||
const req = codecForPreparePeerPullPaymentRequest().decode(payload);
|
const req = codecForPreparePeerPullPaymentRequest().decode(payload);
|
||||||
@ -1477,7 +1484,7 @@ async function dispatchRequestInternal<Op extends WalletApiOperation>(
|
|||||||
}
|
}
|
||||||
case WalletApiOperation.ConfirmPeerPullDebit: {
|
case WalletApiOperation.ConfirmPeerPullDebit: {
|
||||||
const req = codecForAcceptPeerPullPaymentRequest().decode(payload);
|
const req = codecForAcceptPeerPullPaymentRequest().decode(payload);
|
||||||
return await acceptIncomingPeerPullPayment(ws, req);
|
return await confirmPeerPullDebit(ws, req);
|
||||||
}
|
}
|
||||||
case WalletApiOperation.ApplyDevExperiment: {
|
case WalletApiOperation.ApplyDevExperiment: {
|
||||||
const req = codecForApplyDevExperiment().decode(payload);
|
const req = codecForApplyDevExperiment().decode(payload);
|
||||||
|
Loading…
Reference in New Issue
Block a user