"""Tests for the Deliverable Summary parser.""" from __future__ import annotations from app.services.deliverable_parse import parse def test_filters_d_rows_only(): csv = ( "Component,Project Number,Project Status,Deliverable Number,Deliverable Status," "Project Type (from OMG),Deliverable Start Date,Deliverable End Date," "Project Start Date,Project End Date,Brand,Business Division," "Business Area - Lv 2,Market,Deliverable Title\n" "B,PRJ-1,PROGRESS,BR-1,APPROVED,BANNER PUSH,01/05/2026,02/05/2026," "01/04/2026,30/06/2026,LOR,Global,UK,UK,Brief desc\n" "D,PRJ-1,PROGRESS,DEL-1,APPROVED,BANNER PUSH,01/05/2026,02/05/2026," "01/04/2026,30/06/2026,LOR,Global,UK,UK,First asset\n" "D,PRJ-1,PROGRESS,DEL-2,APPROVED,BANNER PUSH,03/05/2026,04/05/2026," "01/04/2026,30/06/2026,LOR,Global,UK,UK,Second asset\n" ).encode("utf-8") out = parse("deliv.csv", csv) rows = out["rows"] assert len(rows) == 2 assert all(r["projectNumber"] == "PRJ-1" for r in rows) # Dates ISO-formatted. assert rows[0]["deliverableStartDate"] == "2026-05-01" assert rows[0]["projectStartDate"] == "2026-04-01" assert rows[0]["projectStatus"] == "PROGRESS" assert rows[0]["deliverableStatus"] == "APPROVED" assert out["content_hash"].startswith("sha256:") def test_skips_rows_missing_deliverable_dates(): csv = ( "Component,Project Number,Deliverable Status,Project Status,Project Type," "Deliverable Start Date,Deliverable End Date,Project Start Date,Project End Date," "Brand,Business Division,Market,Deliverable Title,Deliverable Number,Business Area - Lv 2\n" "D,PRJ-A,APPROVED,PROGRESS,T,,,2026-01-01,2026-12-31,B,Glob,UK,Title,D-1,UK\n" "D,PRJ-B,APPROVED,PROGRESS,T,2026-05-01,2026-05-31,2026-01-01,2026-12-31,B,Glob,UK,Title,D-2,UK\n" ).encode("utf-8") out = parse("d.csv", csv) assert len(out["rows"]) == 1 assert out["rows"][0]["projectNumber"] == "PRJ-B" def test_unrecognised_columns_surface(): csv = ( "Component,Project Number,Deliverable Start Date,Deliverable End Date," "Wibble Factor\n" "D,PRJ-X,2026-05-01,2026-05-15,42\n" ).encode("utf-8") out = parse("u.csv", csv) assert "Wibble Factor" in out["unrecognised_columns"] def test_brand_defaults_to_unknown(): csv = ( "Component,Project Number,Deliverable Start Date,Deliverable End Date\n" "D,PRJ-Z,2026-05-01,2026-05-15\n" ).encode("utf-8") out = parse("d.csv", csv) assert out["rows"][0]["brand"] == "Unknown" assert out["rows"][0]["businessDivision"] == "Unknown" assert out["rows"][0]["market"] == "Unknown" assert out["rows"][0]["projectStatus"] == "" def test_content_hash_stable(): csv = ( "Component,Project Number,Deliverable Start Date,Deliverable End Date\n" "D,PRJ-Z,2026-05-01,2026-05-15\n" ).encode("utf-8") a = parse("a.csv", csv) b = parse("b.csv", csv) assert a["content_hash"] == b["content_hash"]