fix: Eine Sicherung mit Transfer-Schlagwort laesst sich wieder einspielen
Das feste Zielkonto eines Transfer-Schlagworts behielt beim Wiederherstellen die alte Konto-Nummer. Die Nummern werden dabei aber neu vergeben, also lief es ins Leere – und zwar so, dass die GANZE Wiederherstellung mit einem Fremdschluessel-Fehler abbrach, nicht nur diese eine Zeile. Wer je ein Zielkonto gewaehlt hatte, kam an seine Sicherung nicht mehr heran. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e8c18adafb
commit
a9ea0432d8
@@ -87,3 +87,44 @@ def test_jede_nutzertabelle_ist_im_backup_beruecksichtigt():
|
||||
f"Diese Tabellen gehören dem Nutzer, stehen aber in keiner Backup-Liste: "
|
||||
f"{fehlend}. Entweder in USER_TABLES aufnehmen oder oben begründet ausnehmen."
|
||||
)
|
||||
|
||||
|
||||
def test_transfer_schlagwort_behaelt_sein_zielkonto(admin):
|
||||
"""Ein Transfer-Schlagwort mit festem Zielkonto trug beim Wiedereinspielen
|
||||
die ALTE Konto-Nummer in die neue Datenbank. Beim Einspielen brach dann die
|
||||
ganze Sicherung mit einem Fremdschluessel-Fehler ab - nicht nur diese eine
|
||||
Zeile. Wer je ein Zielkonto gewaehlt hatte, kam an seine Sicherung also gar
|
||||
nicht mehr heran."""
|
||||
import secrets
|
||||
|
||||
def _konto(name):
|
||||
return admin.post("/api/accounts", json={
|
||||
"name": name, "type": "sparkonto", "currency": "CHF",
|
||||
"opening_balance_cents": 0}).json()
|
||||
|
||||
# Erst Luecken in die Konto-Nummern reissen, dann das Zielkonto anlegen.
|
||||
# Ohne Luecken vergibt SQLite beim Einspielen zufaellig dieselben Nummern
|
||||
# und der Fehler bliebe unsichtbar - genau deshalb ist er so lange
|
||||
# unbemerkt geblieben.
|
||||
weg = [_konto(f"Weg {secrets.token_hex(3)}") for _ in range(5)]
|
||||
ziel = _konto(f"Sparen {secrets.token_hex(3)}")
|
||||
for k in weg:
|
||||
assert admin.delete(f"/api/accounts/{k['id']}").status_code in (200, 204)
|
||||
|
||||
wort = f"um chf sparen {secrets.token_hex(5)}"
|
||||
r = admin.post("/api/categories/transfer-keywords",
|
||||
json={"word": wort, "target_account_id": ziel["id"]})
|
||||
assert r.status_code == 201, r.text
|
||||
|
||||
daten = json.loads(admin.get("/api/export/backup.json").content)
|
||||
r = admin.post("/api/backup/restore",
|
||||
files={"file": ("backup.json", json.dumps(daten).encode("utf-8"),
|
||||
"application/json")},
|
||||
data={"mode": "replace"})
|
||||
assert r.status_code == 200, r.text
|
||||
|
||||
konten = {a["name"]: a["id"] for a in admin.get("/api/accounts").json()}
|
||||
regel = next(w for w in admin.get("/api/categories/transfer-keywords").json()
|
||||
if w["word"] == wort)
|
||||
assert regel["target_account_id"] == konten[ziel["name"]], \
|
||||
"das Zielkonto muss auf die NEUE Nummer zeigen"
|
||||
|
||||
Reference in New Issue
Block a user