Metal from Europe — carte interactive des groupes de metal européens (frontend statique + API Node.js + PostgreSQL/PostGIS + geocoder)
Find a file
Nicolas FRYDER b5e3ef91ab
Some checks are pending
CI / javascript (push) Waiting to run
CI / python (push) Waiting to run
CI / mutation (push) Waiting to run
test: couvrir adminAuth, réparer la CI Python et une couverture annoncée à tort
adminAuth.js était le fichier le moins couvert du dépôt — 52 % de score de
mutation, 22 mutants sans aucune couverture — alors qu'il porte JWT, bcrypt et
le verrouillage de compte. seedAdminUser, recordLoginAttempt, markLoginSuccess
et writeAuditLog n'avaient aucun test direct. writeAuditLog était le plus
gênant : il peut cesser d'enregistrer sans qu'aucune action admin n'échoue et
sans qu'aucun test ne rougisse, et un journal d'audit muet ne se remarque que
le jour où on en a besoin.

Mesuré après coup : adminAuth.js passe de 52,31 % à 84,29 %, les mutants sans
couverture de 22 à 1, et le score global de 82,20 % à 88,85 %.

Le job Python de la CI n'installait que ruff, pytest et pip-audit : psycopg2,
beautifulsoup4, lxml et hypothesis manquaient, et il aurait échoué dès la
collecte — ce que personne n'a jamais vu, faute de runner enregistré. Il part
désormais de requirements-dev.txt, et lance aussi la suite du crawler, qui
n'était pas exécutée du tout.

requirements-dev.txt épinglait psycopg2-binary==2.9.9, sans roue pour Python
>= 3.13 : la suite entière s'arrêtait dès la collecte sur un poste par ailleurs
sain. Épinglages assouplis en bornes basses.

Corrige enfin le commentaire de a11y.test.js, qui renvoyait à « l'audit
Lighthouse manuel du README de la CI » pour justifier deux règles désactivées.
Cet audit n'existe pas : README-CI.md documente le test e2e de l'admin, qui
couvre bien le contraste mais UNIQUEMENT pour le dashboard. Pour le site
public, ces règles ne sont vérifiées nulle part. La couverture n'a pas changé,
seule sa description était fausse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 14:49:04 +02:00
.forgejo/workflows test: couvrir adminAuth, réparer la CI Python et une couverture annoncée à tort 2026-08-22 14:49:04 +02:00
.githooks feat(admin): refonte du panneau par intention, vue Localisations, tests e2e 2026-08-18 15:05:29 +02:00
apps test: couvrir adminAuth, réparer la CI Python et une couverture annoncée à tort 2026-08-22 14:49:04 +02:00
infra chore(infra): en-têtes de sécurité, conteneurs non-root, retrait de pgAdmin 2026-08-20 16:44:26 +02:00
libs refactor: module de santé partagé, supervision complète, endpoints morts traités 2026-08-22 14:41:59 +02:00
scripts perf(tests): porte de qualité 17 s → 6 s, mutation complète 5 min → 3 min 40 2026-08-18 13:49:54 +02:00
.gitignore feat(admin): refonte du panneau par intention, vue Localisations, tests e2e 2026-08-18 15:05:29 +02:00
docker-compose.dev.yml refactor: module de santé partagé, supervision complète, endpoints morts traités 2026-08-22 14:41:59 +02:00
docker-compose.test.yml feat: intégration SQL sur PostgreSQL réel + boutons de crawl conscients du crawler 2026-08-18 20:53:35 +02:00
docker-compose.yml refactor: module de santé partagé, supervision complète, endpoints morts traités 2026-08-22 14:41:59 +02:00
eslint.config.js fix(lint): course entre ESLint et les fichiers temporaires de Vitest 2026-08-19 16:45:04 +02:00
jsconfig.json perf(tests): porte de qualité 17 s → 6 s, mutation complète 5 min → 3 min 40 2026-08-18 13:49:54 +02:00
package-lock.json perf(api): compression des réponses, et troncature de la carte enfin signalée 2026-08-22 14:35:12 +02:00
package.json fix: sync du point principal + verrou de migration, redis mort retiré, tests par propriétés 2026-08-18 21:03:17 +02:00
playwright.config.js feat(admin): refonte du panneau par intention, vue Localisations, tests e2e 2026-08-18 15:05:29 +02:00
pyproject.toml test: propriétés généralisées, scraper HTML et couche réseau couverts 2026-08-18 22:09:37 +02:00
README-CI.md feat: intégration SQL sur PostgreSQL réel + boutons de crawl conscients du crawler 2026-08-18 20:53:35 +02:00
README.md docs: décrire les services et la porte de qualité 2026-08-20 16:44:26 +02:00
requirements-dev.txt test: couvrir adminAuth, réparer la CI Python et une couverture annoncée à tort 2026-08-22 14:49:04 +02:00
stryker.config.json feat(qualité): outillage de test complet, CI locale, annulation réelle des runs 2026-08-18 10:05:40 +02:00
stryker.full.config.json fix(admin): passe de debug guidée par la mutation — 4 bugs, mutation 64 → 68 % 2026-08-18 15:42:52 +02:00
vitest.config.js feat: intégration SQL sur PostgreSQL réel + boutons de crawl conscients du crawler 2026-08-18 20:53:35 +02:00
vitest.integration.config.js feat: intégration SQL sur PostgreSQL réel + boutons de crawl conscients du crawler 2026-08-18 20:53:35 +02:00
vitest.mutation.config.js perf(tests): porte de qualité 17 s → 6 s, mutation complète 5 min → 3 min 40 2026-08-18 13:49:54 +02:00
vitest.mutation.full.config.js perf(tests): porte de qualité 17 s → 6 s, mutation complète 5 min → 3 min 40 2026-08-18 13:49:54 +02:00

Stack metalfrom.eu

Carte des groupes de metal européens, données issues de Metal Archives (avec accord du propriétaire du site source).

Services

Service Rôle
web Site public (carte Leaflet)
admin Back-office (nginx + reverse-proxy vers l'API)
api API Fastify (public + routes admin), migrations DB
crawler Scraping incrémental/complet de Metal Archives via FlareSolverr
flaresolverr Contournement Cloudflare (Chrome headless) pour le crawler
geocoder-enqueue Peuple band_locations depuis bands.location_text
geocoder-worker Géocodage Geoapify
groq-worker Désambiguïsation LLM (Groq) des lieux non géocodés

crawler et flaresolverr ne tournent qu'en dev pour l'instant : ils sont absents de docker-compose.yml. La prod partage la même base, alimentée depuis l'environnement de dev.

Déploiement

  • docker-compose.yml : production
  • docker-compose.dev.yml : environnement de dev (branche dev, auto-déployé via webhook Forgejo → Coolify)

Base PostgreSQL + PostGIS gérée séparément par Coolify. Variables d'env : voir infra/.env.example.

Qualité

Le déploiement se déclenche sur webhook à chaque push : rien ne s'interpose entre git push et la mise en ligne. La porte de qualité est donc locale, et doit être installée une fois par clone :

npm install
npm run hooks:install
Commande Portée
npm run check lint + types + tests JS + ruff + pytest (~6 s)
npm run test:e2e parcours Playwright du dashboard admin (~22 s)
npm run test:integration:full SQL validé contre un vrai PostgreSQL+PostGIS (exige Docker)
npm run check:full tout ci-dessus + mutation + audits de dépendances

Le hook pre-push lance check puis test:e2e. .forgejo/workflows/ci.yml existe mais reste inerte tant qu'aucun runner Forgejo n'est enregistré.

Outillage Python de test : pip install -r requirements-dev.txt.