import csv import io import zipfile from pipeline.download.gias import _CSV_COLUMNS, transform def _zip_with_rows(rows: list[dict[str, str]]) -> bytes: text = io.StringIO() writer = csv.DictWriter(text, fieldnames=_CSV_COLUMNS) writer.writeheader() for row in rows: writer.writerow({col: row.get(col, "") for col in _CSV_COLUMNS}) buffer = io.BytesIO() with zipfile.ZipFile(buffer, "w") as archive: archive.writestr( "edubasealldata20260611.csv", text.getvalue().encode("cp1252"), ) return buffer.getvalue() def _school(name: str, status: str) -> dict[str, str]: return { "URN": "100000", "EstablishmentName": name, "TypeOfEstablishment (name)": "Community school", "EstablishmentTypeGroup (name)": "Local authority maintained schools", "EstablishmentStatus (name)": status, "PhaseOfEducation (name)": "Primary", "StatutoryLowAge": "4", "StatutoryHighAge": "11", "Easting": "530000", "Northing": "180000", "Postcode": "SW1A 1AA", "Street": "1 School Lane", "Town": "London", "LA (name)": "Westminster", } def test_transform_keeps_open_but_proposed_to_close_schools() -> None: # "Open, but proposed to close" establishments are operating schools (GIAS # can keep the status for years); only closed and proposed-to-open rows are # out of scope for the map. rows = [ _school("Open School", "Open"), _school("Closing School", "Open, but proposed to close"), _school("Closed School", "Closed"), _school("Future School", "Proposed to open"), ] result = transform(_zip_with_rows(rows)) assert sorted(result["name"].to_list()) == ["Closing School", "Open School"]