orquestador/specs/ACCEPTANCE.md

4.4 KiB
Raw Permalink Blame History

Verificación integral T16

La fuente ejecutable es acceptance-cases.json. Cada caso A01–A20 referencia métodos de prueba concretos. El checker exige ejecuciones reales en XML Surefire/Failsafe, rechaza cualquier fallo/error/skip y rechaza métodos faltantes. No considera suficiente que exista el código fuente de una prueba.

Ejecución con Docker/Testcontainers (criterio de cierre)

Requiere JDK 21, Python 3 y motor Docker operativo:

docker info
sh ./mvnw --batch-mode --no-transfer-progress clean verify
python3 scripts/verify_acceptance.py --require-testcontainers

Windows: usar mvnw.cmd y python. La suite crea contenedores PostgreSQL 9.6.24 temporales, JWT/JWKS locales, proveedores HTTP loopback y procesos JVM exclusivos de pruebas. No necesita PostgreSQL productivo ni Keycloak real. Failsafe no omite tests si Docker falta: falla. CI ubuntu-24.04 ejecuta estas mismas puertas, limita el job a 30 min y conserva reportes/manifest por 30 días incluso al fallar Maven. Una configuración de CI guardada no demuestra que el job remoto ya se ejecutó.

Verificación alternativa con PostgreSQL de pruebas

# Definir MIGRATION_TEST_DB_URL/USER/PASSWORD en el entorno del proceso.
# URL permitida por los fixtures: jdbc:postgresql://HOST:PORT/orquestador_test
./mvnw.cmd --batch-mode --no-transfer-progress clean verify -Pmigration-tests-external
python scripts/verify_acceptance.py

Usa esquemas/roles temporales propios y los elimina al finalizar. Nunca usar una base de runtime. Los secretos no se escriben en reportes de aceptación. El checker infiere external-postgresql de las propiedades reales de Failsafe; si se agrega --require-testcontainers a esta evidencia, devuelve error. La corrida alternativa verifica comportamiento SQL/HTTP/JVM, pero no satisface por sí sola el requisito de reproducibilidad Docker de T16.

Ejecutar siempre clean verify antes del checker: no combinar reportes de corridas parciales anteriores. acceptance-report.json guarda los casos, métodos/parametrizaciones ejecutadas, totales, entorno y hashes de manifest/JAR. Archivar XML y reporte juntos. El checker tiene pruebas propias: python -m unittest discover -s scripts -p 'test_*.py'.

Cobertura

Caso Evidencia principal
A01 DemoFlowsIT.creditBoundaries: cliente encontrado, persistencia y recorrido
A02 DemoFlowsIT.missingCustomerRemainsCreatedAndCanBeRetried: SUCCEEDED/CLIENTE_NO_ENCONTRADO
A03 DemoFlowsIT.customerApiFailureRetriesAndNeverBecomesCustomerNotFound: mock 503, tres intentos, FAILED
A04 DemoFlowsIT.creditBoundaries + DecisionEvaluatorTest: 71/70/61/60 y decimales
A05 DemoFlowsIT.invalidProviderScoreNeverDefaultsToManualReview
A06 DecisionEvaluatorTest UNIQUE + FlowSimulationTest.ambiguousDraftDecisionIsNotConvertedIntoDefault
A07 DemoFlowsIT.repeatedEventHasOneExecutionAndOneProviderCallEvenAfterCompletion
A08 EventAcceptanceIT.concurrentDifferentPayloadsConflictAndNumericCanonicalReplayIsStable
A09 EventAcceptanceIT.concurrentIdenticalAndDifferentKeysHaveOneAcceptance
A10 DemoFlowsIT.existingCreditKeepsV1WhileNewCreditRequiresLicense
A11 DocumentTasksIT: INVALID, documento ajeno/no conforme y referencia no reasignable
A12 RetryReconciliationIT: caídas reales de JVM; WorkerIT: checkpoint durable
A13 RetryReconciliationIT + WorkerIT: clave externa estable o conciliación
A14 WorkerIT: SKIP LOCKED, renovación y fencing de worker obsoleto
A15 EventAcceptanceIT, ObservabilityIT, SimulationIT: roles/ámbitos/propiedad
A16 FlowPublicationIT.databaseAndApplicationBothPreventPublishedMutation
A17 FlowPublicationIT: activación/retiro/asignación concurrentes
A18 DemoFlowTest y DemoFlowsIT: v1/v2 con mismo motor/binario; licencia en JSON/perfil
A19 WorkerIT y RetryReconciliationIT: rollback auditado y recuperación
A20 DocumentTasksIT.clientCannotSubmitProviderFieldsOrReplaceMetadata

Las carreras usan barreras/latches y bloqueos DB; los retries adelantan next_attempt_at en el esquema de pruebas sin esperar backoff real. CrashWorkerProcess usa Runtime.halt en JVM hija; el padre reconstruye el worker desde PostgreSQL. No es una prueba de reinicio de contenedor ni una garantía de exactly-once de un proveedor real.

Pendiente histórico de T07 cerrado en implementación: simulación. T17 conserva empaquetado/demo desde checkout limpio y verificación de imagen Docker.