taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit cba2930d743a0f6a42420ea4d3dc43241477e386
parent 9a299f4e4e60df79eeaf96724ef79d016350a0b7
Author: Florian Dold <florian@dold.me>
Date:   Fri, 22 May 2026 21:51:16 +0200

harness: simplify test

Diffstat:
Mpackages/taler-harness/src/integrationtests/test-kyc-merchant-wallet-reuse.ts | 162++++++++++---------------------------------------------------------------------
Mpackages/taler-util/src/http-client/merchant.ts | 16+++++++++++++++-
2 files changed, 34 insertions(+), 144 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/test-kyc-merchant-wallet-reuse.ts b/packages/taler-harness/src/integrationtests/test-kyc-merchant-wallet-reuse.ts @@ -18,20 +18,13 @@ * Imports. */ import { - AbsoluteTime, - AccessToken, - Duration, j2s, Logger, - succeedOrThrow, + MerchantAccountKycStatus, TalerExchangeHttpClient, TalerMerchantInstanceHttpClient, TalerProtocolDuration, - TransactionMajorState, - TransactionMinorState, - TransactionType, } from "@gnu-taler/taler-util"; -import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { withdrawViaBankV3 } from "../harness/environments.js"; import { startFakeChallenger } from "../harness/fake-challenger.js"; import { GlobalTestState, harnessHttpLib, waitMs } from "../harness/harness.js"; @@ -76,138 +69,6 @@ export async function runKycMerchantWalletReuseTest(t: GlobalTestState) { t.logStep("withdrawal done"); - const peerResp = await walletClient.call( - WalletApiOperation.InitiatePeerPushDebit, - { - partialContractTerms: { - amount: "CHF:5", - purse_expiration: AbsoluteTime.toProtocolTimestamp( - AbsoluteTime.addDuration( - AbsoluteTime.now(), - Duration.fromSpec({ minutes: 5 }), - ), - ), - summary: "Test", - }, - }, - ); - - await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { - transactionId: peerResp.transactionId, - txState: { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.Ready, - }, - }); - - t.logStep("p2p ready"); - - const pushDebitTxDet = await walletClient.call( - WalletApiOperation.GetTransactionById, - { - transactionId: peerResp.transactionId, - }, - ); - t.assertDeepEqual(pushDebitTxDet.type, TransactionType.PeerPushDebit); - const talerUri = pushDebitTxDet.talerUri; - t.assertTrue(typeof talerUri === "string"); - - const prepareResp = await walletClient.call( - WalletApiOperation.PreparePeerPushCredit, - { - talerUri, - }, - ); - - await walletClient.call(WalletApiOperation.ConfirmPeerPushCredit, { - transactionId: prepareResp.transactionId, - }); - - t.logStep("p2p confirmed"); - - await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { - transactionId: prepareResp.transactionId, - timeout: { seconds: 10 }, - txState: { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.KycRequired, - }, - }); - - t.logStep("p2p merge kyc required"); - - const pushCreditTxDet = await walletClient.call( - WalletApiOperation.GetTransactionById, - { - transactionId: prepareResp.transactionId, - }, - ); - - const paytoHash = pushCreditTxDet.kycPaytoHash; - t.assertTrue(!!paytoHash); - - const accessToken = pushCreditTxDet.kycAccessToken; - - t.assertTrue(typeof accessToken === "string"); - - const infoResp = await exchangeApi.checkKycInfo(accessToken as AccessToken); - - console.log(j2s(infoResp)); - - t.assertDeepEqual(infoResp.case, "ok"); - - const myId = infoResp.body.requirements.find((x) => - x.description.includes("TAN letter"), - )?.id; - t.assertTrue(!!myId); - - const startResp = succeedOrThrow( - await exchangeApi.startExternalKycProcess(myId, {}), - ); - console.log(`start resp`, j2s(startResp)); - - let challengerRedirectUrl = startResp.redirect_url; - - const resp = await harnessHttpLib.fetch(challengerRedirectUrl); - const respJson = await resp.json(); - console.log(`challenger resp: ${j2s(respJson)}`); - - const nonce = respJson.nonce; - t.assertTrue(typeof nonce === "string"); - const proofRedirectUrl = respJson.redirect_url; - - challenger.fakeVerification(nonce, { - CONTACT_NAME: "Richard Stallman", - ADDRESS_LINES: "Bundesgasse 1\n1234 Bern", - }); - - console.log("nonce", nonce); - console.log("proof redirect URL", proofRedirectUrl); - - const proofResp = await harnessHttpLib.fetch(proofRedirectUrl, { - redirect: "manual", - }); - console.log("proof status:", proofResp.status); - if (proofResp.status === 404) { - console.log(j2s(await proofResp.text())); - } - t.assertDeepEqual(proofResp.status, 303); - - const infoResp2 = await exchangeApi.checkKycInfo(accessToken as AccessToken); - - console.log(j2s(infoResp2)); - - if (infoResp2.case === "ok" && infoResp2.body.requirements.length != 0) { - t.fail("requirements may not include ToS after KYC for P2P"); - } - - await walletClient.call(WalletApiOperation.TestingWaitTransactionState, { - transactionId: prepareResp.transactionId, - txState: { - major: TransactionMajorState.Done, - }, - }); - { const { accessToken: mt1Tok } = await merchant.addInstanceWithWireAccount( { @@ -227,15 +88,30 @@ export async function runKycMerchantWalletReuseTest(t: GlobalTestState) { ); while (true) { - const st = await merchantApi.getCurrentInstanceKycStatus(mt1Tok); + const stResp = await merchantApi.getCurrentInstanceKycStatus(mt1Tok); - console.log(j2s(st)); + console.log(j2s(stResp)); - if (st.case != "ok") { + if (stResp.case != "ok") { await waitMs(1000); + continue; } + t.assertTrue(stResp.body.kyc_data.length === 1); + + const stTag = stResp.body.kyc_data[0].status; + + if (stTag === MerchantAccountKycStatus.EXCHANGE_UNREACHABLE) { + logger.info("not yet ready, waiting"); + await waitMs(1000); + continue; + } + + if (stTag === MerchantAccountKycStatus.KYC_WIRE_REQUIRED) { + break; + } + t.fail(`Unexpected /kyc status: ${stTag}`); } } } diff --git a/packages/taler-util/src/http-client/merchant.ts b/packages/taler-util/src/http-client/merchant.ts @@ -863,7 +863,21 @@ export class TalerMerchantInstanceHttpClient { async getCurrentInstanceKycStatus( token: AccessToken, params: TalerMerchantApi.GetKycStatusRequestParams = {}, - ) { + ): Promise< + | OperationFail<HttpStatusCode.NotFound> + | OperationFail<HttpStatusCode.NoContent> + | OperationOk<{ + kyc_data: TalerMerchantApi.MerchantAccountKycRedirect[]; + etag: string | undefined; + }> + | OperationAlternative< + HttpStatusCode.NotModified, + { readonly etag: string | undefined } + > + | OperationFail<HttpStatusCode.Unauthorized> + | OperationFail<HttpStatusCode.ServiceUnavailable> + | OperationFail<HttpStatusCode.GatewayTimeout> + > { const url = new URL(`private/kyc`, this.baseUrl); if (params.wireHash) {