Updater: Prüfung beim Start und unter Hilfe, Setup herunterladen, DB sichern, still installieren, Neustart
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
968c68ac1a
commit
b85a75857e
6 files changed
+260
-2
No files matched your search
@@ -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)
|
||||
Reference in new issue
Block a user