write to excel file 🟥

This commit is contained in:
Daniel Roth 2026-04-15 08:35:03 +00:00
parent 7904eca1fa
commit 0b301c4473
2 changed files with 128 additions and 0 deletions

View file

@ -0,0 +1,5 @@
from typing import Any
def write_row(file_path: str, row_data: dict[str, Any]) -> None:
raise NotImplementedError

View file

@ -0,0 +1,123 @@
import os
import pathlib
import pytest
from openpyxl import load_workbook
from openpyxl.worksheet.worksheet import Worksheet
from backend.ecmk_fetcher.excel_writer import write_row
@pytest.fixture
def xlsx_path(tmp_path: pathlib.Path) -> str:
return str(tmp_path / "output.xlsx")
def _active_sheet(file_path: str) -> Worksheet:
ws = load_workbook(file_path).active
assert isinstance(ws, Worksheet)
return ws
def test_write_row_creates_file(xlsx_path: str):
# arrange
row = {
"address": "1 Fake Avenue, AB24 5CD",
"property_type": "House",
"main_dwelling_floor_1_area_m2": 43.61,
}
# act
write_row(xlsx_path, row)
# assert
assert os.path.exists(xlsx_path)
ws = _active_sheet(xlsx_path)
assert [c.value for c in ws[1]] == list(row.keys())
assert [c.value for c in ws[2]] == list(row.values())
def test_write_row_appends_to_existing(xlsx_path: str):
# arrange
row_a = {
"address": "1 Fake Avenue, AB24 5CD",
"property_type": "House",
"main_dwelling_floor_1_area_m2": 43.61,
}
row_b = {
"address": "2 Other Street, XY1 2AB",
"property_type": "Flat",
"main_dwelling_floor_1_area_m2": 30.0,
}
# act
write_row(xlsx_path, row_a)
write_row(xlsx_path, row_b)
# assert
ws = _active_sheet(xlsx_path)
assert ws.max_row == 3 # 1 header + 2 data rows
assert [c.value for c in ws[1]] == list(row_a.keys())
assert [c.value for c in ws[2]] == list(row_a.values())
assert [c.value for c in ws[3]] == list(row_b.values())
def test_write_row_inserts_new_columns_at_logical_positions(xlsx_path: str):
# arrange
# First row: main_dwelling floor 1 + roof
# Second row: also has main_dwelling floor 2 — should be inserted between floor 1 and roof,
# not appended to the end
row_a = {
"address": "1 Fake Avenue, AB24 5CD",
"property_type": "House",
"main_dwelling_floor_1_area_m2": 43.61,
"main_dwelling_floor_1_height_m": 2.46,
"main_dwelling_roof_construction": 4,
}
row_b = {
"address": "2 Other Street, XY1 2AB",
"property_type": "House",
"main_dwelling_floor_1_area_m2": 50.0,
"main_dwelling_floor_1_height_m": 2.5,
"main_dwelling_floor_2_area_m2": 48.0,
"main_dwelling_floor_2_height_m": 2.4,
"main_dwelling_roof_construction": 4,
}
# act
write_row(xlsx_path, row_a)
write_row(xlsx_path, row_b)
# assert
ws = _active_sheet(xlsx_path)
assert [c.value for c in ws[1]] == [
"address",
"property_type",
"main_dwelling_floor_1_area_m2",
"main_dwelling_floor_1_height_m",
"main_dwelling_floor_2_area_m2", # inserted before roof, not at end
"main_dwelling_floor_2_height_m",
"main_dwelling_roof_construction",
]
# row_a had no floor_2 data — those cells should be empty
assert [c.value for c in ws[2]] == [
"1 Fake Avenue, AB24 5CD",
"House",
43.61,
2.46,
None, # main_dwelling_floor_2_area_m2
None, # main_dwelling_floor_2_height_m
4,
]
# row_b should be fully populated
assert [c.value for c in ws[3]] == [
"2 Other Street, XY1 2AB",
"House",
50.0,
2.5,
48.0,
2.4,
4,
]