Files
Forge-Engine/tests/document/test_box_style.py
T
williamandClaude Sonnet 5 6c7675fad0 Audit complet de mise en forme — Titre/Paragraphe (1er élément du tableau)
Nouveau module partagé document_engine/rendering/box_style.py
(padding/margin/background_color/border_radius/border par côté/height/
min-height/max-height/min-width/box-shadow/opacity/align_self) —
réutilisable tel quel par tous les kinds suivants du tableau d'audit.

Titre/Paragraphe gagnent : barré, police de caractère, taille de
police, hauteur de ligne, espacement des lettres, majuscules/
minuscules/capitales, ombre du texte, et tous les attributs de boîte
partagés ci-dessus. Interface entièrement à base de curseurs/cases à
cocher/listes déroulantes/sélecteurs de couleur natifs — plus aucun
champ de texte libre pour une valeur CSS (retour utilisateur).

Deux bugs transversaux corrigés au passage (concernent tout
l'éditeur) :
- Le panneau Propriétés n'était jamais reconstruit après un clic sur un
  bouton (gras/alignement/segments...) — il fallait recharger la page
  pour voir l'état réel. Corrigé dans forgeDocUpdateAttributes, point
  d'entrée unique de toute mise à jour d'attribut.
- Les cases à cocher et curseurs héritaient à tort le style d'un champ
  de texte (padding/bordure/fond/largeur 100%) via la règle générique
  .docField input.

Ajoute docs/plan/AUDIT_MISE_EN_FORME.md : suivi de l'audit élément par
élément (Titre/Paragraphe traité, Image ensuite).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-26 09:25:30 +02:00

79 lines
3.0 KiB
Python

"""Attributs de "boîte" partagés par plusieurs kinds de contenu (voir
document_engine/rendering/box_style.py) — testés une seule fois ici,
indépendamment de chaque kind qui les utilise (voir aussi
test_document_elements.py pour leur usage réel via _render_text)."""
from document_engine.rendering.box_style import BORDER_SIDES, default_border, render_box_style
def test_default_border_has_all_four_sides_set_to_none() -> None:
border = default_border()
assert set(border.keys()) == set(BORDER_SIDES)
for side in BORDER_SIDES:
assert border[side]["style"] == "none"
def test_default_border_returns_a_fresh_dict_each_call() -> None:
"""Jamais un littéral partagé muté par référence entre deux éléments
(même précaution que DEFAULT_QUIZ_CONFIG côté labels)."""
a = default_border()
b = default_border()
a["top"]["style"] = "solid"
assert b["top"]["style"] == "none"
def test_render_box_style_returns_empty_string_for_all_defaults() -> None:
assert render_box_style({}) == ""
assert render_box_style({"border": default_border(), "align_self": "stretch"}) == ""
def test_render_box_style_includes_padding_margin_background_and_radius() -> None:
style = render_box_style(
{"padding": "12px", "margin": "0 auto", "background_color": "#eee", "border_radius": "8px"}
)
assert "padding:12px;" in style
assert "margin:0 auto;" in style
assert "background-color:#eee;" in style
assert "border-radius:8px;" in style
def test_render_box_style_includes_sizing_shadow_and_opacity() -> None:
style = render_box_style(
{
"height": "200px",
"min_height": "100px",
"max_height": "400px",
"min_width": "50px",
"box_shadow": "0 4px 12px rgba(0,0,0,.2)",
"opacity": "0.8",
}
)
assert "height:200px;" in style
assert "min-height:100px;" in style
assert "max-height:400px;" in style
assert "min-width:50px;" in style
assert "box-shadow:0 4px 12px rgba(0,0,0,.2);" in style
assert "opacity:0.8;" in style
def test_render_box_style_includes_align_self_only_when_not_stretch() -> None:
assert "align-self" not in render_box_style({"align_self": "stretch"})
assert "align-self:center;" in render_box_style({"align_self": "center"})
def test_render_box_style_renders_only_sides_with_a_non_none_style() -> None:
border = default_border()
border["top"] = {"style": "solid", "width": "2px", "color": "#ff0000"}
style = render_box_style({"border": border})
assert "border-top:2px solid #ff0000;" in style
assert "border-right" not in style
assert "border-bottom" not in style
assert "border-left" not in style
def test_render_box_style_escapes_malicious_values() -> None:
border = default_border()
border["top"] = {"style": "solid", "width": "1px", "color": '"><script>alert(1)</script>'}
style = render_box_style({"padding": '"><script>alert(2)</script>', "border": border})
assert "<script>" not in style