2020-07-24 16:09:30 +02:00
|
|
|
import os
|
2020-07-29 14:33:41 +02:00
|
|
|
import secrets
|
|
|
|
from dataclasses import dataclass
|
2020-07-24 16:09:30 +02:00
|
|
|
from subprocess import run
|
|
|
|
|
|
|
|
import psutil
|
2020-07-29 11:03:59 +02:00
|
|
|
import requests
|
|
|
|
|
2020-07-24 16:09:30 +02:00
|
|
|
from .taler_service import TalerService
|
|
|
|
|
2020-07-29 11:03:59 +02:00
|
|
|
|
|
|
|
@dataclass
|
|
|
|
class BankUser:
|
|
|
|
username: str
|
|
|
|
password: str
|
|
|
|
|
2020-07-29 14:33:41 +02:00
|
|
|
|
2020-07-29 11:03:59 +02:00
|
|
|
@dataclass
|
|
|
|
class WithdrawUriResponse:
|
|
|
|
taler_withdraw_uri: str
|
|
|
|
withdrawal_id: str
|
|
|
|
|
2020-07-24 16:09:30 +02:00
|
|
|
|
|
|
|
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)
|
2020-07-29 11:03:59 +02:00
|
|
|
self.url = "http://localhost:%s/" % r.stdout.rstrip()
|
2020-07-24 16:09:30 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2020-07-29 11:03:59 +02:00
|
|
|
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"],
|
|
|
|
)
|
|
|
|
|
2020-07-29 14:33:41 +02:00
|
|
|
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",
|
2020-07-29 11:03:59 +02:00
|
|
|
auth=auth
|
|
|
|
)
|
|
|
|
|
2020-07-24 16:09:30 +02:00
|
|
|
# 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
|