import os
import uuid
import httpx
run_id = uuid.uuid4().hex
name = f"docs-test-{run_id}-counterparty"
address = "0x" + uuid.uuid5(uuid.NAMESPACE_URL, run_id).hex + "00000000"
api = httpx.Client(
base_url="https://api.range.org",
headers={"Authorization": f"Bearer {os.environ['RANGE_API_KEY']}",
"User-Agent": "curl/8.4.0"},
timeout=30,
)
def call(method, path, **kwargs):
response = api.request(method, path, **kwargs)
response.raise_for_status()
return response.json() if response.content else None
def tiny_pdf():
objects = [b"<< /Type /Catalog /Pages 2 0 R >>",
b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
b"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 72 72] /Contents 4 0 R >>",
b"<< /Length 0 >>\nstream\n\nendstream"]
result, offsets = b"%PDF-1.4\n", [0]
for number, obj in enumerate(objects, 1):
offsets.append(len(result))
result += f"{number} 0 obj\n".encode() + obj + b"\nendobj\n"
xref = len(result)
result += b"xref\n0 5\n0000000000 65535 f \n"
result += b"".join(f"{offset:010d} 00000 n \n".encode() for offset in offsets[1:])
return result + f"trailer\n<< /Size 5 /Root 1 0 R >>\nstartxref\n{xref}\n%%EOF\n".encode()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--with-bank", action="store_true")
parser.add_argument("--with-document", action="store_true")
args = parser.parse_args()
counterparty_id = address_id = bank_id = document_id = None
try:
page = call("GET", "/v2/counterparties", params={"search": name, "limit": 50})
print(page)
while page["meta"]["next_cursor"]:
page = call("GET", "/v2/counterparties", params={
"search": name, "limit": 50, "cursor": page["meta"]["next_cursor"],
})
print(page)
counterparty = call("POST", "/v2/counterparties", json={"name": name, "type": "other"})
counterparty_id = counterparty["id"]
addresses = call("PUT", f"/v2/counterparties/{counterparty_id}/addresses", json={
"operations": [{"action": "add", "address": address, "network": "ethereum",
"label": f"docs-test-{run_id}-address"}],
})
address_id = addresses[0]["id"]
detail = call("GET", f"/v2/counterparties/{counterparty_id}")
assert detail["id"] == counterparty_id
assert any(row["id"] == address_id and row["address"].lower() == address
for row in detail["addresses"])
if args.with_bank:
bank_accounts = call("PUT", f"/v2/counterparties/{counterparty_id}/bank-accounts", json={
"operations": [{"action": "add", "currency": "CAD",
"bank_name": f"docs-test-{run_id}-FAKE-BANK",
"account_name": f"docs-test-{run_id}-FAKE-HOLDER"}],
})
bank_id = bank_accounts[0]["id"]
detail = call("GET", f"/v2/counterparties/{counterparty_id}")
assert any(row["id"] == bank_id and row["currency"] == "CAD"
for row in detail["bank_accounts"])
if args.with_document:
document_name = f"docs-test-{run_id}-document.pdf"
document = call("POST", f"/v2/counterparties/{counterparty_id}/documents",
data={"type": "other", "name": document_name},
files={"file": (document_name, tiny_pdf(), "application/pdf")})
document_id = document["id"]
detail = call("GET", f"/v2/counterparties/{counterparty_id}")
assert any(row["id"] == document_id and row["mime_type"] == "application/pdf"
for row in detail["documents"])
print({"verified_counterparty_id": counterparty_id})
finally:
try:
if document_id:
call("DELETE", f"/v2/counterparties/{counterparty_id}/documents/{document_id}")
if bank_id:
call("PUT", f"/v2/counterparties/{counterparty_id}/bank-accounts",
json={"operations": [{"action": "remove", "id": bank_id}]})
if address_id:
call("PUT", f"/v2/counterparties/{counterparty_id}/addresses",
json={"operations": [{"action": "remove", "id": address_id}]})
finally:
try:
if counterparty_id:
call("DELETE", f"/v2/counterparties/{counterparty_id}")
finally:
api.close()