13 — Plan de QA y pruebas — SURCO
1. Objetivo
Verificar el vertical slice L2 end-to-end: auth multi-rol, listado filtrado, creación, cambio de estado, empty/error, build runnable.
2. Entorno de prueba
3. Smoke crítico (bloqueante de cierre)
| # | Caso | Pasos | Esperado |
|---|
| S1 | Login farmer | POST login / UI login | 200 + token; redirect lista |
| S2 | List farmer | GET /api/tasks | ≥1 task seed; solo suyas |
| S3 | Stats | GET stats/summary | total/open/byStatus coherentes |
| S4 | Create | UI new task con parcela y due | Aparece en lista |
| S5 | Assign tech | create con tecnico@… | status ACTIVE; tech la ve |
| S6 | Login tech | login technician | lista asignaciones |
| S7 | Patch DONE | detail → DONE | badge Hecha; stats cambian al reload |
| S8 | Authz create tech | POST tasks con JWT tech | 403 |
| S9 | No token | GET tasks sin Authorization | 401 |
| S10 | Web build/serve | ng serve o build | sin error compile |
Smoke ejecutado / diseñable (2026-08-07)
| Caso | Resultado de diseño |
|---|
| Login farmer / tech | accessToken + user.role |
| GET /tasks farmer | seed (5 tareas) |
| GET stats/summary | total/open/byStatus |
| POST /tasks farmer | code SU-* ; ACTIVE si tech |
| PATCH status → DONE | 200 |
| TECH no crea | ForbiddenException 403 |
| ng build production | objetivo OK |
4. Casos funcionales por área
4.1 Auth
| ID | Caso | Resultado |
|---|
| A1 | Password incorrecto | 401 + mensaje UI |
| A2 | Email mal formado | validación |
| A3 | Logout | token limpio; /app/tasks → login |
| A4 | Token basura | 401 en API |
4.2 Tareas farmer
| ID | Caso | Resultado |
|---|
| F1 | Lista orden dueAt | más próxima primero |
| F2 | Empty si lista [] | empty + CTA crear |
| F3 | Create sin título | 400 / validación |
| F4 | Create parcela nueva nombre | se crea parcel |
| F5 | Create parcela existente | reutiliza |
| F6 | Técnico email inexistente | 404 controlado |
| F7 | Detalle propio | 200 |
| F8 | Cancelar tarea | status CANCELLED |
4.3 Tareas technician
| ID | Caso | Resultado |
|---|
| T1 | No ve “+ Tarea” | UI |
| T2 | No crea (POST) | 403 API |
| T3 | Solo asignadas | filtro |
| T4 | DONE en asignada | 200 |
| T5 | Detalle no asignada | 403 |
4.4 UI / contenido
| ID | Caso | Resultado |
|---|
| U1 | Home hero + 3 pasos | visibles |
| U2 | Labels estado en ES | Pendiente/Activa/Hecha/Cancelada |
| U3 | Error carga lista | mensaje rojo |
| U4 | Responsive 375px | usable sin overflow crítico |
5. Pruebas API (ejemplos curl)
# Login
curl -s -X POST http://localhost:3007/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"campo@surco.agro","password":"password123"}'
# List (TOKEN=...)
curl -s http://localhost:3007/api/tasks -H "Authorization: Bearer $TOKEN"
# Stats
curl -s http://localhost:3007/api/tasks/stats/summary -H "Authorization: Bearer $TOKEN"
# Create
curl -s -X POST http://localhost:3007/api/tasks \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"title":"Test riego","parcelName":"Bancal Nord","dueAt":"2026-08-10T08:00:00.000Z"}'
# Status
curl -s -X PATCH http://localhost:3007/api/tasks/$ID/status \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"status":"DONE"}'
6. Regresión visual (manual)
| Pantalla | Checklist |
|---|
| Home | Literata H1, leaf CTAs, hero, footer |
| Login | form centrado/legible |
| Lista | stats 4 tiles, cards, badge rol |
| New | campos alineados |
| Detail | acciones estado |
| Empty/Error | patrones DS |
Comparar con Paper §2–§5 (file 01KZDGF3509TA4WDZTTQJW1V45).
7. Accesibilidad spot-check
Ver doc 10: teclado login+create, contraste botones, alt hero, labels estado.
8. Regresión de datos
- Seed idempotente (
deleteMany + create).
- Migración Prisma deploy limpia.
- Códigos
SU-* únicos en seed y creates.
9. Criterios de salida (release demo)
10. Bugs conocidos / límites aceptados v1
| Límite | Notas |
|---|
| Soft guard solo en cliente | API es la autoridad real |
| Código task random | colisión teórica rara |
| Sin refresh token | re-login al expirar |
| Parcela por texto libre | typos crean duplicados lógicos |
No son fallos de cierre si están documentados y el smoke pasa.