XamIoT

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

---