# Smoke Test — UDT-001 Login

Manual checklist para verificar la integración completa del flujo de login.

## Pre-requisitos

- SQL Server TECNICA3 con base `SIGCM2` y seed admin ejecutado (`database/seeds/S001__seed_admin.sql`)
- Claves RSA generadas: `scripts/generate-keys.ps1` ya corrido
- `src/api/SIGCM2.Api/appsettings.Development.json` configurado con connection string y rutas de claves
- Node.js 18+ instalado
- .NET 10 SDK instalado

## Pasos

### 1. Arrancar el backend

Abrir Terminal 1 en la raíz del repositorio:

```bash
dotnet run --project src/api/SIGCM2.Api
```

Verificar que la consola muestre algo similar a:

```
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
```

### 2. Arrancar el frontend

Abrir Terminal 2:

```bash
cd src/web
npm run dev
```

Verificar que la consola muestre:

```
  VITE v8.x.x  ready in Xms

  ➜  Local:   http://localhost:5173/
```

### 3. Verificar redirect a /login

- Abrir `http://localhost:5173` en el navegador
- Debe redirigir automáticamente a `http://localhost:5173/login`
- Debe mostrar el formulario de login con campos **Usuario** y **Contraseña**

**Esperado**: Formulario visible, sin errores en consola del navegador.

### 4. Login con credenciales válidas

- Ingresar `admin` en el campo **Usuario**
- Ingresar `@Diego550@` en el campo **Contraseña**
- Hacer click en **Ingresar**

**Esperado**: Botón se deshabilita brevemente mientras carga.

### 5. Verificar Network tab — POST /api/v1/auth/login

- Abrir DevTools → pestaña **Network**
- Buscar la request `POST /api/v1/auth/login`
- Verificar:
  - Status: `200 OK`
  - Response body contiene: `accessToken`, `refreshToken`, `expiresIn`, `usuario`
  - `usuario.username` = `"admin"`, `usuario.rol` = `"admin"`

**Esperado**: Respuesta 200 con JWT válido.

### 6. Verificar LocalStorage — auth-storage

- DevTools → pestaña **Application** → Storage → Local Storage → `http://localhost:5173`
- Buscar clave `auth-storage`
- Verificar que el JSON contenga:
  ```json
  {
    "state": {
      "user": { "username": "admin", "rol": "admin", ... },
      "accessToken": "eyJ..."
    }
  }
  ```

**Esperado**: Token y datos de usuario persistidos correctamente.

### 7. Verificar redirect a Dashboard

- Luego del login exitoso, la URL debe cambiar a `http://localhost:5173/`
- Debe mostrarse: **"SIG-CM2 — Dashboard — Bienvenido al SIG-CM2."**

**Esperado**: Placeholder de Dashboard visible.

### 8. Verificar firma JWT en jwt.io

- Copiar el valor de `accessToken` del LocalStorage
- Abrir [https://jwt.io](https://jwt.io)
- Pegar el token en el campo "Encoded"
- En "VERIFY SIGNATURE" → sección "Public Key or Certificate": pegar el contenido de `src/api/SIGCM2.Api/keys/public.pem`
- Verificar:
  - Header: `"alg": "RS256"`
  - Payload contiene: `sub`, `name` (= `"admin"`), `rol` (= `"admin"`), `permisos` (= `["*"]`), `iss`, `aud`, `exp`
  - Footer muestra: **"Signature Verified"** (fondo azul)

**Esperado**: Firma RS256 válida, claims correctos.

### 9. Probar login fallido

- Volver a `http://localhost:5173/login` (o hacer logout si hubiera botón)
- Ingresar `admin` / `wrongpass`
- Hacer click en **Ingresar**
- Verificar en **Network**: `POST /api/v1/auth/login` → Status `401`
- Verificar en la UI: mensaje de error visible con texto **"Credenciales inválidas"** (sin stack trace)

**Esperado**: Error visible en UI, sin exposición de detalles internos.

---

## Resultado esperado global

| Paso | Resultado |
|------|-----------|
| 1. Backend arranca en :5000 | ✅ / ❌ |
| 2. Frontend arranca en :5173 | ✅ / ❌ |
| 3. Redirect a /login | ✅ / ❌ |
| 4. Login con admin/@Diego550@ | ✅ / ❌ |
| 5. Network: POST 200 + JWT | ✅ / ❌ |
| 6. LocalStorage: auth-storage con token | ✅ / ❌ |
| 7. Redirect a / Dashboard | ✅ / ❌ |
| 8. JWT verificado en jwt.io (RS256) | ✅ / ❌ |
| 9. Login fallido: error en UI, 401 en Network | ✅ / ❌ |
