From d44ae049f3f9117c19bd80c80e77faee263258e7 Mon Sep 17 00:00:00 2001 From: KoreX Labs Date: Mon, 14 Sep 2026 00:04:01 -0300 Subject: [PATCH] test(android): align 0.19.1 release contract and record field review --- android-app/REVIEW_0_19_1.md | 49 ++++++++++++++++++++ api-v3/test/unit/f5-android-test-cut.test.ts | 4 +- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 android-app/REVIEW_0_19_1.md diff --git a/android-app/REVIEW_0_19_1.md b/android-app/REVIEW_0_19_1.md new file mode 100644 index 0000000..d06c81e --- /dev/null +++ b/android-app/REVIEW_0_19_1.md @@ -0,0 +1,49 @@ +# DH Android 0.19.1 · revisión de candidata + +## Idea funcional verificada contra código y API + +La app es la herramienta del inspector en campo. Oficina administra territorio, operadoras, clasificaciones, campos y catálogo; la APK consulta esas fuentes. Una Inspección contiene varias Actas, con una sola en elaboración simultánea. El Hallazgo pertenece al Acta y al elemento seleccionado. Cerrar contenido lo deja inmutable y pendiente de firma. Firma del inspector y manifestación/firma o negativa de empresa permiten sellar el Acta. La Inspección exige todas sus Actas activas selladas. + +Yacimiento, Instalación y Subinstalación son destinos de Hallazgos. Una Instalación nueva debe crearse dentro de un Yacimiento y una Subinstalación dentro de una Instalación compatible. El inventario nacido en campo necesita GPS y foto antes del Hallazgo. + +## Hallazgos corregidos + +| Problema observado | Corrección | +| --- | --- | +| Cuatro clientes renovaban por separado la misma sesión | Coordinador compartido; protege rotación, logout y cambio de usuario | +| Cortes de red durante refresh borraban la sesión | Sólo una respuesta 401 de la sesión vigente la invalida | +| Operaciones solapadas liberaban ocupado antes de terminar | Conteo de pendientes y rechazo del segundo guardado | +| Respuestas de búsquedas antiguas sobrescribían resultados recientes | Generación de búsqueda y verificación del ID de inspección | +| Un Acta anterior podía persistir al cambiar de inspección | Limpieza de estado de Acta al abrir otra inspección | +| Coordenadas crudas excedían decimales admitidos | Normalización 6 decimales para coordenadas y 3 para precisión | +| Inventario móvil ocultaba Yacimientos | Selección para Hallazgos y alta de Instalación dentro de Yacimiento | +| Alta de Instalación podía adoptar otro tipo por fallback | Eliminado; pide elegir el Yacimiento padre correcto | +| Datos técnicos por familia no estaban editables | Formulario conectado a technical-values; mismos campos de oficina | +| Fallos de GPS/permisos en evidencia sin mensaje | Error visible y accionable | +| Barras del sistema/teclado podían tapar controles | Insets de sistema y teclado en la raíz | + +## Evidencia automática + +25 pruebas Android: 8 contratos existentes y 17 pruebas nuevas de comportamiento (sesión 7, concurrencia 3, GPS 3, campos técnicos 4). Lint debug/release y compilación debug/release en workflow Android. CI general comprueba API, WEB, scripts y migraciones; la auditoría de dependencias se ejecuta separadamente. Consultar las ejecuciones del SHA de la entrega, no sólo un resultado anterior. + +## Límites de esta candidata + +- Requiere conexión. No existe cola persistente offline ni resolución de conflictos sin señal. +- Un timeout de escritura puede ocurrir después de guardar en servidor. Revisar el registro antes de repetir; no se afirma idempotencia general de todas las escrituras. +- Los datos técnicos por familia se completan en un paso separado tras seleccionar/crear el elemento. GPS/foto continúa siendo la barrera de Hallazgos del servidor. +- No se ejecutó aceptación en tablet física: quedan por comprobar cámara, GPS, biometría, rotación/recreación de actividad, firmas y actualización sobre la APK instalada. +- La release compila sin firma. Se requiere la clave histórica y su certificado de referencia para distribuir una actualización productiva. No crear otra clave como sustituto. +- La candidata debug usa com.korexlabs.dhinspeccion.debug y no reemplaza la app productiva. La compatibilidad con una debug anterior depende también de su certificado; no desinstalar una app con información pendiente sin revisar antes. + +## Recorrido de aceptación en tablet + +1. Ingresar con inspector y cargar inspecciones asignadas. +2. Iniciar una inspección, crear Acta, seleccionar Yacimiento/Instalación/Subinstalación. +3. Crear Instalación bajo Yacimiento y Subinstalación compatible; probar GPS permitido/denegado y foto tomada/cancelada. +4. Completar campos técnicos requeridos, incluyendo No booleano, decimal con coma, fecha y opción de lista; volver a abrir para comprobar persistencia. +5. Crear Hallazgo catalogado y OTROS, adjuntar evidencia. +6. Cerrar contenido, comprobar inmutabilidad y estado Pendiente de firma. +7. Registrar firmas o negativa de empresa; sellar Acta. +8. Crear otra Acta, comprobar que una pendiente impide cerrar la Inspección; completar y cerrar. +9. Cortar conexión y recuperarla: errores visibles, sin pérdida de sesión por red ni falso aviso de guardado. +10. Verificar en Dashboard los mismos registros y documentos. diff --git a/api-v3/test/unit/f5-android-test-cut.test.ts b/api-v3/test/unit/f5-android-test-cut.test.ts index 892fd9f..1fec29b 100644 --- a/api-v3/test/unit/f5-android-test-cut.test.ts +++ b/api-v3/test/unit/f5-android-test-cut.test.ts @@ -10,8 +10,8 @@ function mountedRepoFile(path: string): string { test('F6.3 Android test cut targets production API and has a distinct installable debug version', () => { const gradle = mountedRepoFile('android-app/app/build.gradle.kts'); - assert.match(gradle, /versionCode = 28/); - assert.match(gradle, /versionName = "0\.19\.0"/); + assert.match(gradle, /versionCode = 29/); + assert.match(gradle, /versionName = "0\.19\.1"/); assert.match(gradle, /https:\/\/dhv2\.korexlabs\.com\/api\/v3\//); assert.match(gradle, /applicationIdSuffix = "\.debug"/); });