🔒 Repository is read-only – file editing is disabled.

PaganLinux/pagan-web-v2/test_pagsync_incremental.py main

97 linii Raw ← Powrót
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
#!/usr/bin/env python3
"""Test regresyjny przyrostowej aktualizacji repo.json w pagsync.

Sprawdza, że po pojedynczym buildzie indeks repo.json:
  * gubi wpisy, których plik .pag został skasowany (clean_old_versions),
  * podmienia wpis zbudowanej paczki na nową wersję,
  * dopisuje pliki obecne na dysku, a nieobecne w indeksie (samoleczenie),
  * zachowuje pozostałe wpisy i nie nadpisuje indeksu przy DO_SIGN=False.

Uruchomienie:  python3 test_pagsync_incremental.py
"""
import importlib.util, importlib.machinery, json, os, sys, tarfile, tempfile, io

HERE = os.path.dirname(os.path.abspath(__file__))

loader = importlib.machinery.SourceFileLoader("pagsync_mod", os.path.join(HERE, "pagsync"))
spec = importlib.util.spec_from_loader("pagsync_mod", loader)
mod = importlib.util.module_from_spec(spec)
loader.exec_module(mod)


def make_pag(path, name, version, release):
    meta = {
        "name": name, "version": version, "release": release,
        "arch": "x86_64", "description": f"{name} test",
        "depends": [], "provides": [], "license": ["GPL2"],
    }
    with tarfile.open(path, "w:xz") as tf:
        data = json.dumps(meta).encode()
        ti = tarfile.TarInfo("metadata.json")
        ti.size = len(data)
        tf.addfile(ti, io.BytesIO(data))


def main():
    tmp = tempfile.mkdtemp(prefix="pagsync-test-")
    cat = os.path.join(tmp, "stable")
    os.makedirs(cat)

    # bar: aktualny plik + wpis w indeksie
    make_pag(os.path.join(cat, "bar-2.0-1.pag"), "bar", "2.0", 1)
    # foo: NOWY plik 1.0 (stara 0.9 skasowana przez clean_old_versions)
    make_pag(os.path.join(cat, "foo-1.0-1.pag"), "foo", "1.0", 1)
    # baz: plik jest na dysku, ale w ogóle nie ma go w indeksie (przerwana seria)
    make_pag(os.path.join(cat, "baz-3.0-1.pag"), "baz", "3.0", 1)

    # Stary indeks: foo-0.9 (plik już nie istnieje) + bar-2.0
    with open(os.path.join(cat, "repo.json"), "w") as f:
        json.dump({
            "category": "stable", "updated": "old", "count": 2, "pag_version": "1.2.3",
            "packages": [
                {"name": "foo", "version": "0.9", "release": 1, "filename": "foo-0.9-1.pag",
                 "size": 1, "sha256": "x", "arch": "x86_64", "description": "",
                 "depends": [], "provides": [], "license": []},
                {"name": "bar", "version": "2.0", "release": 1, "filename": "bar-2.0-1.pag",
                 "size": 1, "sha256": "x", "arch": "x86_64", "description": "",
                 "depends": [], "provides": [], "license": []},
            ],
        }, f)

    # Stub zapisu/podpisu – testujemy logikę indeksu bez GPG.
    def fake_write(cat_dir, packages, catname, verbose=True):
        with open(os.path.join(cat_dir, "repo.json"), "w") as f:
            json.dump({"category": catname, "updated": "new", "count": len(packages),
                       "pag_version": "1.2.3", "packages": packages}, f, indent=2)
        return False
    mod._write_and_sign_repo_json = fake_write
    mod.DO_SIGN = True

    assert mod.update_repo_json_after_build(cat, "foo-1.0-1.pag"), "update zwróciło False"
    result = json.load(open(os.path.join(cat, "repo.json")))
    names = {p["name"]: p for p in result["packages"]}
    print("wpisy:", sorted((p["name"], p["version"], p["filename"]) for p in result["packages"]))
    assert set(names) == {"foo", "bar", "baz"}, f"zły zestaw pakietów: {set(names)}"
    assert names["foo"]["filename"] == "foo-1.0-1.pag", "foo nie podmieniony na nową wersję"
    assert names["foo"]["version"] == "1.0"
    assert names["bar"]["filename"] == "bar-2.0-1.pag", "bar zniknął"
    assert names["baz"]["filename"] == "baz-3.0-1.pag", "plik z dysku nie dopisany do indeksu"
    assert "foo-0.9-1.pag" not in {p["filename"] for p in result["packages"]}, "stary wpis nie usunięty"
    assert result["count"] == 3
    assert result["pag_version"] == "1.2.3"
    print("✅ TEST OK: stary wpis usunięty, nowy dodany, plik z dysku dopisany, pozostałe zachowane")

    # DO_SIGN=False → brak zmian (nie nadpisujemy podpisanego indeksu)
    before = open(os.path.join(cat, "repo.json")).read()
    mod.DO_SIGN = False
    assert mod.update_repo_json_after_build(cat, "foo-1.0-1.pag") is False
    assert open(os.path.join(cat, "repo.json")).read() == before
    print("✅ TEST OK: DO_SIGN=False nie nadpisuje indeksu")

    import shutil
    shutil.rmtree(tmp, ignore_errors=True)
    print("🎉 Wszystkie testy przeszły.")


if __name__ == "__main__":
    main()