diff --git a/tests/infrastructure/xlsx/test_scenario_export_workbook.py b/tests/infrastructure/xlsx/test_scenario_export_workbook.py index d1dfaa79c..4bf13859e 100644 --- a/tests/infrastructure/xlsx/test_scenario_export_workbook.py +++ b/tests/infrastructure/xlsx/test_scenario_export_workbook.py @@ -28,3 +28,23 @@ def test_renders_a_sheet_named_for_the_scenario_with_headers_then_rows() -> None worksheet = workbook["Fabric first"] assert [cell.value for cell in worksheet[1]] == ["property_id", "loft_insulation"] assert [cell.value for cell in worksheet[2]] == [1, 1200.0] + + +def test_sanitises_and_deduplicates_scenario_sheet_names() -> None: + # arrange — a name over Excel's 31-char limit (used twice, so it must be + # deduplicated) and one with characters Excel forbids in a sheet title. + empty = ExportSheet(columns=("property_id",), rows=()) + long_name = "A really long scenario name that exceeds Excel's limit" + illegal_name = "Bad:/\\?*[]name" + + # act + data = render_workbook( + [(long_name, empty), (long_name, empty), (illegal_name, empty)] + ) + + # assert — three distinct, Excel-legal sheet names. + names = load_workbook(BytesIO(data)).sheetnames + assert len(names) == 3 + assert len(set(names)) == 3 + assert all(len(name) <= 31 for name in names) + assert not any(ch in name for name in names for ch in r":/\?*[]")