mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
write to excel file 🟥
This commit is contained in:
parent
7904eca1fa
commit
0b301c4473
2 changed files with 128 additions and 0 deletions
5
backend/ecmk_fetcher/excel_writer.py
Normal file
5
backend/ecmk_fetcher/excel_writer.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def write_row(file_path: str, row_data: dict[str, Any]) -> None:
|
||||||
|
raise NotImplementedError
|
||||||
123
backend/ecmk_fetcher/tests/test_excel_writer.py
Normal file
123
backend/ecmk_fetcher/tests/test_excel_writer.py
Normal 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,
|
||||||
|
]
|
||||||
Loading…
Add table
Reference in a new issue