diff options
author | Florian Dold <florian.dold@gmail.com> | 2020-09-04 02:20:20 +0530 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2020-09-04 02:20:20 +0530 |
commit | 9ec6018efef9b45ee42ccda33ed7093881534141 (patch) | |
tree | 3b7b0a8bb78cb959531f965152c8307607a05d92 /packages/taler-integrationtests/src | |
parent | 54c0d1c2589951be26a83575b77dbb80f3a08b79 (diff) | |
download | wallet-core-9ec6018efef9b45ee42ccda33ed7093881534141.tar.xz |
test recoup, fix bug in reserve state machine, fix bug in recoup-refresh
Diffstat (limited to 'packages/taler-integrationtests/src')
-rw-r--r-- | packages/taler-integrationtests/src/harness.ts | 44 | ||||
-rw-r--r-- | packages/taler-integrationtests/src/helpers.ts | 85 | ||||
-rw-r--r-- | packages/taler-integrationtests/src/test-payment.ts | 57 |
3 files changed, 140 insertions, 46 deletions
diff --git a/packages/taler-integrationtests/src/harness.ts b/packages/taler-integrationtests/src/harness.ts index cc30df618..dbb416b48 100644 --- a/packages/taler-integrationtests/src/harness.ts +++ b/packages/taler-integrationtests/src/harness.ts @@ -69,6 +69,9 @@ import { ApplyRefundRequest, codecForApplyRefundResponse, codecForAny, + CoinDumpJson, + ForceExchangeUpdateRequest, + ForceRefreshRequest, } from "taler-wallet-core"; import { URL } from "url"; import axios, { AxiosError } from "axios"; @@ -1077,6 +1080,23 @@ export class ExchangeService implements ExchangeServiceInterface { ); } + async revokeDenomination(denomPubHash: string) { + if (this.isRunning()) { + throw Error("exchange must be stopped when revoking denominations"); + } + await runCommand( + this.globalState, + "exchange-keyup", + "taler-exchange-keyup", + [ + "-c", this.configFilename, + ...this.timetravelArgArr, + "--revoke", + denomPubHash, + ], + ); + } + async start(): Promise<void> { if (this.isRunning()) { throw Error("exchange is already running"); @@ -1540,6 +1560,14 @@ export class WalletCli { throw new OperationFailedError(resp.error); } + async dumpCoins(): Promise<CoinDumpJson> { + const resp = await this.apiRequest("dumpCoins", {}); + if (resp.type === "response") { + return codecForAny().decode(resp.result); + } + throw new OperationFailedError(resp.error); + } + async addExchange(req: AddExchangeRequest): Promise<void> { const resp = await this.apiRequest("addExchange", req); if (resp.type === "response") { @@ -1548,6 +1576,22 @@ export class WalletCli { throw new OperationFailedError(resp.error); } + async forceUpdateExchange(req: ForceExchangeUpdateRequest): Promise<void> { + const resp = await this.apiRequest("forceUpdateExchange", req); + if (resp.type === "response") { + return; + } + throw new OperationFailedError(resp.error); + } + + async forceRefresh(req: ForceRefreshRequest): Promise<void> { + const resp = await this.apiRequest("forceRefresh", req); + if (resp.type === "response") { + return; + } + throw new OperationFailedError(resp.error); + } + async listExchanges(): Promise<ExchangesListRespose> { const resp = await this.apiRequest("listExchanges", {}); if (resp.type === "response") { diff --git a/packages/taler-integrationtests/src/helpers.ts b/packages/taler-integrationtests/src/helpers.ts index d47d5f7b0..ca9b57abf 100644 --- a/packages/taler-integrationtests/src/helpers.ts +++ b/packages/taler-integrationtests/src/helpers.ts @@ -36,8 +36,9 @@ import { MerchantServiceInterface, BankApi, BankAccessApi, + MerchantPrivateApi, } from "./harness"; -import { AmountString } from "taler-wallet-core"; +import { AmountString, Duration, PreparePayResultType, ConfirmPayResultType, ContractTerms } from "taler-wallet-core"; import { FaultInjectedMerchantService } from "./faultInjection"; export interface SimpleTestEnvironment { @@ -280,3 +281,85 @@ export async function withdrawViaBank( const balApiResp = await wallet.apiRequest("getBalances", {}); t.assertTrue(balApiResp.type === "response"); } + +export async function applyTimeTravel( + timetravelDuration: Duration, + s: { + exchange?: ExchangeService; + merchant?: MerchantService; + wallet?: WalletCli; + }, +): Promise<void> { + if (s.exchange) { + await s.exchange.stop(); + s.exchange.setTimetravel(timetravelDuration); + await s.exchange.start(); + await s.exchange.pingUntilAvailable(); + } + + if (s.merchant) { + await s.merchant.stop(); + s.merchant.setTimetravel(timetravelDuration); + await s.merchant.start(); + await s.merchant.pingUntilAvailable(); + } + + if (s.wallet) { + s.wallet.setTimetravel(timetravelDuration); + } +} + + +/** + * Make a simple payment and check that it succeeded. + */ +export async function makeTestPayment(t: GlobalTestState, args: { + merchant: MerchantServiceInterface, + wallet: WalletCli, + order: Partial<ContractTerms>, + instance?: string +}): Promise<void> { + // Set up order. + + const { wallet, merchant } = args; + const instance = args.instance ?? "default"; + + const orderResp = await MerchantPrivateApi.createOrder(merchant, instance, { + order: { + summary: "Buy me!", + amount: "TESTKUDOS:5", + fulfillment_url: "taler://fulfillment-success/thx", + }, + }); + + let orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { + orderId: orderResp.order_id, + }); + + t.assertTrue(orderStatus.order_status === "unpaid"); + + // Make wallet pay for the order + + const preparePayResult = await wallet.preparePay({ + talerPayUri: orderStatus.taler_pay_uri, + }); + + t.assertTrue( + preparePayResult.status === PreparePayResultType.PaymentPossible, + ); + + const r2 = await wallet.confirmPay({ + proposalId: preparePayResult.proposalId, + }); + + t.assertTrue(r2.type === ConfirmPayResultType.Done); + + // Check if payment was successful. + + orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { + orderId: orderResp.order_id, + instance, + }); + + t.assertTrue(orderStatus.order_status === "paid"); +}
\ No newline at end of file diff --git a/packages/taler-integrationtests/src/test-payment.ts b/packages/taler-integrationtests/src/test-payment.ts index a099e9f23..4f44fc146 100644 --- a/packages/taler-integrationtests/src/test-payment.ts +++ b/packages/taler-integrationtests/src/test-payment.ts @@ -20,14 +20,15 @@ import { runTest, GlobalTestState, - MerchantPrivateApi, - WalletCli, } from "./harness"; -import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; -import { PreparePayResultType } from "taler-wallet-core"; +import { + createSimpleTestkudosEnvironment, + withdrawViaBank, + makeTestPayment, +} from "./helpers"; /** - * Run test for basic, bank-integrated withdrawal. + * Run test for basic, bank-integrated withdrawal and payment. */ runTest(async (t: GlobalTestState) => { // Set up test environment @@ -43,45 +44,11 @@ runTest(async (t: GlobalTestState) => { await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:20" }); - // Set up order. - - const orderResp = await MerchantPrivateApi.createOrder(merchant, "default", { - order: { - summary: "Buy me!", - amount: "TESTKUDOS:5", - fulfillment_url: "taler://fulfillment-success/thx", - }, - }); - - let orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { - orderId: orderResp.order_id, - }); - - t.assertTrue(orderStatus.order_status === "unpaid"); - - // Make wallet pay for the order - - const preparePayResult = await wallet.preparePay({ - talerPayUri: orderStatus.taler_pay_uri, - }); - - t.assertTrue( - preparePayResult.status === PreparePayResultType.PaymentPossible, - ); - - const r2 = await wallet.apiRequest("confirmPay", { - // FIXME: should be validated, don't cast! - proposalId: preparePayResult.proposalId, - }); - t.assertTrue(r2.type === "response"); - - // Check if payment was successful. - - orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { - orderId: orderResp.order_id, - }); - - t.assertTrue(orderStatus.order_status === "paid"); + const order = { + summary: "Buy me!", + amount: "TESTKUDOS:5", + fulfillment_url: "taler://fulfillment-success/thx", + }; - await t.shutdown(); + await makeTestPayment(t, { wallet, merchant, order }); }); |