fix: Bank-Suche verlor die besten Treffer beim Kuerzen
Der Fehler, den der Nutzer gefunden hat: Die Suche nach "n" lieferte "genau 200" Treffer und darunter nie N26. Ursache war die Reihenfolge – alphabetisch sortiert und ERST DANN bei 200 gekuerzt. "N26" liegt hinter "Aachener Bank", fiel also hinter zweihundert Banken heraus, die irgendwo ein n im Namen tragen. Die Bank war die ganze Zeit da. Jetzt wird zuerst bewertet (genauer Name > Namensanfang > Wortanfang > Teiltreffer > nur BIC/Gruppe) und erst danach gekuerzt. Ausserdem wird die ECHTE Trefferzahl gemeldet statt der gekuerzten – "genau 200" sah aus wie ein Suchergebnis, war aber die Obergrenze. Ein Regressionstest stellt den Fall nach: 300 Banken mit "n" im Namen, alphabetisch vor N26. Ohne den Fix faellt er um. Nebenbei geprueft und ausgeschlossen: /aspsps blaettert nicht, die Liste ist also vollstaendig; Sandbox und alphabetische Kuerzung waren es auch nicht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -432,3 +432,51 @@ def test_leere_bankliste_ist_von_keinem_treffer_unterscheidbar(admin, fake_bank)
|
||||
assert daten["treffer"] == []
|
||||
finally:
|
||||
bank_api_modul.BankClient._anfrage = urspruenglich
|
||||
|
||||
|
||||
def test_treffer_werden_nach_guete_gekuerzt_nicht_alphabetisch(admin, monkeypatch):
|
||||
"""Der Fehler, der einen Abend gekostet hat.
|
||||
|
||||
Die Trefferliste wird bei 200 gekürzt. Wurde vorher alphabetisch sortiert,
|
||||
fiel „N26" bei der Suche nach „n" hinter zweihundert Banken heraus, die
|
||||
irgendwo ein n im Namen tragen – die Bank war da, tauchte aber nie auf.
|
||||
Gekürzt wird deshalb erst NACH der Bewertung.
|
||||
"""
|
||||
_app(admin)
|
||||
|
||||
# Dreihundert Banken, die alle ein „n" enthalten und alphabetisch vor
|
||||
# „N26" liegen – plus die gesuchte Bank.
|
||||
viele = [{"name": f"Aachener Bank {i:03d}", "country": "DE"} for i in range(300)]
|
||||
viele.append({"name": "N26", "country": "DE"})
|
||||
viele.append({"name": "Revolut", "country": "LT"})
|
||||
|
||||
def _anfrage(self, methode, pfad, **rest):
|
||||
if pfad.startswith("/aspsps"):
|
||||
return {"aspsps": viele}
|
||||
raise AssertionError(f"unerwartet: {pfad}")
|
||||
|
||||
monkeypatch.setattr(bank_api.BankClient, "_anfrage", _anfrage)
|
||||
|
||||
daten = admin.get("/api/bank/banks?search=n").json()
|
||||
namen = [b["name"] for b in daten["treffer"]]
|
||||
assert "N26" in namen, "N26 muss trotz Kürzung sichtbar sein"
|
||||
assert namen[0] == "N26", "Der beste Treffer gehört nach oben"
|
||||
# Die echte Trefferzahl, nicht die gekürzte – sonst steht dort immer 200.
|
||||
# 300 Aachener + N26; "Revolut" enthält kein n und zählt nicht mit.
|
||||
assert daten["treffer_gesamt"] == 301
|
||||
assert len(daten["treffer"]) == 200
|
||||
assert daten["gekuerzt"] is True
|
||||
|
||||
|
||||
def test_genauer_name_schlaegt_teiltreffer(admin, monkeypatch):
|
||||
_app(admin)
|
||||
liste = [{"name": "Revolut Bank UAB", "country": "LT"},
|
||||
{"name": "Revolut", "country": "LT"},
|
||||
{"name": "Banca Revoluta", "country": "IT"}]
|
||||
|
||||
def _anfrage(self, methode, pfad, **rest):
|
||||
return {"aspsps": liste}
|
||||
|
||||
monkeypatch.setattr(bank_api.BankClient, "_anfrage", _anfrage)
|
||||
namen = [b["name"] for b in admin.get("/api/bank/banks?search=revolut").json()["treffer"]]
|
||||
assert namen == ["Revolut", "Revolut Bank UAB", "Banca Revoluta"]
|
||||
|
||||
Reference in New Issue
Block a user