94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from datetime import date
|
|
from decimal import Decimal
|
|
from pathlib import Path
|
|
|
|
from openpyxl import load_workbook
|
|
|
|
from monthly_reports.contracts import (
|
|
ChannelObservation,
|
|
DailyVersionPin,
|
|
MonthlyFact,
|
|
MonthlySnapshot,
|
|
)
|
|
from monthly_reports.core import build_monthly_report
|
|
from monthly_reports.publishing import OpenpyxlWorkbookBuilder
|
|
|
|
|
|
def report_fixture():
|
|
source = MonthlyFact(
|
|
daily_record_id=1,
|
|
daily_version_id=100,
|
|
business_date=date(2026, 7, 8),
|
|
channel_key="QBD",
|
|
arrival=date(2026, 7, 8),
|
|
departure=date(2026, 7, 10),
|
|
nights=2,
|
|
adults=2,
|
|
children=0,
|
|
block_code="=SYN-FORMULA-LIKE",
|
|
no_of_rooms=1,
|
|
company_name="SYN-COMPANY",
|
|
confirmation_no="SYN-CONFIRMATION",
|
|
disp_room_no="SYN-ROOM",
|
|
effective_rate_amount=Decimal("450.50"),
|
|
full_name="SYN-GUEST",
|
|
res_comment="SYN-COMMENT",
|
|
trace_text="",
|
|
products="",
|
|
rate_code="SYN-RATE",
|
|
room_category_label="SYN-TYPE",
|
|
real_price=Decimal("450.50"),
|
|
total_price=Decimal("901.00"),
|
|
kb_amount=None,
|
|
)
|
|
return build_monthly_report(
|
|
2026,
|
|
7,
|
|
date(2026, 7, 8),
|
|
MonthlySnapshot(
|
|
(source,),
|
|
(DailyVersionPin(date(2026, 7, 8), 100),),
|
|
(ChannelObservation(date(2026, 7, 8), 100, "QBD", 1, 1),),
|
|
),
|
|
)
|
|
|
|
|
|
class MonthlyReportsXlsxTests(unittest.TestCase):
|
|
def test_openpyxl_builder_reopens_checks_formulas_and_semantic_identity(self):
|
|
report = report_fixture()
|
|
with tempfile.TemporaryDirectory(prefix="monthly-report-xlsx-") as temp_dir:
|
|
built = OpenpyxlWorkbookBuilder().build(report, Path(temp_dir))
|
|
|
|
self.assertTrue(built.path.is_file())
|
|
self.assertEqual(built.path.stat().st_mode & 0o777, 0o600)
|
|
self.assertEqual(built.summary["sheet_names"][:5], [
|
|
"LIANTAI-GROUP", "LIANTAI-FIT", "QBD", "DY-AI-Easy-KB", "FENGRUN"
|
|
])
|
|
self.assertEqual(built.summary["row_counts"], [0, 0, 1, 0, 0])
|
|
self.assertEqual(built.summary["formula_count"], 1)
|
|
self.assertEqual(built.summary["preview_count"], 5)
|
|
self.assertEqual(len(built.summary["semantic_sha256"]), 64)
|
|
|
|
workbook = load_workbook(built.path, data_only=False, read_only=True)
|
|
try:
|
|
self.assertEqual(workbook["QBD"]["S2"].value, "=R2*C2*G2")
|
|
self.assertEqual(workbook["QBD"]["F2"].value, "'=SYN-FORMULA-LIKE")
|
|
formulas = [
|
|
cell.value
|
|
for sheet in workbook.worksheets
|
|
for row in sheet.iter_rows()
|
|
for cell in row
|
|
if cell.data_type == "f"
|
|
]
|
|
self.assertEqual(formulas, ["=R2*C2*G2"])
|
|
finally:
|
|
workbook.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|