libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit d0f6f92c8df867d59804220368760f0b9f759372
parent 88ed1d47d716ef1f03e9f30f4bd8f86323aa8461
Author: MS <ms@taler.net>
Date:   Thu, 28 May 2020 17:52:49 +0200

TWG test

Diffstat:
Aintegration-tests/test-taler-facade.py | 223+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 223 insertions(+), 0 deletions(-)

diff --git a/integration-tests/test-taler-facade.py b/integration-tests/test-taler-facade.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 + +from requests import post, get +from subprocess import call, Popen, PIPE +from time import sleep +import os +import socket +import hashlib +import base64 + +# Steps implemented in this test. +# +# 0 Prepare sandbox. +# -> (a) Make a EBICS host, (b) make a EBICS subscriber +# for the test runner, and (c) assign a IBAN to such +# subscriber. +# +# 1 Prepare nexus. +# -> (a) Make a Nexus user, (b) make a EBICS subscriber +# associated to that user +# +# 2 Prepare the Ebics bank connection for the nexus user. +# -> (a) Upload keys from Nexus to the Bank (INI & HIA), +# (b) Download key from the Bank (HPB) to the Nexus, +# and (c) Fetch the bank account owned by that subscriber +# at the bank. + +# 3 Request history from the Nexus to the Bank (C53). +# 4 Verify that history is empty. +# 5 Issue a payment from Nexus +# -> (a) Prepare & (b) trigger CCT. +# 6 Request history after submitting the payment, +# from Nexus to Bank. +# 7 Verify that previous payment shows up. + +# Nexus user details +USERNAME = "person" +PASSWORD = "y" +USER_AUTHORIZATION_HEADER = "basic {}".format( + base64.b64encode(b"person:y").decode("utf-8") +) + +# Admin authentication +ADMIN_AUTHORIZATION_HEADER = "basic {}".format( + base64.b64encode(b"admin:x").decode("utf-8") +) + +# EBICS details +EBICS_URL = "http://localhost:5000/ebicsweb" +HOST_ID = "HOST01" +PARTNER_ID = "PARTNER1" +USER_ID = "USER1" +EBICS_VERSION = "H004" + +# Subscriber's bank account +SUBSCRIBER_IBAN = "GB33BUKB20201555555555" +SUBSCRIBER_BIC = "BUKBGB22" +SUBSCRIBER_NAME = "Oliver Smith" +BANK_ACCOUNT_LABEL = "savings" + +# Databases +NEXUS_DB="test-nexus.sqlite3" + +def fail(msg): + print(msg) + nexus.terminate() + sandbox.terminate() + exit(1) + + +def checkPorts(ports): + for i in ports: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind(("0.0.0.0", i)) + s.close() + except: + print("Port {} is not available".format(i)) + exit(77) + + +def assertResponse(response): + if response.status_code != 200: + print("Test failed on URL: {}".format(response.url)) + # stdout/stderr from both services is A LOT of text. + # Confusing to dump all that to console. + print("Check nexus.log and sandbox.log, probably under /tmp") + nexus.terminate() + sandbox.terminate() + exit(1) + # Allows for finer grained checks. + return response + + +# -1 Clean databases and start services. +os.chdir("..") +assert 0 == call(["rm", "-f", "sandbox/libeufin-sandbox.sqlite3"]) +assert 0 == call(["rm", "-f", "nexus/{}".format(NEXUS_DB)]) +DEVNULL = open(os.devnull, "w") + +assert 0 == call( + ["./gradlew", "nexus:run", "--console=plain", "--args=superuser admin --password x --db-name={}".format(NEXUS_DB)] +) + +# Start nexus +checkPorts([5001]) +nexus = Popen( + ["./gradlew", "nexus:run", "--console=plain", "--args=serve --db-name={}".format(NEXUS_DB)], + stdout=PIPE, + stderr=PIPE, +) +for i in range(10): + try: + get("http://localhost:5001/") + except: + if i == 9: + nexus.terminate() + stdout, stderr = nexus.communicate() + print("Nexus timed out") + print("{}\n{}".format(stdout.decode(), stderr.decode())) + exit(77) + sleep(2) + continue + break +# Start sandbox +checkPorts([5000]) +sandbox = Popen(["./gradlew", "sandbox:run"], stdout=PIPE, stderr=PIPE) +for i in range(10): + try: + get("http://localhost:5000/") + except: + if i == 9: + nexus.terminate() + sandbox.terminate() + stdout, stderr = nexus.communicate() + print("Sandbox timed out") + print("{}\n{}".format(stdout.decode(), stderr.decode())) + exit(77) + sleep(2) + continue + break + +# 0.a +assertResponse( + post( + "http://localhost:5000/admin/ebics/host", + json=dict(hostID=HOST_ID, ebicsVersion=EBICS_VERSION), + ) +) + +# 0.b +assertResponse( + post( + "http://localhost:5000/admin/ebics/subscribers", + json=dict(hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID), + ) +) + +# 0.c +assertResponse( + post( + "http://localhost:5000/admin/ebics/bank-accounts", + json=dict( + subscriber=dict(hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID), + iban=SUBSCRIBER_IBAN, + bic=SUBSCRIBER_BIC, + name=SUBSCRIBER_NAME, + label=BANK_ACCOUNT_LABEL, + ), + ) +) + +# 1.a, make a new nexus user. + +assertResponse( + post( + "http://localhost:5001/users", + headers=dict(Authorization=ADMIN_AUTHORIZATION_HEADER), + json=dict(username=USERNAME, password=PASSWORD), + ) +) + +print("creating bank connection") + +# 1.b, make a ebics bank connection for the new user. +assertResponse( + post( + "http://localhost:5001/bank-connections", + json=dict( + name="my-ebics", + source="new", + type="ebics", + data=dict( + ebicsURL=EBICS_URL, hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID + ), + ), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +print("connecting") + +assertResponse( + post( + "http://localhost:5001/bank-connections/my-ebics/connect", + json=dict(), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + + +# 2.c, fetch bank account information +assertResponse( + post( + "http://localhost:5001/bank-connections/my-ebics/ebics/import-accounts", + json=dict(), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +nexus.terminate() +sandbox.terminate() +print("Test passed!")