Saltar al contenido principal

Reportar un problema en una gasolinera

Implementa: web, app, api
Consume: api
Estado: activa
Última revisión: 2026-05-21T17:02:53Z

# Implementa: web, app, api
# Consume: api
# Estado: activa
# Última revisión: 2026-05-21T17:02:53Z
# Position: 7

Feature: Reportar un problema en una gasolinera

Desde el detalle de una gasolinera, el usuario puede reportar
un problema mediante un mensaje de texto libre.

El contrato es POST /v2/stations/{station_id}/report.
# Contrato: POST /v2/stations/{station_id}/report
# Body: { message: string (max 500 chars), fuel: FuelType, platform: "web" | "ios" | "android" }
# Swagger: https://tanko-a4q2.onrender.com/tanko_docs_ad0df4baad113557

El campo `fuel` refleja el tipo de combustible activo en el detalle
en el momento del reporte — es contexto pasivo, no una categoría de problema.
El revisor lo usa cuando aplica (precio incorrecto) y lo ignora cuando no (horario, cierre).
El reporte no tiene categorías: el mensaje es completamente libre, máximo 500 caracteres.

El timestamp lo genera el servidor — el cliente no lo envía.
Rate limiting por IP igual al resto del API.
No hay restricción de reportes por usuario ni por sesión.

Background:
Given el usuario está en el detalle de una gasolinera
And pulsa en "Reportar un problema"
Then se abre el modal de reporte

Scenario: El usuario envía un reporte correctamente
Given el modal de reporte está abierto
And el usuario escribe un mensaje no vacío
When pulsa "Enviar"
Then el botón muestra estado de carga y queda deshabilitado
And el frontend llama a POST /v2/stations/{station_id}/report con message (trimmed), fuel y platform
And se muestra el estado de éxito: icono verde con check, título y cuerpo de confirmación
And el botón "Listo" cierra el modal

Scenario: Botón deshabilitado con mensaje vacío
Given el modal de reporte está abierto
And el campo de texto está vacío o contiene solo espacios
Then el botón "Enviar" está deshabilitado
And no se realiza ninguna llamada al API

Scenario: El envío falla — estado de error con reintento
Given el usuario pulsa "Enviar" con un mensaje válido
When la llamada falla o supera el timeout de 8 segundos
Then se muestra el estado de error: icono de aviso, título y cuerpo de error
And el botón "Reintentar" vuelve a ejecutar el envío
And el mensaje del usuario se conserva

Scenario: El usuario cierra el modal sin enviar
Given el modal de reporte está abierto con texto escrito
When cierra el modal sin pulsar "Enviar"
Then el reporte se descarta
And no se realiza ninguna llamada al API

Scenario: El usuario reabre el modal tras un envío exitoso
Given el usuario ya envió un reporte en esta sesión
When vuelve a pulsar "Reportar un problema"
Then el modal se abre con el formulario vacío
And puede enviar un nuevo reporte