Files
IPSExtractor/services/bot_digitador/tests/test_csv_split.py
T

97 lines
2.6 KiB
Python

"""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