145 lines
3.9 KiB
Python
145 lines
3.9 KiB
Python
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) |