commit cba2930d743a0f6a42420ea4d3dc43241477e386
parent 9a299f4e4e60df79eeaf96724ef79d016350a0b7
Author: Florian Dold <florian@dold.me>
Date: Fri, 22 May 2026 21:51:16 +0200
harness: simplify test
Diffstat:
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) {