aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--integrationtests/.gitignore3
-rw-r--r--integrationtests/common.sh229
-rw-r--r--integrationtests/template.conf227
-rwxr-xr-xintegrationtests/test-base.sh13
-rwxr-xr-xintegrationtests/test-coin-expiration.sh14
-rwxr-xr-xintegrationtests/test-double-link.sh19
-rwxr-xr-xintegrationtests/test-double-spend.sh22
-rwxr-xr-xintegrationtests/test-recoup.sh178
-rwxr-xr-xintegrationtests/test-refund.sh26
-rwxr-xr-xintegrationtests/test-retries.sh47
-rwxr-xr-xintegrationtests/test-tip.sh18
-rwxr-xr-xintegrationtests/test-withdrawal.sh19
-rw-r--r--tests/.gitignore1
-rw-r--r--tests/__init__.py23
-rw-r--r--tests/components/__init__.py0
-rw-r--r--tests/components/bank.py87
-rw-r--r--tests/components/config.py62
-rw-r--r--tests/components/exchange.py53
-rw-r--r--tests/components/merchant.py66
-rw-r--r--tests/components/taler_service.py18
-rw-r--r--tests/components/template.ini228
-rw-r--r--tests/components/wallet.py51
-rw-r--r--tests/conftest.py38
-rw-r--r--tests/requirements.txt4
-rw-r--r--tests/test_exchange_management.py18
-rw-r--r--tests/test_payments.py11
-rw-r--r--tests/test_withdrawal.py156
27 files changed, 0 insertions, 1631 deletions
diff --git a/integrationtests/.gitignore b/integrationtests/.gitignore
deleted file mode 100644
index 447e2f328..000000000
--- a/integrationtests/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.log
-*-prod.conf
-*.wallet.json
diff --git a/integrationtests/common.sh b/integrationtests/common.sh
deleted file mode 100644
index d3f347672..000000000
--- a/integrationtests/common.sh
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/bin/bash
-
-set -eu
-
-function setup_config() {
- echo -n "Testing for taler-bank-manage"
- taler-bank-manage -h >/dev/null </dev/null || exit_skip " MISSING"
- echo " FOUND"
- echo -n "Testing for taler-wallet-cli"
- taler-wallet-cli -v >/dev/null </dev/null || exit_skip " MISSING"
- echo " FOUND"
- echo -n "Testing for taler-merchant-httpd"
- # TODO "taler-merchant-httpd -v" should not return an error
- [[ "$(taler-merchant-httpd -v)" =~ "taler-merchant-httpd v" ]] || exit_skip " MISSING"
- echo " FOUND"
- bc -v >/dev/null </dev/null || exit_error "Please install bc"
-
- trap shutdown_services EXIT
-
- SCRIPT_NAME=$1
-
- # Where do we write the result?
- export BASEDB=${1:-"auditor-${SCRIPT_NAME}db"}
-
- # Name of the Postgres database we will use for the script.
- # Will be dropped, do NOT use anything that might be used
- # elsewhere
- export TARGET_DB=taler-auditor-${SCRIPT_NAME}db
-
- # Configuration file will be edited, so we create one
- # from the template.
- export CONF=test-${SCRIPT_NAME}.conf
- cp template.conf "$CONF"
-
- export LOG=test-${SCRIPT_NAME}.log
- rm "$LOG" 2>/dev/null || true
-
- export WALLET_DB=wallet-${SCRIPT_NAME}.json
- rm "$WALLET_DB" 2>/dev/null || true
-
- # Clean up
- DATA_DIR=$(taler-config -f -c "$CONF" -s PATHS -o TALER_HOME)
- rm -rf "$DATA_DIR" || true
-
- # reset database
- dropdb "$TARGET_DB" >/dev/null 2>/dev/null || true
- createdb "$TARGET_DB" || exit_skip "Could not create database $TARGET_DB"
-
- # obtain key configuration data
- MASTER_PRIV_FILE=$(taler-config -f -c "$CONF" -s EXCHANGE -o MASTER_PRIV_FILE)
- MASTER_PRIV_DIR=$(dirname "$MASTER_PRIV_FILE")
- mkdir -p "$MASTER_PRIV_DIR"
- gnunet-ecc -g1 "$MASTER_PRIV_FILE" >/dev/null
- MASTER_PUB=$(gnunet-ecc -p "$MASTER_PRIV_FILE")
- EXCHANGE_URL=$(taler-config -c "$CONF" -s EXCHANGE -o BASE_URL)
- MERCHANT_PORT=$(taler-config -c "$CONF" -s MERCHANT -o PORT)
- # shellcheck disable=SC2034
- MERCHANT_URL=http://localhost:${MERCHANT_PORT}/
- BANK_PORT=$(taler-config -c "$CONF" -s BANK -o HTTP_PORT)
- # shellcheck disable=SC2034
- BANK_URL=http://localhost:${BANK_PORT}/
- AUDITOR_URL=http://localhost:8083/
-
- # patch configuration
- taler-config -c "$CONF" -s exchange -o MASTER_PUBLIC_KEY -V "$MASTER_PUB"
- taler-config -c "$CONF" -s merchant-exchange-default -o MASTER_KEY -V "$MASTER_PUB"
- taler-config -c "$CONF" -s exchangedb-postgres -o CONFIG -V "postgres:///$TARGET_DB"
- taler-config -c "$CONF" -s auditordb-postgres -o CONFIG -V "postgres:///$TARGET_DB"
- taler-config -c "$CONF" -s merchantdb-postgres -o CONFIG -V "postgres:///$TARGET_DB"
- taler-config -c "$CONF" -s bank -o database -V "postgres:///$TARGET_DB"
-}
-
-function setup_services() {
- # setup exchange
- echo "Setting up exchange"
- taler-exchange-dbinit -c "$CONF"
- taler-exchange-wire -c "$CONF" 2>taler-exchange-wire.log
- taler-exchange-keyup -L INFO -c "$CONF" -o e2a.dat 2>taler-exchange-keyup.log
-
- # setup auditor
- echo "Setting up auditor"
- taler-auditor-dbinit -c "$CONF"
- taler-auditor-exchange -c "$CONF" -m "$MASTER_PUB" -u "$EXCHANGE_URL"
- taler-auditor-sign -c "$CONF" -u $AUDITOR_URL -r e2a.dat -o a2e.dat -m "$MASTER_PUB"
- rm -f e2a.dat
-
- # provide auditor's signature to exchange
- ABD=$(taler-config -c "$CONF" -s EXCHANGEDB -o AUDITOR_BASE_DIR -f)
- mkdir -p "$ABD"
- mv a2e.dat "$ABD"
-}
-
-function launch_services() {
- # Launch services
- echo "Launching services"
- taler-bank-manage-testing "$CONF" "postgres:///$TARGET_DB" serve-http &>bank-"$SCRIPT_NAME".log &
- taler-exchange-httpd -c "$CONF" 2>taler-exchange-httpd.log &
- # shellcheck disable=SC2034
- EXCHANGE_PID=$!
- taler-merchant-httpd -c "$CONF" -L INFO 2>taler-merchant-httpd.log &
- # shellcheck disable=SC2034
- MERCHANT_PID=$!
- taler-exchange-wirewatch -c "$CONF" 2>taler-exchange-wirewatch.log &
- taler-auditor-httpd -c "$CONF" 2>taler-auditor-httpd.log &
-}
-
-function wait_for_services() {
- # Wait for bank to be available (usually the slowest)
- for _ in $(seq 1 50); do
- echo -n "."
- sleep 0.2
- OK=0
- wget "$BANK_URL" -o /dev/null -O /dev/null >/dev/null || continue
- OK=1
- break
- done
- if [ 1 != $OK ]; then
- exit_skip "Failed to launch bank"
- fi
- # Wait for all other services to be available
- for _ in $(seq 1 50); do
- echo -n "."
- sleep 0.1
- OK=0
- wget "$EXCHANGE_URL" -o /dev/null -O /dev/null >/dev/null || continue
- wget "$MERCHANT_URL" -o /dev/null -O /dev/null >/dev/null || continue
- wget "$AUDITOR_URL" -o /dev/null -O /dev/null >/dev/null || continue
- OK=1
- break
- done
- if [ 1 != $OK ]; then
- shutdown_services
- exit_skip "Failed to launch services"
- fi
- echo " DONE"
-}
-
-# Configure merchant instances
-function configure_merchant() {
- json='
- {
- "id": "default",
- "name": "GNU Taler Merchant",
- "payto_uris": ["payto://x-taler-bank/test_merchant"],
- "address": {},
- "jurisdiction": {},
- "default_max_wire_fee": "TESTKUDOS:1",
- "default_wire_fee_amortization": 3,
- "default_max_deposit_fee": "TESTKUDOS:1",
- "default_wire_transfer_delay": {"d_ms": "forever"},
- "default_pay_delay": {"d_ms": "forever"}
- }
- '
- curl -v -XPOST --data "$json" "${MERCHANT_URL}private/instances"
-}
-
-function normal_start_and_wait() {
- setup_config "$1"
- setup_services
- launch_services
- wait_for_services
- configure_merchant
-}
-
-# provide the service URL as first parameter
-function wait_for_service() {
- for _ in $(seq 1 50); do
- echo -n "."
- sleep 0.1
- wget "$1" -o /dev/null -O /dev/null >/dev/null || continue
- echo " DONE"
- break
- done
-}
-
-function get_balance() {
- taler-wallet-cli --wallet-db="$WALLET_DB" balance 2>>"$LOG"
-}
-
-function assert_less_than() {
- AMOUNT_1=${1//TESTKUDOS:/}
- AMOUNT_2=${2//TESTKUDOS:/}
- if (($(echo "$AMOUNT_1 >= $AMOUNT_2" | bc -l))); then
- exit_error "$1 is not lower than $2"
- fi
-}
-
-function assert_greater_than() {
- AMOUNT_1=${1//TESTKUDOS:/}
- AMOUNT_2=${2//TESTKUDOS:/}
- if (($(echo "$AMOUNT_1 <= $AMOUNT_2" | bc -l))); then
- exit_error "$1 is not greater than $2"
- fi
-}
-
-function assert_equal() {
- [[ "$1" == "$2" ]] || exit_error "$1 is not equal to $2"
-}
-
-function shutdown_services() {
- echo "Shutting down services"
- jobs -p | xargs --no-run-if-empty kill || true
- wait
-
- # clean up
- echo "Final clean up"
- dropdb "$TARGET_DB" >/dev/null 2>/dev/null || true
-
- rm "$WALLET_DB" 2>/dev/null || true
-
- rm -rf "$DATA_DIR" || true
- rm "$CONF"
-}
-
-# Exit, with status code "skip" (no 'real' failure)
-function exit_skip() {
- echo "$1"
- exit 77
-}
-
-function exit_error() {
- echo -e "\033[0;31mError: $1\033[0m"
- exit 1
-}
-
-function exit_success() {
- echo -e "\033[0;32mSUCCESS \o/\033[0m"
- exit 0
-}
diff --git a/integrationtests/template.conf b/integrationtests/template.conf
deleted file mode 100644
index 306a9c674..000000000
--- a/integrationtests/template.conf
+++ /dev/null
@@ -1,227 +0,0 @@
-[exchange]
-KEYDIR = ${TALER_DATA_HOME}/exchange/live-keys/
-REVOCATION_DIR = ${TALER_DATA_HOME}/exchange/revocations/
-MAX_KEYS_CACHING = forever
-DB = postgres
-MASTER_PRIV_FILE = ${TALER_DATA_HOME}/exchange/offline-keys/master.priv
-SERVE = tcp
-UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http
-UNIXPATH_MODE = 660
-PORT = 8081
-BASE_URL = http://localhost:8081/
-SIGNKEY_DURATION = 4 weeks
-LEGAL_DURATION = 2 years
-LOOKAHEAD_SIGN = 32 weeks 1 day
-LOOKAHEAD_PROVIDE = 4 weeks 1 day
-
-[merchant]
-SERVE = tcp
-PORT = 9966
-UNIXPATH = ${TALER_RUNTIME_DIR}/merchant.http
-UNIXPATH_MODE = 660
-DEFAULT_WIRE_FEE_AMORTIZATION = 1
-DB = postgres
-WIREFORMAT = default
-# Set very low, so we can be sure that the database generated
-# will contain wire transfers "ready" for the aggregator.
-WIRE_TRANSFER_DELAY = 1 minute
-DEFAULT_PAY_DEADLINE = 1 day
-DEFAULT_MAX_DEPOSIT_FEE = TESTKUDOS:0.1
-KEYFILE = ${TALER_DATA_HOME}/merchant/merchant.priv
-DEFAULT_MAX_WIRE_FEE = TESTKUDOS:0.10
-
-# Ensure that merchant reports EVERY deposit confirmation to auditor
-FORCE_AUDIT = YES
-
-[instance-default]
-KEYFILE = ${TALER_DATA_HOME}/merchant/default.priv
-NAME = Merchant Inc.
-TIP_EXCHANGE = http://localhost:8081/
-# TODO necessary to specify a different key here?
-TIP_RESERVE_PRIV_FILENAME = ${TALER_DATA_HOME}/merchant/default.priv
-
-[auditor]
-DB = postgres
-AUDITOR_PRIV_FILE = ${TALER_DATA_HOME}/auditor/offline-keys/auditor.priv
-SERVE = tcp
-UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http
-UNIXPATH_MODE = 660
-PORT = 8083
-AUDITOR_URL = http://localhost:8083/
-TINY_AMOUNT = TESTKUDOS:0.01
-
-[PATHS]
-TALER_HOME = ${PWD}/generate_auditordb_home/
-TALER_DATA_HOME = $TALER_HOME/.local/share/taler/
-TALER_CONFIG_HOME = $TALER_HOME/.config/taler/
-TALER_CACHE_HOME = $TALER_HOME/.cache/taler/
-TALER_RUNTIME_DIR = ${TMPDIR:-${TMP:-/tmp}}/taler-system-runtime/
-
-[bank]
-DATABASE = postgres:///taler-auditor-basedb
-MAX_DEBT = TESTKUDOS:50.0
-MAX_DEBT_BANK = TESTKUDOS:100000.0
-HTTP_PORT = 8082
-SUGGESTED_EXCHANGE = http://localhost:8081/
-SUGGESTED_EXCHANGE_PAYTO = payto://x-taler-bank/localhost/2
-ALLOW_REGISTRATIONS = YES
-
-[exchangedb]
-AUDITOR_BASE_DIR = ${TALER_DATA_HOME}/auditors/
-WIREFEE_BASE_DIR = ${TALER_DATA_HOME}/exchange/wirefees/
-IDLE_RESERVE_EXPIRATION_TIME = 4 weeks
-LEGAL_RESERVE_EXPIRATION_TIME = 7 years
-
-[exchange_keys]
-signkey_duration = 4 weeks
-legal_duration = 2 years
-lookahead_sign = 32 weeks 1 day
-lookahead_provide = 4 weeks 1 day
-
-[taler]
-CURRENCY = TESTKUDOS
-CURRENCY_ROUND_UNIT = TESTKUDOS:0.01
-
-[exchange-account-1]
-WIRE_RESPONSE = ${TALER_DATA_HOME}/exchange/account-1.json
-PAYTO_URI = payto://x-taler-bank/localhost/Exchange
-enable_debit = yes
-enable_credit = yes
-WIRE_GATEWAY_URL = "http://localhost:8082/taler-wire-gateway/Exchange/"
-WIRE_GATEWAY_AUTH_METHOD = basic
-USERNAME = Exchange
-PASSWORD = x
-
-[merchant-account-merchant]
-PAYTO_URI = payto://x-taler-bank/localhost/42
-WIRE_RESPONSE = ${TALER_CONFIG_HOME}/merchant/account-3.json
-HONOR_default = YES
-ACTIVE_default = YES
-
-[fees-x-taler-bank]
-wire-fee-2020 = TESTKUDOS:0.01
-closing-fee-2020 = TESTKUDOS:0.01
-wire-fee-2021 = TESTKUDOS:0.01
-closing-fee-2021 = TESTKUDOS:0.01
-wire-fee-2022 = TESTKUDOS:0.01
-closing-fee-2022 = TESTKUDOS:0.01
-wire-fee-2023 = TESTKUDOS:0.01
-closing-fee-2023 = TESTKUDOS:0.01
-wire-fee-2024 = TESTKUDOS:0.01
-closing-fee-2024 = TESTKUDOS:0.01
-wire-fee-2025 = TESTKUDOS:0.01
-closing-fee-2025 = TESTKUDOS:0.01
-wire-fee-2026 = TESTKUDOS:0.01
-closing-fee-2026 = TESTKUDOS:0.01
-wire-fee-2027 = TESTKUDOS:0.01
-closing-fee-2027 = TESTKUDOS:0.01
-wire-fee-2028 = TESTKUDOS:0.01
-closing-fee-2028 = TESTKUDOS:0.01
-
-[merchant-instance-wireformat-default]
-TEST_RESPONSE_FILE = ${TALER_CONFIG_HOME}/merchant/wire/tutorial.json
-
-[merchant-exchange-default]
-EXCHANGE_BASE_URL = http://localhost:8081/
-CURRENCY = TESTKUDOS
-
-[payments-generator]
-currency = TESTKUDOS
-instance = default
-bank = http://localhost:8082/
-merchant = http://localhost:9966/
-exchange_admin = http://localhost:18080/
-exchange-admin = http://localhost:18080/
-exchange = http://localhost:8081/
-
-[coin_kudos_ct_1]
-value = TESTKUDOS:0.01
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.01
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_ct_10]
-value = TESTKUDOS:0.10
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_1]
-value = TESTKUDOS:1
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.02
-fee_deposit = TESTKUDOS:0.02
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_2]
-value = TESTKUDOS:2
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.03
-fee_deposit = TESTKUDOS:0.03
-fee_refresh = TESTKUDOS:0.04
-fee_refund = TESTKUDOS:0.02
-rsa_keysize = 1024
-
-[coin_kudos_4]
-value = TESTKUDOS:4
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.03
-fee_deposit = TESTKUDOS:0.03
-fee_refresh = TESTKUDOS:0.04
-fee_refund = TESTKUDOS:0.02
-rsa_keysize = 1024
-
-[coin_kudos_5]
-value = TESTKUDOS:5
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_8]
-value = TESTKUDOS:8
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.05
-fee_deposit = TESTKUDOS:0.02
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.04
-rsa_keysize = 1024
-
-[coin_kudos_10]
-value = TESTKUDOS:10
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[benchmark]
-BANK_DETAILS = bank_details.json
-MERCHANT_DETAILS = merchant_details.json
diff --git a/integrationtests/test-base.sh b/integrationtests/test-base.sh
deleted file mode 100755
index 676ba7fb7..000000000
--- a/integrationtests/test-base.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-# Script to generate the basic database for auditor
-# testing from a 'correct' interaction between exchange,
-# wallet and merchant.
-
-source "common.sh"
-normal_start_and_wait "base"
-
-# run wallet CLI
-echo "Running wallet"
-taler-wallet-cli testing integrationtest -e "$EXCHANGE_URL" -m "$MERCHANT_URL" -b "$BANK_URL"
-
-exit_success
diff --git a/integrationtests/test-coin-expiration.sh b/integrationtests/test-coin-expiration.sh
deleted file mode 100755
index 83f7477bf..000000000
--- a/integrationtests/test-coin-expiration.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet automatically refreshes coins for they expire
-
-source "common.sh"
-normal_start_and_wait "coin-expiration"
-
-echo "Withdraw TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" >>"$LOG" 2>>"$LOG"
-echo "Balance after withdrawal: $(get_balance)"
-
-# TODO time-travel to check that wallet actually refreshed coin before expiration
-taler-wallet-cli --wallet-db="$WALLET_DB" advanced dump-coins
-
-exit_success
diff --git a/integrationtests/test-double-link.sh b/integrationtests/test-double-link.sh
deleted file mode 100755
index d5f5d3329..000000000
--- a/integrationtests/test-double-link.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# Script to check that Uris are properly handled when used a second time
-
-source "common.sh"
-normal_start_and_wait "double-link"
-
-echo "Getting pay taler:// Uri"
-PAY_URI=$(taler-wallet-cli testing gen-pay-uri -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:1" -s "foo" | grep -E -o 'taler://.*')
-echo "Trying to pay without balance"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" 2>&1 | grep -q "insufficient balance" || exit_error "not reporting insufficient balance"
-echo "Withdrawing"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" > /dev/null
-echo "Trying to pay again, should work this time"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" > /dev/null
-echo "Trying to pay what was paid already should throw error"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" 2>&1 | grep -q "already paid" || exit_error "not reporting already paid"
-echo "Already paid properly detected"
-
-exit_success
diff --git a/integrationtests/test-double-spend.sh b/integrationtests/test-double-spend.sh
deleted file mode 100755
index 81a4563a6..000000000
--- a/integrationtests/test-double-spend.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet can not double spend coins and handles this error well
-
-source "common.sh"
-normal_start_and_wait "double-spend"
-
-echo "Withdraw TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" >/dev/null
-# Copy wallet database before spending coins
-cp "$WALLET_DB" "$WALLET_DB.bak"
-echo "Spend all the money"
-taler-wallet-cli --wallet-db="$WALLET_DB" testing test-pay -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:9.5" -s "foo"
-echo "New balance: $(get_balance)"
-# Restore old wallet database
-mv "$WALLET_DB.bak" "$WALLET_DB"
-echo "Balance after getting old coins back: $(get_balance)"
-echo "Try to double-spend"
-# TODO this should probably fail more gracefully
-# "exchange_reply: { hint: 'insufficient funds', code: 1200 }
-taler-wallet-cli --wallet-db="$WALLET_DB" testing test-pay -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:9.5" -s "foo"
-
-exit_success
diff --git a/integrationtests/test-recoup.sh b/integrationtests/test-recoup.sh
deleted file mode 100755
index 72f7e1ad5..000000000
--- a/integrationtests/test-recoup.sh
+++ /dev/null
@@ -1,178 +0,0 @@
-#!/bin/bash
-# Script to test revocation.
-#
-# Requires the wallet CLI to be installed and in the path. Furthermore, the
-# user running this script must be Postgres superuser and be allowed to
-# create/drop databases.
-# Also the jq utility needs to be installed
-
-echo -n "Testing for jq"
-jq --version >/dev/null </dev/null || exit_skip " MISSING"
-echo " FOUND"
-
-source "common.sh"
-setup_config "recoup"
-
-TMP_DIR=$(mktemp -d revocation-tmp-XXXXXX)
-
-taler-config -c "$CONF" -s exchange -o KEYDIR -V "${TMP_DIR}/keydir/"
-taler-config -c "$CONF" -s exchange -o REVOCATION_DIR -V "${TMP_DIR}/revdir/"
-
-setup_services
-launch_services
-wait_for_services
-
-# run wallet CLI
-echo "Running wallet"
-taler-wallet-cli --wallet-db=$WALLET_DB --no-throttle \
- testing withdraw \
- -e $EXCHANGE_URL \
- -b $BANK_URL \
- -a TESTKUDOS:8
-
-
-export coins=$(taler-wallet-cli --wallet-db=$WALLET_DB advanced dump-coins)
-
-# Find coin we want to revoke
-export rc=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .coin_pub')
-# Find the denom
-export rd=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .denom_pub_hash')
-echo "Revoking denomination ${rd} (to affect coin ${rc})"
-# Find all other coins, which will be suspended
-export susp=$(echo "$coins" | jq --arg rc "$rc" '[.coins[] | select(.coin_pub != $rc) | .coin_pub]')
-
-# Do the revocation
-taler-exchange-keyup -o e2a2.dat -c $CONF -r $rd
-taler-auditor-sign -c $CONF -u $AUDITOR_URL -r e2a2.dat -o a2e2.dat -m $MASTER_PUB
-rm e2a2.dat
-mv a2e2.dat $ABD
-
-# Restart the exchange...
-kill -SIGUSR1 $EXCHANGE_PID
-sleep 1 # Give exchange time to re-scan data
-echo "Restarted the exchange post revocation"
-
-# Now we suspend the other coins, so later we will pay with the recouped coin
-taler-wallet-cli --wallet-db=$WALLET_DB advanced suspend-coins "$susp"
-
-# Update exchange /keys so recoup gets scheduled
-taler-wallet-cli --wallet-db=$WALLET_DB exchanges update \
- -f $EXCHANGE_URL
-
-# Block until scheduled operations are done
-taler-wallet-cli --wallet-db=$WALLET_DB run-until-done
-
-# Now we buy something, only the coins resulting from recouped will be
-# used, as other ones are suspended
-taler-wallet-cli --wallet-db=$WALLET_DB testing test-pay \
- -m $MERCHANT_URL -k sandbox \
- -a "TESTKUDOS:1" -s "foo"
-taler-wallet-cli --wallet-db=$WALLET_DB run-until-done
-
-echo "Purchase with recoup'ed coin (via reserve) done"
-
-# Find coin we want to refresh, then revoke
-export rrc=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:5"))][0] | .coin_pub')
-# Find the denom
-export zombie_denom=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:5"))][0] | .denom_pub_hash')
-
-echo "Will refresh coin ${rrc} of denomination ${zombie_denom}"
-# Find all other coins, which will be suspended
-export susp=$(echo "$coins" | jq --arg rrc "$rrc" '[.coins[] | select(.coin_pub != $rrc) | .coin_pub]')
-
-export rrc
-export zombie_denom
-
-# Travel into the future! (must match DURATION_WITHDRAW option)
-export TIMETRAVEL="--timetravel=604800000000"
-
-echo "Launching exchange 1 week in the future"
-kill -TERM $EXCHANGE_PID
-taler-exchange-httpd $TIMETRAVEL -c $CONF 2> taler-exchange-httpd.log &
-export EXCHANGE_PID=$!
-
-# Wait for exchange to be available
-for n in `seq 1 50`
-do
- echo -n "."
- sleep 0.1
- OK=0
- # exchange
- wget http://localhost:8081/ -o /dev/null -O /dev/null >/dev/null || continue
- OK=1
- break
-done
-
-echo "Refreshing coin $rrc"
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced force-refresh "$rrc"
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done
-
-# Update our list of the coins
-export coins=$(taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced dump-coins)
-
-# Find resulting refreshed coin
-export freshc=$(echo "$coins" | jq -r --arg rrc "$rrc" \
- '[.coins[] | select((.refresh_parent_coin_pub == $rrc) and .denom_value == "TESTKUDOS:0.1")][0] | .coin_pub'
-)
-
-# Find the denom of freshc
-export fresh_denom=$(echo "$coins" | jq -r --arg rrc "$rrc" \
- '[.coins[] | select((.refresh_parent_coin_pub == $rrc) and .denom_value == "TESTKUDOS:0.1")][0] | .denom_pub_hash'
-)
-
-echo "Coin ${freshc} of denomination ${fresh_denom} is the result of the refresh"
-
-# Find all other coins, which will be suspended
-export susp=$(echo "$coins" | jq --arg freshc "$freshc" '[.coins[] | select(.coin_pub != $freshc) | .coin_pub]')
-
-
-# Do the revocation of freshc
-echo "Revoking ${fresh_denom} (to affect coin ${freshc})"
-taler-exchange-keyup -c $CONF -o e2a3.dat -r $fresh_denom
-taler-auditor-sign -c $CONF -u $AUDITOR_URL -r e2a3.dat -o a2e3.dat -m $MASTER_PUB
-rm e2a3.dat
-mv a2e3.dat $ABD
-
-# Restart the exchange...
-kill -SIGUSR1 $EXCHANGE_PID
-sleep 1 # give exchange time to re-scan data
-
-
-# Now we suspend the other coins, so later we will pay with the recouped coin
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced suspend-coins "$susp"
-
-# Update exchange /keys so recoup gets scheduled
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB exchanges update \
- -f $EXCHANGE_URL
-
-# Block until scheduled operations are done
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done
-
-echo "Restarting merchant (so new keys are known)"
-kill -TERM $MERCHANT_PID
-taler-merchant-httpd -c $CONF -L INFO 2> taler-merchant-httpd.log &
-MERCHANT_PID=$!
-# Wait for merchant to be again available
-for n in `seq 1 50`
-do
- echo -n "."
- sleep 0.1
- OK=0
- # merchant
- wget http://localhost:9966/ -o /dev/null -O /dev/null >/dev/null || continue
- OK=1
- break
-done
-
-# Now we buy something, only the coins resulting from recoup+refresh will be
-# used, as other ones are suspended
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB testing test-pay \
- -m $MERCHANT_URL -k sandbox \
- -a "TESTKUDOS:0.02" -s "bar"
-taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done
-
-echo "SUCCESS: Bought something with refresh-recouped coin"
-
-rm -r "$TMP_DIR"
-
-exit 0
diff --git a/integrationtests/test-refund.sh b/integrationtests/test-refund.sh
deleted file mode 100755
index 7b8fbdef7..000000000
--- a/integrationtests/test-refund.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet can handle refund URIs and actually process the refund
-
-source "common.sh"
-normal_start_and_wait "refund"
-
-echo "Withdraw TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" >>"$LOG" 2>>"$LOG"
-BALANCE_1=$(get_balance)
-echo "Balance after withdrawal: $BALANCE_1"
-REFUND_URI=$(taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing gen-refund-uri \
- -m "$MERCHANT_URL" -k sandbox \
- -s "first refund" -a "TESTKUDOS:8" -r "TESTKUDOS:2" 2>>"$LOG" | grep -E -m 1 -o "taler://refund.*insecure=1")
-BALANCE_2=$(get_balance)
-echo "Balance after payment: $BALANCE_2"
-assert_less_than "$BALANCE_2" "$BALANCE_1"
-taler-wallet-cli --wallet-db="$WALLET_DB" balance 2>>"$LOG"
-echo "Handling refund: $REFUND_URI"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri "$REFUND_URI" 2>"$LOG"
-taler-wallet-cli --wallet-db="$WALLET_DB" run-until-done 2>>"$LOG" >>"$LOG"
-BALANCE_3=$(get_balance)
-echo "Balance after first refund: $BALANCE_3"
-assert_greater_than "$BALANCE_3" "$BALANCE_2"
-# TODO how to test second refund for same purchase?
-
-exit_success
diff --git a/integrationtests/test-retries.sh b/integrationtests/test-retries.sh
deleted file mode 100755
index 3d953eab0..000000000
--- a/integrationtests/test-retries.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet retries operations when services are not reachable
-
-source "common.sh"
-normal_start_and_wait "retries"
-
-# TODO try withdrawal when bank is down
-
-echo "Withdraw TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" 2>>"$LOG" >>"$LOG"
-BALANCE_1=$(get_balance)
-echo "Balance after withdrawal: $BALANCE_1"
-echo "Getting pay taler:// Uri"
-PAY_URI=$(taler-wallet-cli testing gen-pay-uri -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:1" -s "foo" | grep -E -o 'taler://.*')
-echo "Trying to pay with exchange down, will fail"
-kill "$EXCHANGE_PID" && sleep 1
-ps -p "$EXCHANGE_PID" >"$LOG" && exit_error "exchange still alive"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" 2>>"$LOG" >>"$LOG" && exit_error "could pay with exchange down"
-echo "Re-launching exchange"
-taler-exchange-httpd -c "$CONF" 2>taler-exchange-httpd.log &
-EXCHANGE_PID=$!
-echo -n "Wait for exchange to start"
-wait_for_service "$EXCHANGE_URL"
-echo "Retrying operations with exchange up"
-taler-wallet-cli --wallet-db="$WALLET_DB" run-until-done 2>>"$LOG" >>"$LOG"
-BALANCE_2=$(get_balance)
-echo "Balance after re-tried payment: $BALANCE_2"
-assert_less_than "$BALANCE_2" "$BALANCE_1"
-
-echo "Getting pay taler:// Uri"
-PAY_URI=$(taler-wallet-cli testing gen-pay-uri -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:1" -s "foo" | grep -E -o 'taler://.*')
-echo "Trying to pay with merchant down, will fail"
-kill "$MERCHANT_PID" && sleep 1
-ps -p "$MERCHANT_PID" >"$LOG" && exit_error "merchant still alive"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" 2>>"$LOG" >>"$LOG" && exit_error "could pay with merchant down"
-echo "Re-launching merchant"
-taler-merchant-httpd -c "$CONF" -L INFO 2>taler-merchant-httpd.log &
-MERCHANT_PID=$!
-echo -n "Wait for merchant to start"
-wait_for_service "$MERCHANT_URL"
-echo "Retrying payment with merchant up"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri --yes "$PAY_URI" 2>>"$LOG" >>"$LOG"
-BALANCE_3=$(get_balance)
-echo "Balance after re-tried payment: $BALANCE_3"
-assert_less_than "$BALANCE_3" "$BALANCE_2"
-
-exit_success
diff --git a/integrationtests/test-tip.sh b/integrationtests/test-tip.sh
deleted file mode 100755
index 8bdcc6ef3..000000000
--- a/integrationtests/test-tip.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet can handle tip URIs and actually process the tips
-
-source "common.sh"
-normal_start_and_wait "tip"
-
-# TODO fund exchange tipping reserve: 404 tipping reserve unknown at exchange
-TIP_URI=$(taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing gen-tip-uri \
- -m "$MERCHANT_URL" -k sandbox -a "TESTKUDOS:5" 2>>"$LOG" | grep -E -m 1 -o "taler://tip.*insecure=1")
-echo -n "Balance after tip: "
-taler-wallet-cli --wallet-db="$WALLET_DB" balance 2>>"$LOG"
-echo "Handling tip: $TIP_URI"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle handle-uri "$TIP_URI" 2>"$LOG"
-taler-wallet-cli --wallet-db="$WALLET_DB" run-until-done 2>>"$LOG" >>"$LOG"
-echo -n "Balance after first tip: "
-taler-wallet-cli --wallet-db="$WALLET_DB" balance 2>>"$LOG"
-
-exit_success
diff --git a/integrationtests/test-withdrawal.sh b/integrationtests/test-withdrawal.sh
deleted file mode 100755
index 1450f6258..000000000
--- a/integrationtests/test-withdrawal.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# Script to check that the wallet does a withdrawal correctly
-
-source "common.sh"
-normal_start_and_wait "withdrawal"
-
-echo "Withdraw 5 TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:5" >>"$LOG" 2>>"$LOG"
-BALANCE_1=$(get_balance)
-assert_equal "$BALANCE_1" "TESTKUDOS:4.84"
-echo "Balance after withdrawal: $BALANCE_1"
-
-echo "Withdraw 10 TESTKUDOS"
-taler-wallet-cli --wallet-db="$WALLET_DB" --no-throttle testing withdraw -e "$EXCHANGE_URL" -b "$BANK_URL" -a "TESTKUDOS:10" >>"$LOG" 2>>"$LOG"
-BALANCE_2=$(get_balance)
-assert_equal "$BALANCE_2" "TESTKUDOS:14.66"
-echo "Balance after withdrawal: $BALANCE_2"
-
-exit_success
diff --git a/tests/.gitignore b/tests/.gitignore
deleted file mode 100644
index ed8ebf583..000000000
--- a/tests/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-__pycache__ \ No newline at end of file
diff --git a/tests/__init__.py b/tests/__init__.py
deleted file mode 100644
index 333953b9d..000000000
--- a/tests/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import json
-
-from taler.util.amount import Amount
-
-
-def check_single_balance(
- balances,
- available,
- pending_in=Amount.parse("TESTKUDOS:0"),
- pending_out=Amount.parse("TESTKUDOS:0"),
-):
- assert len(balances) == 1
- assert Amount.parse(balances[0]["available"]) == available
- assert Amount.parse(balances[0]["pendingIncoming"]) == pending_in
- assert Amount.parse(balances[0]["pendingOutgoing"]) == pending_out
-
-
-def json_to_amount(d):
- return Amount(d["currency"], d["value"], d["fraction"])
-
-
-def print_json(obj):
- print(json.dumps(obj, indent=2))
diff --git a/tests/components/__init__.py b/tests/components/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/components/__init__.py
+++ /dev/null
diff --git a/tests/components/bank.py b/tests/components/bank.py
deleted file mode 100644
index f6551b491..000000000
--- a/tests/components/bank.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import os
-import secrets
-from dataclasses import dataclass
-from subprocess import run
-
-import psutil
-import requests
-
-from .taler_service import TalerService
-
-
-@dataclass
-class BankUser:
- username: str
- password: str
-
-
-@dataclass
-class WithdrawUriResponse:
- taler_withdraw_uri: str
- withdrawal_id: str
-
-
-class Bank(TalerService):
-
- def __init__(self, config, watcher_getter, request):
- super().__init__(config, watcher_getter, request)
-
- # get localhost port and store bank URL
- r = run(["taler-config", "-c", config.conf, "-s", "BANK", "-o", "HTTP_PORT"],
- check=True, text=True, capture_output=True)
- self.url = "http://localhost:%s/" % r.stdout.rstrip()
-
- def start(self):
- db = "postgres:///%s" % self.config.db
- log_path = os.path.join(self.config.tmpdir, "bank.log")
- log_file = open(log_path, 'w')
- self.watcher_getter(
- name='taler-bank-manage-testing',
- arguments=[self.config.conf, db, 'serve-http'],
- checker=self.test_process,
- kwargs=dict(stderr=log_file, stdout=log_file),
- request=self.request, # Needed for the correct execution order of finalizers
- )
-
- def close_log():
- log_file.close()
-
- self.request.addfinalizer(close_log)
-
- def register_random_user(self):
- username = f"testuser-{secrets.token_hex(10)}"
- password = f"testpw-{secrets.token_hex(10)}"
- requests.post(
- f"{self.url}testing/register",
- json=dict(username=username, password=password)
- )
- return BankUser(username, password)
-
- def generate_withdraw_uri(self, bankuser, amount):
- auth = (bankuser.username, bankuser.password)
- resp = requests.post(
- f"{self.url}accounts/{bankuser.username}/withdrawals",
- json=dict(amount=amount),
- auth=auth
- )
- rj = resp.json()
- return WithdrawUriResponse(
- taler_withdraw_uri=rj["taler_withdraw_uri"],
- withdrawal_id=rj["withdrawal_id"],
- )
-
- def confirm_withdrawal(self, bank_user, withdrawal_id):
- auth = (bank_user.username, bank_user.password)
- requests.post(
- f"{self.url}accounts/{bank_user.username}/withdrawals/{withdrawal_id}/confirm",
- auth=auth
- )
-
- # Alternative way to check if the bank came up.
- # Testing the URL has the issue that on the CI, django keeps closing the connection.
- @staticmethod
- def test_process():
- for p in psutil.process_iter(['name', 'cmdline']):
- if p.info["name"] == "uwsgi" and p.info["cmdline"][-1] == "talerbank.wsgi":
- return True
- return False
diff --git a/tests/components/config.py b/tests/components/config.py
deleted file mode 100644
index c683a11fa..000000000
--- a/tests/components/config.py
+++ /dev/null
@@ -1,62 +0,0 @@
-import logging
-import os
-from shutil import copyfile
-from subprocess import run
-
-
-class Config:
-
- def __init__(self, request, tmpdir, worker_id):
- self.tmpdir = tmpdir.strpath
- self.data_home = os.path.join(self.tmpdir, 'data')
-
- # workaround for https://github.com/pytest-dev/pytest-services/issues/37
- logger = logging.getLogger(
- '[{worker_id}] {name}'.format(name="pytest_services.log", worker_id=worker_id))
- logger.handlers.clear()
-
- # copy config file from template
- self.conf = tmpdir.join("test.conf").strpath
- template = os.path.join(os.path.dirname(__file__), 'template.ini')
- copyfile(template, self.conf)
-
- # set TALER_HOME base dir
- config_cmd = ["taler-config", "-c", self.conf]
- run(config_cmd + ["-s", "PATHS", "-o", "TALER_HOME", "-V", self.tmpdir], check=True)
-
- # get path of exchange private key file and create key pair
- config_cmd = ["taler-config", "-c", self.conf]
- r = run(config_cmd + ["-f", "-s", "EXCHANGE", "-o", "MASTER_PRIV_FILE"],
- capture_output=True, check=True, text=True)
- master_priv_file = r.stdout.rstrip()
- master_priv_dir = os.path.dirname(master_priv_file)
- os.makedirs(master_priv_dir)
- run(["gnunet-ecc", "-g1", master_priv_file], check=True, capture_output=True)
- r = run(["gnunet-ecc", "-p", master_priv_file], check=True, capture_output=True, text=True)
- self.master_pub = r.stdout.rstrip()
-
- # write exchange public key into config
- run(config_cmd + ["-s", "exchange",
- "-o", "MASTER_PUBLIC_KEY",
- "-V", self.master_pub], check=True)
- run(config_cmd + ["-s", "merchant-exchange-default",
- "-o", "MASTER_KEY",
- "-V", self.master_pub], check=True)
-
- # write DB name into config
- self.db = "test-db"
- db_uri = "postgres:///" + self.db
- run(config_cmd + ["-s", "exchangedb-postgres", "-o", "CONFIG", "-V", db_uri], check=True)
- run(config_cmd + ["-s", "auditordb-postgres", "-o", "CONFIG", "-V", db_uri], check=True)
- run(config_cmd + ["-s", "merchantdb-postgres", "-o", "CONFIG", "-V", db_uri], check=True)
- run(config_cmd + ["-s", "bank", "-o", "database", "-V", db_uri], check=True)
-
- # create new DB
- run(["dropdb", self.db], capture_output=True)
- run(["createdb", self.db], check=True)
-
- # drop DB when test ends
- def finalize():
- run(["dropdb", self.db], capture_output=True)
-
- request.addfinalizer(finalize)
diff --git a/tests/components/exchange.py b/tests/components/exchange.py
deleted file mode 100644
index 9e804a65e..000000000
--- a/tests/components/exchange.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import os
-from subprocess import run
-
-from .taler_service import TalerService
-
-
-class Exchange(TalerService):
-
- def __init__(self, config, watcher_getter, request):
- super().__init__(config, watcher_getter, request)
-
- # get own URL from config
- r = run(["taler-config", "-c", config.conf, "-s", "EXCHANGE", "-o", "BASE_URL"],
- check=True, text=True, capture_output=True)
- self.url = r.stdout.rstrip()
-
- # get and create directory for terms of service
- r = run(["taler-config", "-c", config.conf, "-s", "EXCHANGE", "-o", "TERMS_DIR"],
- check=True, text=True, capture_output=True)
- self.terms_dir = r.stdout.rstrip().replace("${TALER_DATA_HOME}", config.data_home)
- terms_dir_en = os.path.join(self.terms_dir, 'en')
- os.makedirs(terms_dir_en)
-
- # get eTag and create ToS file for it
- r = run(["taler-config", "-c", config.conf, "-s", "EXCHANGE", "-o", "TERMS_ETAG"],
- check=True, text=True, capture_output=True)
- self.terms_etag = r.stdout.rstrip()
- self.tos = "ToS Foo Bar\n"
- with open(os.path.join(terms_dir_en, "%s.txt" % self.terms_etag), 'w') as f:
- f.write(self.tos)
-
- def start(self):
- run(["taler-exchange-dbinit", "-c", self.config.conf], check=True)
- run(["taler-exchange-wire", "-c", self.config.conf], check=True)
- run(["taler-exchange-keyup", "-c", self.config.conf,
- "-L", "INFO",
- "-o", os.path.join(self.config.tmpdir, "e2a.dat")
- ], check=True, capture_output=True)
- log_path = os.path.join(self.config.tmpdir, "exchange.log")
- self.watcher_getter(
- name='taler-exchange-httpd',
- arguments=['-c', self.config.conf, '-l', log_path],
- checker=self.test_url,
- request=self.request, # Needed for the correct execution order of finalizers
- )
- # the wirewatch is needed for interaction with the bank
- log_wirewatch_path = os.path.join(self.config.tmpdir, "exchange-wirewatch.log")
- self.watcher_getter(
- name='taler-exchange-wirewatch',
- arguments=['-c', self.config.conf, '-l', log_wirewatch_path],
- checker=lambda: True, # no need to wait for this to come up
- request=self.request, # Needed for the correct execution order of finalizers
- )
diff --git a/tests/components/merchant.py b/tests/components/merchant.py
deleted file mode 100644
index 373b8ed86..000000000
--- a/tests/components/merchant.py
+++ /dev/null
@@ -1,66 +0,0 @@
-import os
-from subprocess import run
-
-import requests
-
-from .taler_service import TalerService
-
-
-class Merchant(TalerService):
-
- def __init__(self, config, watcher_getter, request):
- super().__init__(config, watcher_getter, request)
-
- # get localhost port and store merchant URL
- r = run(["taler-config", "-c", config.conf, "-s", "MERCHANT", "-o", "PORT"],
- check=True, text=True, capture_output=True)
- self.url = "http://localhost:%s/" % r.stdout.rstrip()
-
- def start(self):
- log_path = os.path.join(self.config.tmpdir, "merchant.log")
- self.watcher_getter(
- name='taler-merchant-httpd',
- arguments=['-c', self.config.conf, '-L', 'INFO', '-l', log_path],
- checker=self.test_url,
- request=self.request, # Needed for the correct execution order of finalizers
- )
-
- def create_instance(self, instance="default", name="GNU Taler Merchant"):
- body = {
- "id": instance,
- "name": name,
- "payto_uris": ["payto://x-taler-bank/test_merchant"],
- "address": {},
- "jurisdiction": {},
- "default_max_wire_fee": "TESTKUDOS:1",
- "default_wire_fee_amortization": 3,
- "default_max_deposit_fee": "TESTKUDOS:1",
- "default_wire_transfer_delay": {"d_ms": "forever"},
- "default_pay_delay": {"d_ms": "forever"}
- }
- r = requests.post(self.url + "private/instances", json=body)
- r.raise_for_status()
-
- def create_order(self, amount, instance="default", summary="Test Order",
- fulfillment_url="taler://fulfillment-success/Enjoy+your+ice+cream!"):
- body = {
- "order": {
- "amount": amount,
- "summary": summary,
- "fulfillment_url": fulfillment_url
- }
- }
- r = requests.post("{}instances/{}/private/orders".format(self.url, instance), json=body)
- r.raise_for_status()
- return r.json()
-
- def check_payment(self, order_id, instance="default"):
- r = requests.get("{}instances/{}/private/orders/{}".format(self.url, instance, order_id))
- r.raise_for_status()
- return r.json()
-
- def gen_pay_uri(self, amount, instance="default", summary="Test Order",
- fulfillment_url="taler://fulfillment-success/Enjoy+your+ice+cream!"):
- order = self.create_order(amount, instance, summary, fulfillment_url)
- response = self.check_payment(order["order_id"], instance)
- return response["taler_pay_uri"]
diff --git a/tests/components/taler_service.py b/tests/components/taler_service.py
deleted file mode 100644
index 9fce9395c..000000000
--- a/tests/components/taler_service.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import requests
-from requests.exceptions import ConnectionError
-
-
-class TalerService:
-
- def __init__(self, config, watcher_getter, request):
- self.config = config
- self.watcher_getter = watcher_getter
- self.request = request
-
- def test_url(self):
- try:
- requests.get(self.url, timeout=3)
- except ConnectionError as e:
- return False
- else:
- return True
diff --git a/tests/components/template.ini b/tests/components/template.ini
deleted file mode 100644
index 32089636d..000000000
--- a/tests/components/template.ini
+++ /dev/null
@@ -1,228 +0,0 @@
-[exchange]
-KEYDIR = ${TALER_DATA_HOME}/exchange/live-keys/
-REVOCATION_DIR = ${TALER_DATA_HOME}/exchange/revocations/
-MAX_KEYS_CACHING = forever
-DB = postgres
-MASTER_PRIV_FILE = ${TALER_DATA_HOME}/exchange/offline-keys/master.priv
-SERVE = tcp
-UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http
-UNIXPATH_MODE = 660
-PORT = 8081
-BASE_URL = http://localhost:8081/
-SIGNKEY_DURATION = 4 weeks
-LEGAL_DURATION = 2 years
-LOOKAHEAD_SIGN = 32 weeks 1 day
-LOOKAHEAD_PROVIDE = 4 weeks 1 day
-TERMS_ETAG = test_etag
-TERMS_DIR = ${TALER_DATA_HOME}/exchange/terms
-
-[merchant]
-SERVE = tcp
-PORT = 9966
-UNIXPATH = ${TALER_RUNTIME_DIR}/merchant.http
-UNIXPATH_MODE = 660
-DEFAULT_WIRE_FEE_AMORTIZATION = 1
-DB = postgres
-WIREFORMAT = default
-# Set very low, so we can be sure that the database generated
-# will contain wire transfers "ready" for the aggregator.
-WIRE_TRANSFER_DELAY = 1 minute
-DEFAULT_PAY_DEADLINE = 1 day
-DEFAULT_MAX_DEPOSIT_FEE = TESTKUDOS:0.1
-KEYFILE = ${TALER_DATA_HOME}/merchant/merchant.priv
-DEFAULT_MAX_WIRE_FEE = TESTKUDOS:0.10
-
-# Ensure that merchant reports EVERY deposit confirmation to auditor
-FORCE_AUDIT = YES
-
-[instance-default]
-KEYFILE = ${TALER_DATA_HOME}/merchant/default.priv
-NAME = Merchant Inc.
-TIP_EXCHANGE = http://localhost:8081/
-# TODO necessary to specify a different key here?
-TIP_RESERVE_PRIV_FILENAME = ${TALER_DATA_HOME}/merchant/default.priv
-
-[auditor]
-DB = postgres
-AUDITOR_PRIV_FILE = ${TALER_DATA_HOME}/auditor/offline-keys/auditor.priv
-SERVE = tcp
-UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http
-UNIXPATH_MODE = 660
-PORT = 8083
-AUDITOR_URL = http://localhost:8083/
-TINY_AMOUNT = TESTKUDOS:0.01
-
-[PATHS]
-TALER_DATA_HOME = $TALER_HOME/data/
-TALER_CONFIG_HOME = $TALER_HOME/config/
-TALER_CACHE_HOME = $TALER_HOME/cache/
-TALER_RUNTIME_DIR = ${TMPDIR:-${TMP:-/tmp}}/taler-system-runtime/
-
-[bank]
-DATABASE = postgres:///taler-auditor-basedb
-MAX_DEBT = TESTKUDOS:50.0
-MAX_DEBT_BANK = TESTKUDOS:100000.0
-HTTP_PORT = 8082
-SUGGESTED_EXCHANGE = http://localhost:8081/
-SUGGESTED_EXCHANGE_PAYTO = payto://x-taler-bank/localhost/2
-ALLOW_REGISTRATIONS = YES
-
-[exchangedb]
-AUDITOR_BASE_DIR = ${TALER_DATA_HOME}/auditors/
-WIREFEE_BASE_DIR = ${TALER_DATA_HOME}/exchange/wirefees/
-IDLE_RESERVE_EXPIRATION_TIME = 4 weeks
-LEGAL_RESERVE_EXPIRATION_TIME = 7 years
-
-[exchange_keys]
-signkey_duration = 4 weeks
-legal_duration = 2 years
-lookahead_sign = 32 weeks 1 day
-lookahead_provide = 4 weeks 1 day
-
-[taler]
-CURRENCY = TESTKUDOS
-CURRENCY_ROUND_UNIT = TESTKUDOS:0.01
-
-[exchange-account-1]
-WIRE_RESPONSE = ${TALER_DATA_HOME}/exchange/account-1.json
-PAYTO_URI = payto://x-taler-bank/localhost/Exchange
-enable_debit = yes
-enable_credit = yes
-WIRE_GATEWAY_URL = "http://localhost:8082/taler-wire-gateway/Exchange/"
-WIRE_GATEWAY_AUTH_METHOD = basic
-USERNAME = Exchange
-PASSWORD = x
-
-[merchant-account-merchant]
-PAYTO_URI = payto://x-taler-bank/localhost/42
-WIRE_RESPONSE = ${TALER_CONFIG_HOME}/merchant/account-3.json
-HONOR_default = YES
-ACTIVE_default = YES
-
-[fees-x-taler-bank]
-wire-fee-2020 = TESTKUDOS:0.01
-closing-fee-2020 = TESTKUDOS:0.01
-wire-fee-2021 = TESTKUDOS:0.01
-closing-fee-2021 = TESTKUDOS:0.01
-wire-fee-2022 = TESTKUDOS:0.01
-closing-fee-2022 = TESTKUDOS:0.01
-wire-fee-2023 = TESTKUDOS:0.01
-closing-fee-2023 = TESTKUDOS:0.01
-wire-fee-2024 = TESTKUDOS:0.01
-closing-fee-2024 = TESTKUDOS:0.01
-wire-fee-2025 = TESTKUDOS:0.01
-closing-fee-2025 = TESTKUDOS:0.01
-wire-fee-2026 = TESTKUDOS:0.01
-closing-fee-2026 = TESTKUDOS:0.01
-wire-fee-2027 = TESTKUDOS:0.01
-closing-fee-2027 = TESTKUDOS:0.01
-wire-fee-2028 = TESTKUDOS:0.01
-closing-fee-2028 = TESTKUDOS:0.01
-
-[merchant-instance-wireformat-default]
-TEST_RESPONSE_FILE = ${TALER_CONFIG_HOME}/merchant/wire/tutorial.json
-
-[merchant-exchange-default]
-EXCHANGE_BASE_URL = http://localhost:8081/
-CURRENCY = TESTKUDOS
-
-[payments-generator]
-currency = TESTKUDOS
-instance = default
-bank = http://localhost:8082/
-merchant = http://localhost:9966/
-exchange_admin = http://localhost:18080/
-exchange-admin = http://localhost:18080/
-exchange = http://localhost:8081/
-
-[coin_kudos_ct_1]
-value = TESTKUDOS:0.01
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.01
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_ct_10]
-value = TESTKUDOS:0.10
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_1]
-value = TESTKUDOS:1
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.02
-fee_deposit = TESTKUDOS:0.02
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_2]
-value = TESTKUDOS:2
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.03
-fee_deposit = TESTKUDOS:0.03
-fee_refresh = TESTKUDOS:0.04
-fee_refund = TESTKUDOS:0.02
-rsa_keysize = 1024
-
-[coin_kudos_4]
-value = TESTKUDOS:4
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.03
-fee_deposit = TESTKUDOS:0.03
-fee_refresh = TESTKUDOS:0.04
-fee_refund = TESTKUDOS:0.02
-rsa_keysize = 1024
-
-[coin_kudos_5]
-value = TESTKUDOS:5
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[coin_kudos_8]
-value = TESTKUDOS:8
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.05
-fee_deposit = TESTKUDOS:0.02
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.04
-rsa_keysize = 1024
-
-[coin_kudos_10]
-value = TESTKUDOS:10
-duration_withdraw = 7 days
-duration_spend = 2 years
-duration_legal = 3 years
-fee_withdraw = TESTKUDOS:0.01
-fee_deposit = TESTKUDOS:0.01
-fee_refresh = TESTKUDOS:0.03
-fee_refund = TESTKUDOS:0.01
-rsa_keysize = 1024
-
-[benchmark]
-BANK_DETAILS = bank_details.json
-MERCHANT_DETAILS = merchant_details.json
diff --git a/tests/components/wallet.py b/tests/components/wallet.py
deleted file mode 100644
index bfdbd9ba1..000000000
--- a/tests/components/wallet.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import json
-import os
-from subprocess import run
-
-
-class Wallet:
-
- def __init__(self, config):
- self.db = os.path.join(config.tmpdir, "wallet-db.json")
- self.arg_db = "--wallet-db=%s" % self.db
- self.log_path = os.path.join(config.tmpdir, "wallet.log")
-
- def cmd(self, command, request=None):
- if request is None:
- request = dict()
- request = json.dumps(request)
- r = run(["taler-wallet-cli", self.arg_db, "api", command, request],
- timeout=10, text=True, capture_output=True)
- self.write_to_log(r.stderr)
- if r.returncode != 0:
- print(r)
- assert r.returncode == 0
- json_r = json.loads(r.stdout)
- if json_r["type"] != "response" or "result" not in json_r:
- print(json_r)
- assert json_r["type"] == "response"
- return json_r["result"]
-
- def testing_withdraw(self, amount, exchange_url, bank_url):
- r = run(["taler-wallet-cli", self.arg_db, "--no-throttle", "testing", "withdraw",
- "-a", amount,
- "-e", exchange_url,
- "-b", bank_url
- ], timeout=10, check=True, text=True, capture_output=True)
- self.write_to_log(r.stderr)
-
- def run_pending(self):
- r = run(["taler-wallet-cli", self.arg_db, "run-pending"],
- timeout=10, check=True, text=True, capture_output=True)
- self.write_to_log(r.stderr)
- return r.stdout.rstrip()
-
- def run_until_done(self):
- r = run(["taler-wallet-cli", self.arg_db, "run-until-done"],
- timeout=10, check=True, text=True, capture_output=True)
- self.write_to_log(r.stderr)
- return r.stdout.rstrip()
-
- def write_to_log(self, data):
- with open(self.log_path, "a") as f:
- f.write(data)
diff --git a/tests/conftest.py b/tests/conftest.py
deleted file mode 100644
index 6bc801bac..000000000
--- a/tests/conftest.py
+++ /dev/null
@@ -1,38 +0,0 @@
-import pytest
-
-from tests.components.bank import Bank
-from tests.components.config import Config
-from tests.components.exchange import Exchange
-from tests.components.merchant import Merchant
-from tests.components.wallet import Wallet
-
-
-@pytest.fixture
-def config(watcher_getter, request, tmpdir, worker_id):
- return Config(request, tmpdir, worker_id)
-
-
-@pytest.fixture
-def exchange(watcher_getter, request, config):
- exchange = Exchange(config, watcher_getter, request)
- exchange.start()
- return exchange
-
-
-@pytest.fixture
-def bank(watcher_getter, request, config):
- bank = Bank(config, watcher_getter, request)
- bank.start()
- return bank
-
-
-@pytest.fixture
-def merchant(watcher_getter, request, config):
- merchant = Merchant(config, watcher_getter, request)
- merchant.start()
- return merchant
-
-
-@pytest.fixture
-def wallet(watcher_getter, config):
- return Wallet(config)
diff --git a/tests/requirements.txt b/tests/requirements.txt
deleted file mode 100644
index 6f2484b78..000000000
--- a/tests/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-pytest==5.4.*
-pytest-services==2.1.*
-taler-util==0.6.*
-psutil==5.7.* \ No newline at end of file
diff --git a/tests/test_exchange_management.py b/tests/test_exchange_management.py
deleted file mode 100644
index 5e0462944..000000000
--- a/tests/test_exchange_management.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python3
-
-
-def test_exchanges(exchange, wallet):
- # list of exchanges is initially empty
- result = wallet.cmd("listExchanges")
- assert not result["exchanges"]
-
- # adding an exchange works
- result = wallet.cmd("addExchange", {"exchangeBaseUrl": exchange.url})
- assert not result # result is empty
-
- # list includes added exchange
- result = wallet.cmd("listExchanges")
- e = result["exchanges"][0]
- assert e["exchangeBaseUrl"] == exchange.url
- assert e["currency"] == "TESTKUDOS"
- assert len(e["paytoUris"]) >= 1
diff --git a/tests/test_payments.py b/tests/test_payments.py
deleted file mode 100644
index 20cec9295..000000000
--- a/tests/test_payments.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python3
-from tests import print_json
-
-
-def test_payments(exchange, bank, merchant, wallet):
- merchant.create_instance()
- pay_uri = merchant.gen_pay_uri("TESTKUDOS:2")
-
- # TODO fix
- result = wallet.cmd("preparePay", {"talerPayUri": pay_uri})
- print_json(result)
diff --git a/tests/test_withdrawal.py b/tests/test_withdrawal.py
deleted file mode 100644
index 6392891f1..000000000
--- a/tests/test_withdrawal.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python3
-
-from taler.util.amount import Amount
-
-from tests import check_single_balance
-
-
-def test_withdrawal(exchange, bank, wallet):
- bank_user = bank.register_random_user()
-
- # assert that we start with no transactions
- result = wallet.cmd("getTransactions")
- assert not result["transactions"]
-
- # test withdrawal
- amount_raw = Amount.parse("TESTKUDOS:5")
- wallet.testing_withdraw(amount_raw.stringify(), exchange.url, bank.url)
-
- # check that balance is correct
- result = wallet.cmd("getBalances")
- amount_effective = Amount("TESTKUDOS", 4, 84000000)
- check_single_balance(result["balances"], amount_effective)
-
- # assert that withdrawal shows up properly in transactions
- result = wallet.cmd("getTransactions")
- assert len(result["transactions"]) == 1
- transaction = result["transactions"][0]
- assert transaction["type"] == "withdrawal"
- assert Amount.parse(transaction["amountEffective"]) == amount_effective
- assert Amount.parse(transaction["amountRaw"]) == amount_raw
- assert transaction["exchangeBaseUrl"] == exchange.url
- assert not transaction["pending"]
- withdrawal_details = transaction["withdrawalDetails"]
- assert withdrawal_details["type"] == "manual-transfer"
- payto_list = ["payto://x-taler-bank/localhost/Exchange"]
- assert withdrawal_details["exchangePaytoUris"] == payto_list
-
- # get a withdrawal URI
- bank_uri_resp = bank.generate_withdraw_uri(bank_user, "TESTKUDOS:5")
- uri = bank_uri_resp.taler_withdraw_uri
- assert uri.startswith("taler+http://withdraw")
-
- # get withdrawal details from URI
- result = wallet.cmd("getWithdrawalDetailsForUri", {"talerWithdrawUri": uri})
- assert Amount.parse(result["amount"]) == amount_raw
- assert result["defaultExchangeBaseUrl"] == exchange.url
- assert len(result["possibleExchanges"]) == 1
- assert result["possibleExchanges"][0]["exchangeBaseUrl"] == exchange.url
- assert result["possibleExchanges"][0]["currency"] == "TESTKUDOS"
- assert result["possibleExchanges"][0]["paytoUris"] == payto_list
-
- # check withdrawal details for amount
- request = {"exchangeBaseUrl": exchange.url, "amount": amount_raw.stringify()}
- result = wallet.cmd("getWithdrawalDetailsForAmount", request)
- assert Amount.parse(result["amountRaw"]) == amount_raw
- assert Amount.parse(result["amountEffective"]) == amount_effective
- assert result["paytoUris"] == payto_list
- assert not result["tosAccepted"]
-
- # get ToS
- result = wallet.cmd("getExchangeTos", {"exchangeBaseUrl": exchange.url})
- assert result["currentEtag"] == exchange.terms_etag
- assert result["tos"] == exchange.tos
-
- # accept ToS
- request = {"exchangeBaseUrl": exchange.url, "etag": exchange.terms_etag}
- wallet.cmd("setExchangeTosAccepted", request)
-
- # check that ToS are now shown as accepted
- request = {"exchangeBaseUrl": exchange.url, "amount": amount_raw.stringify()}
- result = wallet.cmd("getWithdrawalDetailsForAmount", request)
- assert result["tosAccepted"]
-
- # accept withdrawal
- request = {"exchangeBaseUrl": exchange.url, "talerWithdrawUri": uri}
- result = wallet.cmd("acceptBankIntegratedWithdrawal", request)
- assert result["confirmTransferUrl"].startswith(bank.url + "confirm-withdrawal/")
- confirm_url = result["confirmTransferUrl"]
-
- # Let the wallet do its work. At this point, the bank-integrated
- # withdrawal won't have succeeded yet, as it's not confirmed at the bank side.
- wallet.run_pending()
-
- # check that balance is correct
- result = wallet.cmd("getBalances")
- check_single_balance(result["balances"], amount_effective, amount_effective)
-
- # assert that 2nd withdrawal shows up properly in transactions
- result = wallet.cmd("getTransactions")
- assert len(result["transactions"]) == 2
- transaction = result["transactions"][0]
- assert transaction["type"] == "withdrawal"
- assert Amount.parse(transaction["amountEffective"]) == amount_effective
- assert Amount.parse(transaction["amountRaw"]) == amount_raw
- assert transaction["exchangeBaseUrl"] == exchange.url
- assert transaction["pending"]
- withdrawal_details = transaction["withdrawalDetails"]
- assert withdrawal_details["type"] == "taler-bank-integration-api"
- assert not withdrawal_details["confirmed"]
- assert withdrawal_details["bankConfirmationUrl"] == confirm_url
-
- # new withdrawal is newer than old one
- timestamp0 = result["transactions"][0]["timestamp"]["t_ms"]
- timestamp1 = result["transactions"][1]["timestamp"]["t_ms"]
- assert timestamp0 > timestamp1
-
- # now we actually confirm the withdrawal
- bank.confirm_withdrawal(bank_user, bank_uri_resp.withdrawal_id)
- # It might take some time until the exchange knows about the reserve,
- # so we'll try until it works.
- wallet.run_until_done()
-
- # check that balance is correct
- result = wallet.cmd("getBalances")
- check_single_balance(
- result["balances"], Amount.parse("TESTKUDOS:9.68"), Amount.parse("TESTKUDOS:0"),
- )
-
- # check that transaction is no longer pending, but confirmed
- result = wallet.cmd("getTransactions")
- assert len(result["transactions"]) == 2
- transaction = result["transactions"][1] # TODO this transaction should be at the top now
- assert transaction["type"] == "withdrawal"
- assert not transaction["pending"]
- assert transaction["withdrawalDetails"]["confirmed"]
-
- # one more manual withdrawal
- request = {"exchangeBaseUrl": exchange.url, "amount": amount_raw.stringify()}
- result = wallet.cmd("acceptManualWithdrawal", request)
- assert len(result["exchangePaytoUris"]) == 1
- result["exchangePaytoUris"][0].startswith(payto_list[0])
-
- # check that balance is correct
- result = wallet.cmd("getBalances")
- check_single_balance(
- result["balances"], amount_effective + amount_effective, amount_effective
- )
-
- # assert that 3nd withdrawal shows up properly in transactions
- result = wallet.cmd("getTransactions")
- assert len(result["transactions"]) == 3
- transaction = result["transactions"][0]
- assert transaction["type"] == "withdrawal"
- assert Amount.parse(transaction["amountEffective"]) == amount_effective
- assert Amount.parse(transaction["amountRaw"]) == amount_raw
- assert transaction["exchangeBaseUrl"] == exchange.url
- assert transaction["pending"]
- withdrawal_details = transaction["withdrawalDetails"]
- assert withdrawal_details["type"] == "manual-transfer"
- assert len(withdrawal_details["exchangePaytoUris"]) == 1
- assert withdrawal_details["exchangePaytoUris"][0].startswith(payto_list[0])
-
- # last withdrawal is newest
- timestamp3 = transaction["timestamp"]["t_ms"]
- assert timestamp3 > timestamp0
- assert timestamp3 > timestamp1