"""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, render_content_align 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": '">'} style = render_box_style({"padding": '">', "border": border}) assert "