Files
descarga_factura_transporte/tests/test_horarios.py
T
GeorgeandClaude Sonnet 5.5 1d23e87b9b versión 1.2.2: horarios nocturnos unificados en dos tramos
HORARIOS pasa a 5 bloques que siguen cubriendo las 24 horas: 00:00-06:30 cada
30 minutos (antes 00:00-05:00 cada 60 s y 05:00-06:30 cada 30 min) y
18:30-24:00 cada 60 minutos (antes dos bloques iguales). El día no cambia.
De madrugada un correo puede esperar hasta 30 minutos y los reintentos por
SAP fuera de línea, uno por ciclo, van igual de espaciados.

Se ordena el formato de la lista, test_horarios fija el primer y el último
minuto de cada bloque (y que nunca se devuelva None en el día), y se
actualizan docs/main.md, la guía de despliegue y el CHANGELOG.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 15:36:48 -05:00

47 lines
2.0 KiB
Python

from datetime import datetime
import main
import pipeline_utils
def _intervalo(hora, minuto):
return main.obtener_intervalo(datetime(2026, 10, 22, hora, minuto))
def test_cada_minuto_del_dia_pertenece_a_un_bloque_y_solo_uno():
"""Sin huecos (el demonio dormiría hasta las 06:30) ni solapes."""
for minuto_del_dia in range(24 * 60):
bloques = [b for b in main.HORARIOS if b[0] * 60 + b[1] <= minuto_del_dia < b[2] * 60 + b[3]]
assert len(bloques) == 1, f"{minuto_del_dia // 60:02d}:{minuto_del_dia % 60:02d} -> {len(bloques)} bloques"
assert _intervalo(minuto_del_dia // 60, minuto_del_dia % 60) == (bloques[0][4], bloques[0][5])
def test_los_bloques_estan_ordenados_y_se_encadenan():
fines = [b[2] * 60 + b[3] for b in main.HORARIOS]
inicios = [b[0] * 60 + b[1] for b in main.HORARIOS]
assert inicios[0] == 0 and fines[-1] == 24 * 60
assert inicios[1:] == fines[:-1] # cada bloque empieza donde termina el anterior
def test_los_limites_de_cada_bloque():
"""Primer y último minuto de cada bloque, con su intervalo."""
esperado = [
((0, 0), (1800, "full")), ((6, 29), (1800, "full")), # madrugada
((6, 30), (300, "rapido")), ((13, 14), (300, "rapido")), # mañana
((13, 15), (1800, "full")), ((13, 59), (1800, "full")), # mediodía
((14, 0), (300, "rapido")), ((18, 29), (300, "rapido")), # tarde
((18, 30), (3600, "full")), ((23, 59), (3600, "full")), # noche
]
for (hora, minuto), valor in esperado:
assert _intervalo(hora, minuto) == valor, f"{hora:02d}:{minuto:02d}"
def test_nunca_se_devuelve_none_en_el_dia():
"""``obtener_intervalo`` devuelve None fuera de horario: con los bloques actuales no debe pasar nunca."""
assert all(_intervalo(h, m) is not None for h in range(24) for m in range(60))
def test_la_version_del_proyecto_sale_de_pyproject():
version = pipeline_utils.version_del_proyecto()
assert version != "desconocida" and version.count(".") == 2