feat: Pockets sind erkennbar und zuordenbar

Ein Revolut-Pocket bringt weder eigene IBAN noch eigenen Namen mit. Certain
hielt bisher nur uid, IBAN, Name und Waehrung fest – mehrere Konten derselben
Bank sahen damit gleich aus, und in der Zeile stand die rohe Kennung.

Jetzt werden Produktbezeichnung und die Kennung fuer Konten ohne IBAN
mitgefuehrt, der angezeigte Name faellt der Reihe nach auf Name, Details,
Produkt, Kennung, IBAN zurueck statt auf die uid, und der uebermittelte
Datensatz laesst sich aufklappen – nachsehen statt raten, wenn zwei Konten
gleich aussehen. Beim Neuverbinden werden die Merkmale aufgefrischt, ohne die
Zuordnung anzutasten.

Fehlt ein Konto in der Waehrung des Bankkontos, steht das jetzt dabei; vorher
war die Auswahl einfach leer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-26 23:02:25 +02:00
co-authored by Claude Opus 5
parent d8995116cb
commit f684c752d8
8 changed files with 199 additions and 11 deletions
+56
View File
@@ -555,3 +555,59 @@ def test_erneutes_verbinden_behaelt_die_kontozuordnung(admin, fake_bank):
passende = [c for c in admin.get("/api/bank/connections").json()
if c["aspsp_name"] == "Testbank"]
assert len(passende) == 1
def test_pocket_ohne_iban_und_namen_bleibt_unterscheidbar(admin, fake_bank):
"""Ein Revolut-Pocket bringt weder IBAN noch eigenen Namen mit. Ohne
Produktbezeichnung und Ersatzkennung sähen mehrere Konten gleich aus."""
_app(admin)
haupt = f"acc-{secrets.token_hex(4)}"
pocket = f"acc-{secrets.token_hex(4)}"
fake_bank(konten=[
{"uid": haupt, "name": "Revolut", "currency": "CHF",
"account_id": {"iban": "CH9300762011623852957"}, "product": "Current"},
# So kommt ein Pocket an: keine IBAN, kein Name, nur Produkt und
# eine Kennung unter ``other``.
{"uid": pocket, "currency": "CHF", "product": "Steuern",
"account_id": {"other": {"identification": "POCKET-7788"}}},
])
state = admin.post("/api/bank/connect",
json={"aspsp_name": "Revolut", "country": "LT"}).json()["state"]
r = admin.post(f"/api/bank/callback?state={state}&code=guter-code")
assert r.status_code == 200, r.text
assert r.json()["konten"] == 2
links = {v["remote_uid"]: v for v in admin.get("/api/bank/links").json()}
p = links[pocket]
assert p["product"] == "Steuern"
assert p["other_id"] == "POCKET-7788"
assert p["iban"] is None
# Der Name faellt auf etwas Sprechendes zurueck, nicht auf die uid.
assert p["remote_name"] == "Steuern"
assert p["remote_name"] != p["remote_uid"]
assert p["bank_felder"]["product"] == "Steuern"
# Und die beiden sind auseinanderzuhalten.
assert links[haupt]["remote_name"] != p["remote_name"]
def test_merkmale_werden_beim_neuverbinden_aufgefrischt(admin, fake_bank):
"""Sonst muesste man loeschen, um an eine spaetere Produktbezeichnung zu
kommen – und verloere dabei die Zuordnung."""
_app(admin)
uid = f"acc-{secrets.token_hex(4)}"
bank = f"Testbank-{secrets.token_hex(3)}"
def verbinde(konten):
fake_bank(konten=konten)
state = admin.post("/api/bank/connect",
json={"aspsp_name": bank, "country": "DE"}).json()["state"]
return admin.post(f"/api/bank/callback?state={state}&code=guter-code")
verbinde([{"uid": uid, "currency": "EUR"}])
assert admin.get("/api/bank/links").json()[-1]["product"] is None
verbinde([{"uid": uid, "currency": "EUR", "name": "Urlaub", "product": "Savings"}])
danach = [v for v in admin.get("/api/bank/links").json() if v["remote_uid"] == uid][0]
assert danach["product"] == "Savings"
assert danach["remote_name"] == "Urlaub"