Skip to content

test: add unit test suites and coverage gates for build-assets.py and brand.js - #7

Open
devin-ai-integration[bot] wants to merge 3 commits into
mainfrom
devin/1787796622-add-unit-tests
Open

devin-ai-integration[bot] wants to merge 3 commits into
mainfrom
devin/1787796622-add-unit-tests

Conversation

@devin-ai-integration

Copy link
Copy Markdown

Summary

Das Repository hatte keine Tests und kein Test-Tooling — die Coverage der beiden Code-Module lag bei 0%. Dieser PR fügt zwei Suiten plus CI und Coverage-Schwellen hinzu:

Modul vorher nachher
scripts/build-assets.py 0% 99% (Statements)
brand.js 0% 100% Lines / 94% Branches

scripts/build-assets.py (tests/test_build_assets.py, pytest): Das Skript lief komplett auf Modulebene, war also nicht importierbar. Die Pipeline ist unverändert in Funktionen extrahiert:

def build_brand(rel, logo_name, icon_name, accent, assets_root=ASSETS): ...
def build_proxmox(assets_root=ASSETS): ...
def main(assets_root=ASSETS):
    for ... in BRANDS: build_brand(..., assets_root)
    build_proxmox(assets_root)
if __name__ == "__main__": main()

Alle Größen, Paddings, Farben, Pfade und die Reihenfolge sind unverändert. Zusätzlich wird cairosvg erst in render_svg() importiert, damit die Tests ohne native Cairo-Bibliothek laufen (render_svg wird gemockt bzw. sys.modules["cairosvg"] ersetzt). Getestet werden fnt, contain, favicon, grid, banner, render_svg, die vollständigen Ausgabesets von build_brand/build_proxmox/main in tmp_path sowie die Konsistenz der BRANDS-Tabelle mit den SVG-Quellen auf der Platte.

brand.js (tests/brand.test.js, vitest + jsdom): brand.js bleibt unverändert (klassisches <script src> — Exports würden das Portal brechen). Die Tests bauen pro Fall das DOM aus index.html nachgebildet auf, stubben fetch/navigator.clipboard und importieren brand.js anschließend über die vitest-Pipeline, sodass die Coverage tatsächlich von den Tests erzeugt wird. Geprüft wird ausschließlich beobachtbares Verhalten: Rendering und Escaping der Karten/Asset-Zeilen, Fallback-Marks (inkl. img-error), Filterung über Input und Karten-Klicks, Raw- vs. Repo-Links, fehlende canonicalRawBase, die deutschen Fehlerzustände bei !r.ok und geworfenem fetch, Scroll-Progress und Pointer-CSS-Variablen.

tests/test_manifest.py: validiert assets/img/manifest.json gegen die Platte — eindeutige Brand-IDs, Pflichtfelder und jeder path existiert wirklich.

CI/Tooling: .github/workflows/tests.yml (Python 3.12 + Node 20, jeweils mit Coverage), requirements-dev.txt, package.json/package-lock.json, vitest.config.js, .gitignore, Coverage-Schwellen (--cov-fail-under=90, vitest thresholds 90/90/80) und ein Tests-Abschnitt im README.

Gefundener Defekt (nicht behoben)

Der Copy-Handler in brand.js liest e.currentTarget nach einem await, wo es sowohl im Browser als auch in jsdom null ist:

await navigator.clipboard.writeText(rawPath.textContent);
e.currentTarget.textContent='Kopiert';   // TypeError -> vom leeren catch{} verschluckt

Der Pfad wird also kopiert, aber das Label wechselt nie auf „Kopiert“. Der Test dokumentiert dieses Ist-Verhalten, statt es zu verstecken. Fix wäre eine Zeile (const btn=e.currentTarget; vor dem await) — bewusst nicht in diesem Test-PR enthalten.

Die Shell-Skripte (proxmox/install-webowie-proxmox-branding.sh, scripts/create-netbootxyz-alpine-lxc.sh) bleiben ungetestet; das bräuchte ein Bats-Setup.

Link to Devin session: https://app.devin.ai/sessions/82fc2e68846a4cb2b36a91a3791731f4
Requested by: @puchadave

puchadave and others added 3 commits August 27, 2026 02:16
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant