diff options
author | Florian Dold <florian.dold@gmail.com> | 2020-05-29 12:44:32 +0530 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2020-05-29 12:44:32 +0530 |
commit | 2734d356a94c81ed25eb9c894cfdafa9b4e00d93 (patch) | |
tree | a337366caabb4ad9fe07cc6aa5d61a9cad4e5b0d /contrib | |
parent | 8f5d1e8d753b5c4120673d73919d61e9b6d54199 (diff) | |
download | libeufin-2734d356a94c81ed25eb9c894cfdafa9b4e00d93.tar.gz libeufin-2734d356a94c81ed25eb9c894cfdafa9b4e00d93.tar.bz2 libeufin-2734d356a94c81ed25eb9c894cfdafa9b4e00d93.zip |
script to start test environment
Diffstat (limited to 'contrib')
-rwxr-xr-x | contrib/start-testenv.py | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/contrib/start-testenv.py b/contrib/start-testenv.py new file mode 100755 index 00000000..66e49477 --- /dev/null +++ b/contrib/start-testenv.py @@ -0,0 +1,293 @@ +#!/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), + ) +) + +# 3, ask nexus to download history +assertResponse( + post( + f"http://localhost:5001/bank-accounts/{BANK_ACCOUNT_LABEL}/fetch-transactions", + json=dict(), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +# 4, make sure history is empty +resp = assertResponse( + get( + f"http://localhost:5001/bank-accounts/{BANK_ACCOUNT_LABEL}/transactions", + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) +if len(resp.json().get("transactions")) != 0: + fail("unexpected number of transactions") + +# 5.a, prepare a payment +resp = assertResponse( + post( + "http://localhost:5001/bank-accounts/{}/prepared-payments".format( + BANK_ACCOUNT_LABEL + ), + json=dict( + iban="FR7630006000011234567890189", + bic="AGRIFRPP", + name="Jacques La Fayette", + subject="integration test", + amount="EUR:1", + ), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) +PREPARED_PAYMENT_UUID = resp.json().get("uuid") +if PREPARED_PAYMENT_UUID == None: + fail("Payment UUID not received") + +# 5.b, submit prepared statement +assertResponse( + post( + f"http://localhost:5001/bank-accounts/{BANK_ACCOUNT_LABEL}/prepared-payments/{PREPARED_PAYMENT_UUID}/submit", + json=dict(), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +# 6, request history after payment submission +assertResponse( + post( + f"http://localhost:5001/bank-accounts/{BANK_ACCOUNT_LABEL}/fetch-transactions", + json=dict(), + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +resp = assertResponse( + get( + f"http://localhost:5001/bank-accounts/{BANK_ACCOUNT_LABEL}/transactions", + headers=dict(Authorization=USER_AUTHORIZATION_HEADER), + ) +) + +if len(resp.json().get("transactions")) != 1: + fail("Unexpected number of transactions; should be 1") + + +try: + input("press enter to stop LibEuFin test environment ...") +finally: + nexus.terminate() + sandbox.terminate() |