commit 1fa86832fe20cc201bb18d4757eb55dc6f99a363
parent 2edf82dc34ed576e802824fb9deb83565d82916b
Author: Iván Ávalos <avalos@disroot.org>
Date: Wed, 30 Jul 2025 12:44:38 +0200
harness: add p2p + deposit + kyc-auth test
Diffstat:
2 files changed, 167 insertions(+), 0 deletions(-)
diff --git a/packages/taler-harness/src/integrationtests/test-kyc-deposit-kycauth.ts b/packages/taler-harness/src/integrationtests/test-kyc-deposit-kycauth.ts
@@ -0,0 +1,165 @@
+import {
+ AbsoluteTime,
+ AmountString,
+ Configuration,
+ Duration,
+ TransactionMajorState,
+ TransactionMinorState,
+ TransactionType,
+} from "@gnu-taler/taler-util";
+import {
+ configureCommonKyc,
+ createKycTestkudosEnvironment,
+ createWalletDaemonWithClient,
+ withdrawViaBankV3,
+} from "../harness/environments.js";
+import {
+ GlobalTestState,
+ getTestHarnessPaytoForLabel,
+} from "../harness/harness.js";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
+
+function adjustExchangeConfig(config: Configuration) {
+ configureCommonKyc(config);
+
+ config.setString("KYC-RULE-R1", "operation_type", "deposit");
+ config.setString("KYC-RULE-R1", "enabled", "yes");
+ config.setString("KYC-RULE-R1", "exposed", "yes");
+ config.setString("KYC-RULE-R1", "is_and_combinator", "yes");
+ config.setString("KYC-RULE-R1", "threshold", "TESTKUDOS:5");
+ config.setString("KYC-RULE-R1", "timeframe", "1d");
+ config.setString("KYC-RULE-R1", "next_measures", "M1");
+
+ config.setString("KYC-MEASURE-M1", "check_name", "C1");
+ config.setString("KYC-MEASURE-M1", "context", "{}");
+ config.setString("KYC-MEASURE-M1", "program", "NONE");
+
+ config.setString("KYC-CHECK-C1", "type", "INFO");
+ config.setString("KYC-CHECK-C1", "description", "my check!");
+ config.setString("KYC-CHECK-C1", "fallback", "FREEZE");
+}
+
+export async function runKycDepositKycauthTest(t: GlobalTestState) {
+ // Set up test environment
+
+ // wallet that will send p2p transfer
+ const { walletClient: w0, bankClient, exchange } =
+ await createKycTestkudosEnvironment(t, { adjustExchangeConfig });
+
+ // wallet that will receive p2p transfer and do kyc + deposit
+ const w1 = await createWalletDaemonWithClient(t, {
+ name: "w0",
+ });
+
+ await withdrawViaBankV3(t, {
+ bankClient,
+ amount: "TESTKUDOS:50",
+ exchange: exchange,
+ walletClient: w0,
+ });
+
+ await w1.walletClient.call(WalletApiOperation.AddExchange, {
+ exchangeBaseUrl: exchange.baseUrl,
+ });
+
+ await w1.walletClient.call(WalletApiOperation.SetExchangeTosAccepted, {
+ exchangeBaseUrl: exchange.baseUrl,
+ });
+
+ const initRes = await w1.walletClient.call(
+ WalletApiOperation.InitiatePeerPullCredit,
+ {
+ partialContractTerms: {
+ amount: "TESTKUDOS:40",
+ summary: "P2P payment",
+ purse_expiration: AbsoluteTime.toProtocolTimestamp(
+ AbsoluteTime.addDuration(
+ AbsoluteTime.now(),
+ Duration.fromSpec({ days: 2}),
+ ),
+ ),
+ },
+ },
+ );
+
+ await w1.walletClient.call(WalletApiOperation.TestingWaitTransactionState, {
+ transactionId: initRes.transactionId,
+ txState: {
+ major: TransactionMajorState.Pending,
+ minor: TransactionMinorState.Ready,
+ },
+ });
+
+ const txPullCredit = await w1.walletClient.call(
+ WalletApiOperation.GetTransactionById,
+ {
+ transactionId: initRes.transactionId,
+ },
+ );
+
+ t.assertDeepEqual(txPullCredit.type, TransactionType.PeerPullCredit);
+
+ const txPullDebit = await w0.call(WalletApiOperation.PreparePeerPullDebit, {
+ talerUri: txPullCredit.talerUri!,
+ });
+
+ await w0.call(WalletApiOperation.ConfirmPeerPullDebit, {
+ transactionId: txPullDebit.transactionId,
+ });
+
+ await w1.walletClient.call(WalletApiOperation.TestingWaitTransactionState, {
+ transactionId: txPullCredit.transactionId,
+ txState: {
+ major: TransactionMajorState.Done,
+ },
+ });
+
+ const { transactionId: depositTxId } = await w1.walletClient.call(
+ WalletApiOperation.GenerateDepositGroupTxId,
+ {},
+ );
+
+ const deposit = await w1.walletClient.call(
+ WalletApiOperation.CreateDepositGroup,
+ {
+ amount: "TESTKUDOS:10" as AmountString,
+ depositPaytoUri: getTestHarnessPaytoForLabel("foo"),
+ transactionId: depositTxId,
+ },
+ );
+
+ await w1.walletClient.call(WalletApiOperation.TestingWaitTransactionState, {
+ transactionId: depositTxId,
+ txState: {
+ major: TransactionMajorState.Pending,
+ minor: TransactionMinorState.KycInit,
+ },
+ });
+
+ t.logStep("deposit pending(kyc-init)");
+
+ await w1.walletClient.call(WalletApiOperation.TestingWaitTransactionState, {
+ transactionId: depositTxId,
+ txState: {
+ major: TransactionMajorState.Pending,
+ minor: TransactionMinorState.KycAuthRequired,
+ },
+ });
+
+ t.logStep("deposit pending(kyc-auth)");
+
+ const depositTx = await w1.walletClient.call(
+ WalletApiOperation.GetTransactionById,
+ { transactionId: depositTxId },
+ );
+
+ t.assertDeepEqual(depositTx.type, TransactionType.Deposit);
+ t.assertDeepEqual(depositTx.txState.minor,
+ TransactionMinorState.KycAuthRequired);
+ t.assertTrue(depositTx.kycAuthTransferInfo !== undefined);
+ t.assertTrue(depositTx.kycAuthTransferInfo.creditPaytoUris.length > 0);
+
+ // TODO: fulfill kyc-auth
+}
+
+runKycDepositKycauthTest.suites = ["wallet"];
diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts
@@ -189,6 +189,7 @@ import { runWithdrawalHugeTest } from "./test-withdrawal-huge.js";
import { runWithdrawalIdempotentTest } from "./test-withdrawal-idempotent.js";
import { runWithdrawalManualTest } from "./test-withdrawal-manual.js";
import { runWithdrawalPrepareTest } from "./test-withdrawal-prepare.js";
+import { runKycDepositKycauthTest } from "./test-kyc-deposit-kycauth.js";
/**
* Test runner.
@@ -318,6 +319,7 @@ const allTests: TestMainFunction[] = [
runKycFailRecoverDoubleTest,
runKycFailRecoverSimpleTest,
runKycDepositDepositTest,
+ runKycDepositKycauthTest,
runKycMerchantDepositTest,
runKycMerchantDepositRewriteTest,
runKycMerchantAggregateTest,