"""Tests de parseo/partición CSV para digitador.""" from __future__ import annotations import pytest from domain.csv_split import ( REQUIRED_BOT_COLUMNS, parse_digitador_rows, rows_to_csv_bytes, split_rows, ) def _it_csv_bytes() -> bytes: header = "|".join( [ "RADICADO", "NUMERO", "FECHA", "BRUTO", "AUTORIZACION", "TIPO_ID", "SERVICIO", "COPAGO", "MODERADORA", ] ) row = "|".join( ["R-1", "123", "2024-01-01", "1000", "A-9", "CC", "AMB", "0", "4500"] ) return f"{header}\n{row}\n".encode("utf-8-sig") def _snake_csv_bytes() -> bytes: header = "|".join(REQUIRED_BOT_COLUMNS) row = "|".join( ["R-2", "999", "2024-02-02", "2000", "A-1", "TI", "HOS", "100", "0"] ) return f"{header}\n{row}\n".encode("utf-8") def test_it_to_bot_mapping(): rows = parse_digitador_rows(_it_csv_bytes(), "aptos.csv") assert len(rows) == 1 assert rows[0]["radicado"] == "R-1" assert rows[0]["documento"] == "123" assert rows[0]["ingreso"] == "2024-01-01" assert rows[0]["total_cargos"] == "1000" assert rows[0]["autorizacion"] == "A-9" assert rows[0]["tipo_documento"] == "CC" assert rows[0]["tipo_servicio"] == "AMB" assert rows[0]["copago"] == "0" assert rows[0]["cuota_moderadora"] == "4500" def test_snake_case_headers(): rows = parse_digitador_rows(_snake_csv_bytes(), "input.csv") assert len(rows) == 1 assert rows[0]["radicado"] == "R-2" assert rows[0]["documento"] == "999" def test_missing_columns_raises(): bad = b"RADICADO|NUMERO\nR1|1\n" with pytest.raises(ValueError) as exc: parse_digitador_rows(bad, "bad.csv") assert "Columnas faltantes" in str(exc.value) def test_split_rows_balanced(): rows = [{"radicado": str(i)} for i in range(100)] chunks = split_rows(rows, 2) assert len(chunks) == 2 assert len(chunks[0]) == 50 assert len(chunks[1]) == 50 def test_split_rows_uneven(): rows = [{"radicado": str(i)} for i in range(10)] chunks = split_rows(rows, 3) assert len(chunks) == 3 assert sum(len(c) for c in chunks) == 10 assert [len(c) for c in chunks] == [4, 3, 3] def test_roundtrip_csv(): rows = parse_digitador_rows(_it_csv_bytes(), "aptos.csv") data = rows_to_csv_bytes(rows) parsed = parse_digitador_rows(data, "shard.csv") assert parsed == rows def test_split_more_workers_than_rows(): rows = [{"radicado": "A"}, {"radicado": "B"}] chunks = split_rows(rows, 5) assert len(chunks) == 2