97 lines
2.6 KiB
Python
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
|