Aplicación para Android
# Plan de pruebas — XamIoT Android
Versión de la aplicación: v1.2
---
## 1. Autenticación
### TC-AND-AUTH-01 — Conexión válida
Requisitos previos: cuenta existente y activada
Pasos:
1. Abrir la aplicación
2. Introducir un correo electrónico y una contraseña válidos
3. Pulsar «Iniciar sesión»
Resultado esperado: token JWT almacenado mediante TokenManager (SharedPreferences), redirección a MainActivity
---
### TC-AND-AUTH-02 — Inicio de sesión con contraseña incorrecta
Pasos:
1. Introducir un correo electrónico válido + una contraseña incorrecta
2. Pulsar «Iniciar sesión»
Resultado esperado: se muestra un mensaje de error, no se realiza la navegación
---
### TC-AND-AUTH-03 — Persistencia de sesión
Pasos:
1. Iniciar sesión
2. Cerrar la aplicación por completo
3. Volver a abrir la aplicación
Resultado esperado: el usuario sigue conectado, MainActivity se muestra directamente
---
### TC-AND-AUTH-04 — Cierre de sesión
Pasos:
1. Menú → Desconectar
2. Confirmar
Resultado esperado: token eliminado, vuelta a LoginActivity, datos locales borrados
---
### TC-AND-AUTH-05 — Contraseña olvidada
Pasos:
1. Escribir «Contraseña olvidada» en la pantalla de inicio de sesión
2. Introducir el correo electrónico
3. Validar
Resultado esperado: correo electrónico de restablecimiento recibido, mensaje de confirmación mostrado
---
### TC-AND-AUTH-06 — Creación de cuenta
Pasos:
1. Pulsar «Crear una cuenta»
2. Introducir correo electrónico, contraseña (+ confirmación), nombre, apellidos y número de teléfono con prefijo del país
3. Validar
Resultado esperado: se envía un correo electrónico de confirmación y se muestra un mensaje
---
### TC-AND-AUTH-07 — Notificaciones de permisos (Android 13+)
Pasos:
1. Iniciar sesión por primera vez en Android 13+
Resultado esperado: se muestra el cuadro de diálogo del sistema de permisos POST_NOTIFICATIONS mostrado
---
### TC-AND-AUTH-08 — Selector de servidor (huevo de Pascua)
Pasos:
1. En la pantalla de inicio de sesión, pulsa 5 veces sobre el logotipo
2. Cambiar de servidor
Resultado esperado: servidor guardado en SharedPreferences, llamadas a la API en el servidor correcto tras reiniciar
---
## 2. Registro BLE
### TC-AND-BLE-01 — Permisos BLE
Requisitos previos: primer uso
Pasos:
1. Pulsar el botón FAB «+» en MainActivity
Resultado esperado: se muestra el cuadro de diálogo de permisos de Bluetooth y ubicación (BLUETOOTH_SCAN, BLUETOOTH_CONNECT, ACCESS_FINE_LOCATION)
---
### TC-AND-BLE-02 — Escaneo de sensores
Requisitos previos: permisos concedidos, Bluetooth activado, sensor SoundSense alimentado
Pasos:
1. Iniciar el registro
Resultado esperado: el sensor «SOUND-SENSOR-xxx» aparece en el spinner, selección automática del primero encontrado
---
### TC-AND-BLE-03 — Registro completado
Pasos:
1. Seleccionar o dejar que el sistema seleccione automáticamente el sensor
2. Introducir el SSID y la contraseña de la red WiFi
3. Confirmar
4. Esperar a que el estado de la red WiFi sea positivo
5. Introducir un nombre para el sensor
6. Confirmar
Resultado esperado:
- Estados BLE: IDLE → SCANNING → CONNECTING → DISCOVERING → READING_INFO → SENDING_WIFI → WAITING_WIFI → SENDING_MQTT → READY_TO_CREATE → SUCCESS
- Credenciales MQTT (host, puerto, usuario, contraseña) enviadas a través de BLE
- Sensor creado en la API
- Vuelta a MainActivity con el sensor visible
---
### TC-AND-BLE-04 — WiFi incorrecto
Pasos:
1. Introducir un SSID/contraseña de WiFi incorrectos
Resultado esperado: tiempo de espera (15 s), se muestra el estado ERROR, opción de reintentar disponible (canRetry = true)
---
### TC-AND-BLE-05 — Bluetooth desactivado
Pasos:
1. Desactivar el Bluetooth
2. Intentar añadir un sensor
Resultado esperado: cuadro de diálogo del sistema para activar el Bluetooth o mensaje explícito
---
### TC-AND-BLE-06 — Desconexión de BLE durante el registro
Pasos:
1. Iniciar el registro
2. Alejar el sensor durante la fase SENDING_MQTT
Resultado esperado: estado ERROR, mensaje mostrado, no se crea ningún sensor duplicado en la API
---
### TC-AND-BLE-07 — Autoselección desactivada
Pasos:
1. Varios sensores dentro del alcance
2. Tocar el indicador giratorio para seleccionar manualmente
Resultado esperado: selección automática cancelada, el usuario puede elegir manualmente de la lista
---
## 3. Datos del sensor y MQTT
### TC-AND-MQTT-01 — Visualización de la lista de sensores
Requisitos previos: al menos un sensor registrado y conectado a MQTT
Pasos:
1. Abrir MainActivity
Resultado esperado: cada sensor muestra el nombre, el estado de la última alerta y el tiempo transcurrido desde la última actividad
---
### TC-AND-MQTT-02 — Actualización del tiempo transcurrido
Pasos:
1. Observar la lista durante unos segundos
Resultado esperado: los tiempos relativos («hace 2 s», «hace 1 min») se actualizan cada segundo a través del contador de tiempo
---
### TC-AND-MQTT-03 — Actualización automática
Pasos:
1. Activar la actualización automática a través del menú
2. Esperar 10 segundos
Resultado esperado: los datos se recargan automáticamente; el icono del menú indica el estado activo
---
### TC-AND-MQTT-04 — Actualización manual
Pasos:
1. Menú → Actualizar
Resultado esperado: llamada a la API inmediata, lista actualizada
---
### TC-AND-MQTT-05 — Sensor desconectado
Pasos:
1. Apagar un sensor
2. Consultar la lista
Resultado esperado: se muestra el último valor con la hora relativa exacta, sin fallos
---
## 4. Reglas de alerta
### TC-AND-RULES-01 — Creación de una regla a partir de una plantilla
Pasos:
1. Abrir los detalles de un sensor (DeviceDetailActivity)
2. Pulsar «Añadir una regla»
3. Seleccionar una plantilla en RuleCreateBottomSheet
4. Configurar el operador, el umbral (control deslizante + entrada manual), el tiempo de espera y la etiqueta de usuario
5. Activar y guardar
Resultado esperado: regla creada a través de POST /esp-rules, visible en la lista del sensor
---
### TC-AND-RULES-02 — Umbral fuera de límites
Pasos:
1. Crear una regla
2. Intentar superar field_max mediante el stepper o la introducción directa
Resultado esperado: umbral bloqueado en field_min / field_max
---
### TC-AND-RULES-03 — Tiempo de espera inferior al mínimo
Pasos:
1. Intentar introducir un tiempo de espera < cooldown_min_sec
Resultado esperado: tiempo de espera bloqueado en cooldown_min_sec
---
### TC-AND-RULES-04 — Activación/desactivación de una regla
Pasos:
1. En la lista de reglas, cambiar el interruptor
Resultado esperado: PATCH /esp-rules/{id} con «enabled» actualizado, la interfaz de usuario refleja el cambio
---
### TC-AND-RULES-05 — Edición de una regla existente
Pasos:
1. Tocar una regla
2. Modificar el umbral, el tiempo de espera y la etiqueta
3. Guardar
Resultado esperado: cambios guardados mediante PATCH en la API
---
### TC-AND-RULES-06 — Eliminación de una regla
Pasos:
1. Arrastrar la regla hacia la izquierda
2. Confirmar la eliminación
Resultado esperado: DELETE /esp-rules/{id}, regla eliminada de la lista
---
## 5. Gestión de sensores
### TC-AND-DEV-01 — Eliminación de un sensor
Pasos:
1. Arrastra el sensor hacia la izquierda en MainActivity
2. Confirmar la eliminación
Resultado esperado: DELETE /esp-devices/{id}, sensor eliminado de la lista
---
### TC-AND-DEV-02 — Detalles de un sensor
Pasos:
1. Tocar un sensor de la lista
Resultado esperado: DeviceDetailActivity muestra: información del sensor, lista de reglas, historial de alertas
---
### TC-AND-DEV-03 — Carga paralela de alertas
Requisitos previos: varios sensores en la lista
Pasos:
1. Abrir MainActivity
Resultado esperado: las últimas alertas de cada sensor se cargan en paralelo (awaitAll), sin bloqueo de la interfaz de usuario
---
## 6. Notificaciones push
### TC-AND-NOTIF-01 — Registro del token FCM
Pasos:
1. Iniciar sesión en la aplicación
Resultado esperado: token FCM registrado mediante POST /devices (RegisterMobileDeviceRequest)
---
### TC-AND-NOTIF-02 — Recepción de una alerta en primer plano
Condiciones previas: regla activa, el sensor activa el umbral
Pasos:
1. Mantener la aplicación abierta
Resultado esperado: notificación del sistema mostrada a través de NotificationHelper (con sonido y vibración), canal creado si se trata de Android 8+
---
### TC-AND-NOTIF-03 — Recepción de una alerta en segundo plano
Pasos:
1. Poner la aplicación en segundo plano o cerrarla
2. El sensor activa una alerta
Resultado esperado: notificación recibida en la barra de estado; al tocarla, se abre la aplicación
---
### TC-AND-NOTIF-04 — Renovación del token FCM
Pasos:
1. Simular una renovación del token FCM (onNewToken)
Resultado esperado: nuevo token guardado localmente + enviado a la API si el usuario está conectado
---
### TC-AND-NOTIF-05 — Canal de notificaciones (Android 8+)
Pasos:
1. Comprobar en Ajustes del sistema → Notificaciones → XamIoT
Resultado esperado: canal de alertas visible con sonido y vibración configurados
---
## 7. Ajustes y configuración
### TC-AND-CFG-01 — Eliminación de cuenta
Pasos:
1. Menú → Eliminar cuenta
2. Introducir el correo electrónico en el cuadro de diálogo de confirmación
3. Confirmar
Resultado esperado: DELETE /me con texto {"confirm": "DELETE"}, botón desactivado durante la operación, vuelta a LoginActivity
---
### TC-AND-CFG-02 — Almacenamiento de credenciales WiFi
Pasos:
1. Registrar un sensor con un SSID/contraseña
2. Iniciar un segundo registro
Resultado esperado: SSID y contraseña rellenados automáticamente a través de WifiCredentialsStore
---
### TC-AND-CFG-03 — La actualización automática se detiene en segundo plano
Pasos:
1. Activar la actualización automática
2. Poner la aplicación en segundo plano
3. Volver a la aplicación
Resultado esperado: la actualización automática se detiene en segundo plano (onStop) y se reinicia en primer plano (onStart)
---
## 8. Pruebas de robustez
### TC-AND-ROB-01 — Pérdida de conexión durante el uso
Pasos:
1. Activar el modo avión mientras la aplicación está abierta
Resultado esperado: error de red mostrado mediante ApiError.toUserMessage(), sin bloqueo
---
### TC-AND-ROB-02 — Token caducado
Pasos:
1. Dejar que el token caduque
2. Realizar una acción API
Resultado esperado: código HTTP 401 detectado, redirección a LoginActivity
---
### TC-AND-ROB-03 — Rotación de la pantalla durante el registro
Pasos:
1. Iniciar el registro BLE
2. Girar el teléfono
Resultado esperado: estado BLE conservado a través de ViewModel (StateFlow), sin reinicio del registro
---
### TC-AND-ROB-04 — Permiso BLE denegado
Pasos:
1. Denegar los permisos de Bluetooth en el primer inicio
2. Intentar añadir un sensor
Resultado esperado: mensaje explícito, invitación a ir a los ajustes del sistema
---
### TC-AND-ROB-05 — Carga simultánea (metadatos del dispositivo + reglas + alertas)
Pasos:
1. Abrir DeviceDetailActivity en un sensor con varias reglas y alertas
Resultado esperado: carga sin bloqueo de la interfaz de usuario; ViewModel gestiona correctamente los estados Loading/Success/Error
---


