Saltar a contenido

Spec — La cola de Publisher: class-admin.php (segunda pasada)

Estado: planificada, no ejecutada. Es el siguiente trabajo después de la primera pasada, que bajó la clase de 2.817 a 1.650 líneas.

1. Lo que queda dentro, medido

22 métodos con queue en el nombre, 808 líneas. Se parten en dos grupos que casi no se hablan:

Grupo A — vistas (12 métodos, 456 líneas)

Método Líneas Llama a
render_queue_tab 103 las nueve siguientes
render_queue_table 63 —
render_queue_list 52 render_queue_table
render_queue_stuck 47 render_stuck_table
render_queue_grid 44 queue_entry_html
queue_by_day 39 —
queue_entry_html 34 —
queue_url 26 queue_week_start
render_queue_week 18 queue_by_day, queue_week_start, render_queue_grid
render_queue_month 15 queue_by_day, render_queue_grid
queue_month_name 10 —
queue_week_start 5 —

Más render_stuck_table (31), que solo usan estas vistas. Total: 487 líneas, cerradas entre sí salvo tab_url, que ya vive en Vista_Canales.

Grupo B — escritura (10 métodos, ~321 líneas)

handle_queue_send_stuck (53), handle_queue_reschedule (25), handle_queue_spacing (25), handle_queue_cancel (18), enqueue_assets (48), sanitize_queue_interval (17), y los ayudantes privados queue_move (14), queue_remove (18), queue_parse_when (25).

2. Por qué no se hace de una vez

El grupo A es pintar. El grupo B escribe en la base de datos: reprograma, cancela, mueve y fuerza envíos. Mover escritura sin una prueba por formulario es cambiar dónde está el riesgo, no quitarlo.

3. Trozo A — las vistas a Vista_Cola

  1. Extraer los 13 métodos (487 líneas) a includes/class-vista-cola.php.
  2. En Admin, un delegado render_queue_tab() de una línea.
  3. Reescribir dentro del grupo self::tab_url( → Vista_Canales::tab_url(.

Verificación:

  • make test (477 casos) y CI.
  • Las ocho pantallas del panel, comparadas contra la línea base (antes-2026-11-02.json). La pestaña queue ya está en esa captura: es el juez de este trozo.
  • Si el diff no es vacío y no se puede explicar, se revierte.

4. Trozo B — los manejadores, con red primero

Antes de moverlos, cuatro pruebas de integración, una por formulario:

Formulario Qué debe comprobarse
handle_queue_cancel sin nonce no cambia nada; con nonce y permiso, el envío pasa a cancelado y no se puede reenviar
handle_queue_reschedule fecha válida → reprograma; fecha basura → no toca y avisa; no se puede reprogramar lo ya enviado
handle_queue_spacing cambia el intervalo y respeta los límites permitidos
handle_queue_send_stuck solo actúa sobre un envío atascado; uno reciente no se toca

Con esas cuatro en verde, mover el grupo B a Manejador_Cola es mecánico. Sin ellas, no se mueve.

Lo que se ha medido al intentar escribirlas (2 de noviembre)

Tres pruebas escritas ya (tests/Unit/AdminQueueHandlersTest.php): sin permiso, cancel, spacing, reschedule y send_stuck cortan con wp_die y no tocan la cola. Comprobadas en negativo: al quitar la guarda de handle_queue_cancel, la prueba muere.

Y dos hallazgos que cambian el plan del trozo B:

  1. Los manejadores terminan en exit. Al quitar la guarda, el manejador sigue hasta wp_safe_redirect() + exit y mata la corrida de PHPUnit: no hay fallo limpio, hay proceso muerto. Para probar el camino feliz hay que devolver en vez de salir —un cambio de comportamiento que hay que decidir, no colar en una refactorización.
  2. El doble de check_admin_referer devuelve siempre 1. Una prueba de nonce escrita con el arnés actual no puede fallar: saldría verde y no protegería nada. O se mejora el doble para que respete un nonce declarado, o el control de nonce se verifica de otra forma.

Conclusión honesta: de las cuatro pruebas, hoy son escribibles las de permiso (hechas). Las de efecto necesitan que los manejadores devuelvan un resultado en vez de salir, y eso es una decisión de diseño previa, no un detalle de la mudanza.

5. Criterio de parada

  • class-admin.php por debajo de 1.200 líneas tras el trozo A.
  • Ningún render_* de más de 40 líneas.
  • Los manejadores solo se mueven con las cuatro pruebas de integración escritas y vistas fallar al quitar la comprobación que protegen (no basta con que existan).

6. Lo que NO entra aquí

  • register_settings y los saneadores: siguen en Admin por lo explicado en la primera pasada.
  • El CSS y el JS de la cola: enqueue_assets se queda donde está hasta que haya una razón para tocar los assets.