Agent utilisateur pour Gitea, messages d'erreur exploitables
build / Images Harbor (catalog-sync, Dockerfile.catalog-sync) (push) Successful in 9m45s
build / Garde-fou (push) Successful in 10m22s
build / Images Harbor (web, Dockerfile) (push) Successful in 13m6s

This commit is contained in:
hcornet committed 2026-09-11 12:50:27 +02:00
1 parent c411f2933d
commit 8559aca4d7
11 files changed
+338 -25

No files matched your search

+18
View File
@@ -90,6 +90,24 @@ if (erreurs.length === 0) {
}
}
// Les notifications doivent s'afficher, avec leur type.
try {
window.eval("notifier('essai de reussite', 'succes'); notifier('essai d erreur', 'erreur');");
const zone = document.getElementById('notifications');
if (!zone || zone.children.length !== 2) {
erreurs.push('les notifications ne s\'affichent pas');
} else {
const types = [...zone.children].map((n) => n.className);
if (!types.some((c) => c.includes('succes')) || !types.some((c) => c.includes('erreur'))) {
erreurs.push('les notifications ne portent pas leur type : ' + types.join(', '));
}
const fermeture = zone.firstElementChild.querySelector('.notif-fermer');
if (!fermeture) erreurs.push('une notification n\'est pas refermable');
}
} catch (erreur) {
erreurs.push('notifications : ' + erreur.message);
}
// Et les boutons de la barre d'outils ne doivent pas lever d'exception.
for (const identifiant of ['btn-pack', 'btn-generer', 'btn-vider']) {
const bouton = document.getElementById(identifiant);
+60
View File
@@ -460,3 +460,63 @@ def test_les_deux_routes_de_sante(app):
assert reference.status_code == 200
assert ancienne.status_code == 200
assert reference.get_json()["statut"] == ancienne.get_json()["statut"] == "ok"
@pytest.mark.parametrize(
"yaml_partiel, attendu",
[
("id: app-essai\nname: Essai\ncategory: application\n", "modele d'hote"),
("id: app-essai\ncategory: application\nhost_template: {name: X}\n", "nom lisible"),
(
"id: app-essai\nname: Essai\ncategory: application\nhost_template: {name: X}\n",
"au moins une sonde",
),
],
)
def test_messages_de_soumission_explicites(yaml_partiel, attendu):
"""Un contributeur doit lire ce qui manque, pas le nom d'une cle Python."""
from enclume.routes_donnees import valider_pack
_, problemes = valider_pack(yaml_partiel)
assert any(attendu in probleme for probleme in problemes), problemes
def test_les_ressources_statiques_portent_la_version(app):
"""Sans version dans l'URL, un visiteur garde l'ancien script apres mise a jour."""
import re
html = app.test_client().get("/editeur").data.decode()
scripts = re.findall(r'src="(/static/[^"]+)"', html)
assert scripts
assert all("v=" in script for script in scripts), scripts
def test_appel_gitea_porte_un_agent_utilisateur(monkeypatch):
"""Sans agent explicite, urllib s'annonce comme Python-urllib, souvent filtre."""
import urllib.request
import enclume.gitea as gitea
monkeypatch.setattr(gitea.Config, "GITEA_URL", "https://gitea.example")
monkeypatch.setattr(gitea.Config, "GITEA_TOKEN", "jeton")
vues = {}
class FausseReponse:
def read(self):
return b"{}"
def __enter__(self):
return self
def __exit__(self, *args):
return False
def faux_urlopen(requete, **_options):
vues["entetes"] = dict(requete.header_items())
return FausseReponse()
monkeypatch.setattr(urllib.request, "urlopen", faux_urlopen)
gitea._appel("GET", "/repos/essai/essai")
agent = vues["entetes"].get("User-agent", "")
assert agent.startswith("Enclume/"), vues["entetes"]