1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#!/usr/bin/env python3
from taler.util.amount import Amount
from tests import check_single_balance
def test_withdrawal(exchange, bank, wallet):
# assert that we start with no transactions
result = wallet.cmd("getTransactions")
assert not result["transactions"]
# test withdrawal
amount_raw = "TESTKUDOS:5"
wallet.testing_withdraw(amount_raw, exchange.url, bank.url)
# check that balance is correct
result = wallet.cmd("getBalances")
amount_effective = Amount("TESTKUDOS", 4, 84000000).stringify()
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 transaction["amountEffective"] == amount_effective
assert 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
uri = wallet.gen_withdraw_uri(amount_raw, bank.url)
assert uri.startswith("taler+http://withdraw")
# get withdrawal details from URI
result = wallet.cmd("getWithdrawalDetailsForUri", {"talerWithdrawUri": uri})
assert 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}
result = wallet.cmd("getWithdrawalDetailsForAmount", request)
assert result["amountRaw"] == amount_raw
assert 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}
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"]
# check that balance is correct
result = wallet.cmd("getBalances")
# TODO pendingIncoming and hasPendingTransactions are wrong, right?
print(result)
# check_single_balance(result["balances"], amount_effective, amount_effective, has_pending=True)
# 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 transaction["amountEffective"] == amount_effective
assert 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
# one more manual withdrawal
request = {"exchangeBaseUrl": exchange.url, "amount": amount_raw}
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")
# TODO pendingIncoming and hasPendingTransactions are wrong, right?
print(result)
# check_single_balance(result["balances"], amount_effective, TODO, has_pending=True)
# assert that 3nd withdrawal shows up properly in transactions
result = wallet.cmd("getTransactions")
# TODO where is the manual withdrawal!??
# assert len(result["transactions"]) == 3
for t in result["transactions"]:
print(t)
print()
|