DFiP_Budget_planing/api/tests/unit/test_export_writers.py
2026-05-25 17:31:29 +03:00

61 lines
1.7 KiB
Python

from unittest.mock import AsyncMock
from openpyxl import Workbook
from src.services.export_service import ExportService
from src.services.export_writers import (
FORM1_FLAT_COLUMNS,
SMETA_COLUMNS,
TabularSheetWriter,
)
def test_tabular_sheet_writer_writes_headers_and_rows():
writer = TabularSheetWriter(
columns=[("a", "A"), ("b", "B")],
row_normalizer=lambda row: row,
value_serializer=lambda value: value,
)
wb = Workbook()
ws = wb.active
rows = [(None, None, None, {"a": 1, "b": 2})]
writer.write(ws, rows)
assert ws.cell(row=1, column=1).value == "A"
assert ws.cell(row=1, column=2).value == "B"
assert ws.cell(row=2, column=1).value == 1
assert ws.cell(row=2, column=2).value == 2
def test_sheet_column_contracts_are_stable():
assert len(FORM1_FLAT_COLUMNS) == 17
assert len(SMETA_COLUMNS) == 41
assert FORM1_FLAT_COLUMNS[0] == ("section", "Код раздела")
assert SMETA_COLUMNS[0] == ("section_code", "Код раздела")
def test_export_service_uses_sheet_writer_strategy():
service = ExportService(AsyncMock())
class Recorder:
def __init__(self):
self.calls = 0
def write(self, worksheet, rows):
self.calls += 1
worksheet.append(["ok"])
default_writer = Recorder()
smeta_writer = Recorder()
service.sheet_writers = {"__default__": default_writer, "SMETA": smeta_writer}
wb = Workbook()
ws_default = wb.active
ws_smeta = wb.create_sheet("smeta")
service._write_sheet_rows(ws_default, [], "AHR")
service._write_sheet_rows(ws_smeta, [], "SMETA")
assert default_writer.calls == 1
assert smeta_writer.calls == 1