import pytest from pathlib import Path from docx import Document from src.core.style_registry import StyleRegistry def test_apply_page_layout_all_margins(): """Тест: все поля заданы.""" yaml_content = """ page: margins: top: 2.0 bottom: 2.0 left: 3.0 right: 1.0 styles: Normal: font: name: "Arial" size: 12 """ yaml_path = Path("tests/fixtures/test_layout_all.yaml") yaml_path.parent.mkdir(exist_ok=True) yaml_path.write_text(yaml_content, encoding="utf-8") doc = Document() style_reg = StyleRegistry(yaml_path) style_reg.apply_page_layout(doc) section = doc.sections[0] assert abs(section.top_margin.cm - 2.0) < 0.01 assert abs(section.bottom_margin.cm - 2.0) < 0.01 assert abs(section.left_margin.cm - 3.0) < 0.01 assert abs(section.right_margin.cm - 1.0) < 0.01 yaml_path.unlink(missing_ok=True) def test_apply_page_layout_partial_margins(): """Тест: заданы не все поля.""" yaml_content = """ page: margins: top: 1.5 left: 2.5 styles: Normal: font: name: "Arial" size: 12 """ yaml_path = Path("tests/fixtures/test_layout_partial.yaml") yaml_path.parent.mkdir(exist_ok=True) yaml_path.write_text(yaml_content, encoding="utf-8") doc = Document() style_reg = StyleRegistry(yaml_path) style_reg.apply_page_layout(doc) section = doc.sections[0] assert abs(section.top_margin.cm - 1.5) < 0.01 assert abs(section.left_margin.cm - 2.5) < 0.01 # Остальные поля не должны измениться (остаются по умолчанию) # У docx по умолчанию: top=2.54, bottom=2.54, left=3.17, right=3.17 # Но мы их не трогаем, если в YAML нет yaml_path.unlink(missing_ok=True) def test_apply_page_layout_no_page_section(): """Тест: в YAML нет секции page.""" yaml_content = """ styles: Normal: font: name: "Arial" size: 12 """ yaml_path = Path("tests/fixtures/test_layout_no_page.yaml") yaml_path.parent.mkdir(exist_ok=True) yaml_path.write_text(yaml_content, encoding="utf-8") doc = Document() style_reg = StyleRegistry(yaml_path) style_reg.apply_page_layout(doc) section = doc.sections[0] # Поля не должны измениться (остаются по умолчанию) # top=2.54 cm по умолчанию assert abs(section.top_margin.cm - 2.54) < 0.01 yaml_path.unlink(missing_ok=True) def test_apply_page_layout_no_margins(): """Тест: в YAML есть page, но нет margins.""" yaml_content = """ page: other_option: value styles: Normal: font: name: "Arial" size: 12 """ yaml_path = Path("tests/fixtures/test_layout_no_margins.yaml") yaml_path.parent.mkdir(exist_ok=True) yaml_path.write_text(yaml_content, encoding="utf-8") doc = Document() style_reg = StyleRegistry(yaml_path) style_reg.apply_page_layout(doc) section = doc.sections[0] # Поля не должны измениться assert abs(section.top_margin.cm - 2.54) < 0.01 yaml_path.unlink(missing_ok=True) def test_apply_page_layout_zero_margins(): """Тест: нулевые поля.""" yaml_content = """ page: margins: top: 0.0 bottom: 0.0 left: 0.0 right: 0.0 styles: Normal: font: name: "Arial" size: 12 """ yaml_path = Path("tests/fixtures/test_layout_zero.yaml") yaml_path.parent.mkdir(exist_ok=True) yaml_path.write_text(yaml_content, encoding="utf-8") doc = Document() style_reg = StyleRegistry(yaml_path) style_reg.apply_page_layout(doc) section = doc.sections[0] assert abs(section.top_margin.cm - 0.0) < 0.01 assert abs(section.bottom_margin.cm - 0.0) < 0.01 assert abs(section.left_margin.cm - 0.0) < 0.01 assert abs(section.right_margin.cm - 0.0) < 0.01 yaml_path.unlink(missing_ok=True)