Full project audit: refactor + test-suite optimalisatie #86
Labels
No labels
blocked
bug
design
documentation
duplicate
enhancement
future
good first issue
help wanted
invalid
question
refactoring
tracker
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jelmer/topoquiz#86
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Na v2.18.0 (#80 afgerond) willen we een complete audit van het project — niet beperkt tot de daily/bonus-paden.
Scope
1. Code-audit
Doel: inventariseren waar corners zijn afgesneden, waar duplicatie zit, en wat vereenvoudigd kan worden. Concreet aandachtsgebied:
index.html(~2500 regels): is er een natuurlijke splitsing mogelijk (bv. map-rendering / polygon-layer-management / quiz-state / screens / feedback)? Zo ja: in modules of gewoon duidelijkere secties.polygonTypes): de drie types (province/water/country) delen veel code maar ook duidelijke verschillen. Kan het generieker zonder dat de afterHighlight-strategie onleesbaar wordt?buildPolygonLayer:_isMixed-tak dupliceert logica uit de normale tak — mogelijk samen te trekken.cities.js: SETS-object heeft velden die niet elke set gebruikt (bounds,fitOnStart,clickCorrectKm,phases,daily,bonus,mastery). Is hier een schonere vorm mogelijk (varianten, typed config)?saveProgress()+dailyAnswerKey()+ backwards-compat voor oude bonus-string[]-shape — kan dat nu weg?setHighlightvssetHighlightPolygon: twee aparte codepaths voor marker vs polygon. Logisch, maar de call-sites zijn verspreid.2. Test-suite-audit
Doel: snellere, minder flaky tests zonder functionele dekking te verliezen.
page.goto('/')?waitForTimeout(N)occurrences inventariseren en migreren naarwaitForFunction/waitForSelector— flaky-bron.test.js(unit, 1362) entests/*.spec.js: wat wordt op beide niveaus getest? Unit is goedkoper — verplaats alles waar geen DOM nodig is.playwright.config.js: retries, workers, parallelisatie — optimaal voor GitHub runners?tests/set54.spec.jst/mtests/set89.spec.js): veel kopie-plak. Kan parametrized i.p.v. één file per set.3. Werkwijze (belangrijk)
Dit is eerst analyse, dan prioriteren, dan pas wijzigen. Niet in één sessie alles tegelijk:
AUDIT.mdof in het issue zelf) met:4. Niet in scope
Niet urgent. Pak op als er een rustig moment is tussen feature-releases door.
Audit-bevindingen — analyse (geen executie)
Twee parallelle audits gedraaid: één op
index.html+cities.js, één optests/+test.js. Bevindingen hieronder gestructureerd per impact/risico. Dit is de analyse-stap — prioritering en executie komen daarna, in aparte issues/branches.Metrics (baseline)
index.html: ~2500 regels monoliet (HTML+CSS+JS)cities.js: 1 groot SETS-object + data-arraystest.js): 1362 regelspage.goto('/'): 145× — fixture-kandidaatwaitForTimeout(N): 5× (4 arbitrair, 1 gemotiveerd)A. Quick wins (laag risico, directe winst)
playwright.config.jsretries: 2(CI),fullyParallel: true,timeout: 60_000tests/*.spec.jspage.goto('/')+sessionStorage.clear()i.p.v. 145× gototests/daily-bonus.spec.jsregel 20–53, 124–130dailyPool,dateSeed) verhuizen naartest.jswaitForTimeoutintests/set89.spec.js+ anderenwaitForFunction/waitForSelectorindex.html~2392startQuizrAF-fallbackif (_set.daily||_set.bonus) return— documenteer waaromGeschat: ~30–45s CI-besparing, flakiness omlaag, geen gedragswijziging.
B. Medium-term refactors (beperkt risico, goede ROI)
tests/set54.spec.js–set89.spec.js(21 files)for (const setId of GEOBAS_7_8_SETS)index.htmldistractorPool()~1479distractorPool(city)i.p.v. globaalcurrentCitylezenindex.htmlbuildPolygonLayer_isMixed-takindex.htmlscreen-navigatieindex.htmlprogress/sessionStoragedailyAnswerKey()+ backwards-compat voor oude string[]-shape kan weg na 2–3 releasesGeschat: ~950 LOC weg (parametrisatie), 20–30s extra CI-winst, duidelijker routing-verhaal.
C. Long-term (groot, aparte feature-branch)
index.htmlsplitsingquiz-state.js,map-render.js,polygon-layer.js,screens.js,feedback.jspolygonTypesregistercities.jsD. Pijnpunten uit audits die we NIET aanraden
setHighlightvssetHighlightPolygonsamenvoegen: twee paths lijken duplicaat maar reflecteren echt verschillende Leaflet-APIs (marker vs geoJson-layer). Samenvoegen = abstractie over dunne lijn.Aanbevolen volgorde voor executie (later)
index.htmlverder groeitElke sprint = eigen branch, eigen dev-preview, eigen release. Harde eis: alle tests groen vóór + na, geen gedragswijziging.
Status: analyse klaar. Wacht op jouw keuze welke sprints we oppakken en wanneer.
Sprint 1 — klaar op `feature/sprint-1-test-opt`
playwright.config.js:retries:2(CI),fullyParallel:true,timeout:60_000test.jsal dekt (dailyPooldeterminisme + per-group seed)waitForTimeout(300/400)→waitForFunctionop score-teller stateResultaat lokaal: 226 Playwright ✓, 1362 unit ✓. Suite 1:31 → 1:24 (-7s). CI-winst waarschijnlijk groter dankzij retries (eliminates infra-flake re-runs).
Wachtend op CF preview-akkoord vóór merge naar
dev.Sprint 1 gereleased in v2.18.1 — pipeline groen, productie gedeployed. Sprints 2–5 nog te doen.
Sprint 2 B1 — parametrize per-set smoke tests — shipped in v2.18.2.
tests/set-smoke.spec.jswith single parametrized fixture (SETS array, 19 entries)set*.spec.jsfiles trimmed to only set-specific regression/data-integrity testsIssue blijft open voor resterende sprints (A2 coverage-floor, B2 daily-bonus split, etc.).
Sprint 2 B2 — unit-test migration — shipped in v2.18.3.
test.js(1365 → 1437)Audit-rapport: AUDIT.md (commit
759d679)Volledige code-audit gedaan — scope 1 uit deze issue. Uitkomst: 7 topics geïnventariseerd met file+regelnummer, LOC-impact-schatting, en 9-item prioriteitenlijst. Samenvatting:
Refactor-backlog — in prioriteit-volgorde
_isMixed-tak dedup (E1 / I2 / R1)src/game/+ build-stap (E3 / I3 / R2)polygonTypesgeneriek +setHighlightunified (E2 / I3 / R2)E = effort (dagen), I = impact, R = risico, telkens 1-4.
Scope 2 (test-suite-audit): al voltooid
Audit-scope afgerond. Child-issues die hieruit voortkwamen zijn allemaal afgerond of doorgezet:\n\n- #90 buildPolygonLayer dedup → done\n- #91 string[]-backwards-compat opruim → done\n- #93 SETS discriminated union refactor → done (v2.25.3)\n- #94 centrale router → done\n- #95 pure-logica extract → done (v2.25.x)\n- #96 scherm-rendering extract → done 4/6, rest in #120\n- #116/#119 polygon-zoom defensive cap → done\n\nVolgende audit-ronde krijgt een nieuw issue — dit ticket is als scope-parent klaar.