From 7deefd5b2d58a9dc2ba91b2b824d4135a4e0837e Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 24 Aug 2020 20:00:15 +0530 Subject: fix wallet DB --- .../src/test-merchant-refund-api.ts | 189 ++++++++++++++++++--- 1 file changed, 169 insertions(+), 20 deletions(-) (limited to 'packages/taler-integrationtests/src/test-merchant-refund-api.ts') diff --git a/packages/taler-integrationtests/src/test-merchant-refund-api.ts b/packages/taler-integrationtests/src/test-merchant-refund-api.ts index 61f08780c..92d635b2c 100644 --- a/packages/taler-integrationtests/src/test-merchant-refund-api.ts +++ b/packages/taler-integrationtests/src/test-merchant-refund-api.ts @@ -17,35 +17,150 @@ /** * Imports. */ -import { runTest, GlobalTestState, MerchantPrivateApi } from "./harness"; -import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers"; +import { + runTest, + GlobalTestState, + MerchantPrivateApi, + MerchantService, + BankServiceInterface, + MerchantServiceInterface, + WalletCli, + ExchangeServiceInterface, +} from "./harness"; +import { + createSimpleTestkudosEnvironment, + withdrawViaBank, + SimpleTestEnvironment, +} from "./helpers"; import { PreparePayResultType, URL } from "taler-wallet-core"; import axios from "axios"; -/** - * Test case for the refund API of the merchant backend. - */ -runTest(async (t: GlobalTestState) => { - // Set up test environment +async function testRefundApiWithFulfillmentUrl( + t: GlobalTestState, + env: { + merchant: MerchantServiceInterface; + bank: BankServiceInterface; + wallet: WalletCli; + exchange: ExchangeServiceInterface; + }, +): Promise { + const { wallet, bank, exchange, merchant } = env; - const { - wallet, - bank, - exchange, - merchant, - } = await createSimpleTestkudosEnvironment(t); + // Set up order. + const orderResp = await MerchantPrivateApi.createOrder(merchant, "default", { + order: { + summary: "Buy me!", + amount: "TESTKUDOS:5", + fulfillment_url: "https://example.com/fulfillment", + }, + }); - // Withdraw digital cash into the wallet. + let orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { + orderId: orderResp.order_id, + }); - await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:20" }); + t.assertTrue(orderStatus.order_status === "unpaid"); - // Set up order. + const talerPayUri = orderStatus.taler_pay_uri; + const orderId = orderResp.order_id; + + // Make wallet pay for the order + + let preparePayResult = await wallet.preparePay({ + talerPayUri, + }); + + t.assertTrue( + preparePayResult.status === PreparePayResultType.PaymentPossible, + ); + + const r2 = await wallet.apiRequest("confirmPay", { + 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"); + + preparePayResult = await wallet.preparePay({ + talerPayUri, + }); + + t.assertTrue( + preparePayResult.status === PreparePayResultType.AlreadyConfirmed, + ); + + await MerchantPrivateApi.giveRefund(merchant, { + amount: "TESTKUDOS:5", + instance: "default", + justification: "foo", + orderId: orderResp.order_id, + }); + + orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, { + orderId: orderResp.order_id, + }); + + t.assertTrue(orderStatus.order_status === "paid"); + + t.assertAmountEquals(orderStatus.refund_amount, "TESTKUDOS:5"); + + // Now test what the merchant gives as a response for various requests to the + // public order status URL! + + let publicOrderStatusUrl = new URL( + `orders/${orderId}`, + merchant.makeInstanceBaseUrl(), + ); + publicOrderStatusUrl.searchParams.set( + "h_contract", + preparePayResult.contractTermsHash, + ); + let publicOrderStatusResp = await axios.get(publicOrderStatusUrl.href, { + validateStatus: () => true, + }); + console.log(publicOrderStatusResp.data); + t.assertTrue(publicOrderStatusResp.status === 200); + t.assertAmountEquals(publicOrderStatusResp.data.refund_amount, "TESTKUDOS:5"); + + publicOrderStatusUrl = new URL( + `orders/${orderId}`, + merchant.makeInstanceBaseUrl(), + ); + + publicOrderStatusResp = await axios.get(publicOrderStatusUrl.href, { + validateStatus: () => true, + }); + console.log(publicOrderStatusResp.data); + // We didn't give any authentication, so we should get a fulfillment URL back + t.assertTrue(publicOrderStatusResp.status === 202); + const fu = publicOrderStatusResp.data.fulfillment_url; + t.assertTrue(typeof fu === "string" && fu.startsWith("https://example.com")); +} + +async function testRefundApiWithFulfillmentMessage( + t: GlobalTestState, + env: { + merchant: MerchantServiceInterface; + bank: BankServiceInterface; + wallet: WalletCli; + exchange: ExchangeServiceInterface; + }, +): Promise { + const { wallet, bank, exchange, merchant } = env; + + // Set up order. const orderResp = await MerchantPrivateApi.createOrder(merchant, "default", { order: { summary: "Buy me!", amount: "TESTKUDOS:5", - fulfillment_url: "taler://fulfillment-success/thx", + fulfillment_message: "Thank you for buying foobar", }, }); @@ -131,7 +246,41 @@ runTest(async (t: GlobalTestState) => { publicOrderStatusResp = await axios.get(publicOrderStatusUrl.href, { validateStatus: () => true, }); - console.log(publicOrderStatusResp.data) - // We didn't give any authentication, so this should be forbidden - t.assertTrue(publicOrderStatusResp.status === 403); + console.log(publicOrderStatusResp.data); + // We didn't give any authentication, so we should get a fulfillment URL back + t.assertTrue(publicOrderStatusResp.status === 202); + const fu = publicOrderStatusResp.data.fulfillment_message; + t.assertTrue(typeof fu === "string" && fu.startsWith("Thank you")); +} + +/** + * Test case for the refund API of the merchant backend. + */ +runTest(async (t: GlobalTestState) => { + // Set up test environment + + const { + wallet, + bank, + exchange, + merchant, + } = await createSimpleTestkudosEnvironment(t); + + // Withdraw digital cash into the wallet. + + await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:20" }); + + await testRefundApiWithFulfillmentUrl(t, { + wallet, + bank, + exchange, + merchant, + }); + + await testRefundApiWithFulfillmentMessage(t, { + wallet, + bank, + exchange, + merchant, + }); }); -- cgit v1.2.3