Updater: Prüfung beim Start und unter Hilfe, Setup herunterladen, DB sichern, still installieren, Neustart
Build / linux (push) Successful in 1m56s
Build / windows-exe (push) Successful in 8m6s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kerim AtilganandClaude Opus 5.5 committed 2026-11-03 15:18:22 +01:00
1 parent 968c68ac1a
commit b85a75857e
6 files changed
+260 -2

No files matched your search

+65
View File
@@ -696,3 +696,68 @@ def test_einstellungen_atomar_und_defekt(tmp_path, monkeypatch):
daten = config.load()
assert daten["db_pfad"] is None and daten["defekt"].endswith("einstellungen.defekt.json")
assert (tmp_path / "einstellungen.defekt.json").read_text(encoding="utf-8") == "{ kaputt"
# --------------------------------------------------------------------------- Updates
class _Antwort:
"""Ersatz für urlopen(): liefert Bytes, kennt seine (End-)URL."""
def __init__(self, daten: bytes, url: str):
import io
self._f, self._url = io.BytesIO(daten), url
def read(self, n=-1):
return self._f.read(n)
def geturl(self):
return self._url
def __enter__(self):
return self
def __exit__(self, *a):
return False
def test_update_version_vergleich():
from provtool import updater
assert updater.ist_neuer("1.10.0", "1.9.2") and updater.ist_neuer("v1.8.0", "1.7.0")
assert not updater.ist_neuer("1.7.0", "1.7.0") and not updater.ist_neuer("1.6.9", "1.7.0")
assert not updater.ist_neuer("kaputt", "1.7.0") and not updater.ist_neuer("1.8.0", "")
def test_update_neueste_nimmt_nur_eigenes_setup(monkeypatch):
import json
from provtool import updater
basis = "https://git.handy-insel.de/kerimatilgan/provisionsmanager95/releases/download/v1.8.0/"
release = {"tag_name": "v1.8.0", "html_url": "https://git.handy-insel.de/x/releases/tag/v1.8.0", "assets": [
{"name": "Provisionsmanager95.exe", "browser_download_url": basis + "Provisionsmanager95.exe", "size": 5},
{"name": "Provisionsmanager-Setup-1.8.0.exe", "browser_download_url": basis + "Provisionsmanager-Setup-1.8.0.exe",
"size": 7}]}
monkeypatch.setattr(updater.urllib.request, "urlopen",
lambda url, timeout=0: _Antwort(json.dumps(release).encode(), url))
info = updater.neueste()
assert info == {"version": "1.8.0", "seite": release["html_url"],
"setup_url": basis + "Provisionsmanager-Setup-1.8.0.exe", "groesse": 7}
release["assets"][1]["browser_download_url"] = "https://boese.example/Provisionsmanager-Setup-1.8.0.exe"
assert updater.neueste()["setup_url"] is None, "Setup von fremdem Server darf nicht geladen werden"
def test_update_download_wird_geprueft(monkeypatch, tmp_path):
from provtool import updater
url = "https://git.handy-insel.de/r/releases/download/v1.8.0/Provisionsmanager-Setup-1.8.0.exe"
inhalt = {"daten": b"MZ" + b"x" * 98, "url": url}
monkeypatch.setattr(updater.urllib.request, "urlopen", lambda u, timeout=0: _Antwort(inhalt["daten"], inhalt["url"]))
setup = updater.herunterladen({"setup_url": url, "groesse": 100}, tmp_path)
assert setup.name == "Provisionsmanager-Setup-1.8.0.exe" and setup.read_bytes().startswith(b"MZ")
for daten, ende, groesse in ((b"MZ" + b"x" * 10, url, 100), # unvollständig
(b"PK" + b"x" * 98, url, 100), # kein Windows-Programm
(b"MZ" + b"x" * 98, "https://boese.example/a.exe", 100)): # umgeleitet
inhalt.update(daten=daten, url=ende)
setup.unlink(missing_ok=True)
with pytest.raises(updater.UpdateFehler):
updater.herunterladen({"setup_url": url, "groesse": groesse}, tmp_path)
assert not list(tmp_path.iterdir()), "halber Download bleibt liegen"
with pytest.raises(updater.UpdateFehler):
updater.herunterladen({"setup_url": "http://git.handy-insel.de/a/Provisionsmanager-Setup-1.8.0.exe"}, tmp_path)