# Plan de pruebas — MU Nexora Test Build

## Regla de entorno

Usar únicamente copias de las bases. No ejecutar los scripts de staging contra producción hasta cerrar cada caso y tener backup/rollback.

## 1. Arranque

- La web carga con `NEXORA_PLATFORM_ENABLED=false` usando compatibilidad.
- La web carga con Platform activo después de `001_nexora_platform.sql`.
- Legado y Seasonal pueden seleccionarse sin mezclar caches.
- El AdminCP permite seleccionar reino operativo sin cambiar la identidad autenticada.

## 2. Identidad

### Registro

- Crear una cuenta de prueba inexistente en ambos realms.
- Confirmar que termina en ambos realms una sola vez.
- Repetir con el trigger Legado→Seasonal todavía activo.
- Deshabilitar el trigger en staging y repetir.
- Verificar rollback si una de las dos altas falla.

### Password recovery

- Solicitar recovery con cuenta/email válido.
- Confirmar que el enlace expira.
- Confirmar que el token no puede reutilizarse.
- Confirmar que el email no contiene la nueva contraseña.
- Confirmar cambio en ambos realms.
- Probar varias solicitudes desde la misma IP y revisar rate limit.

### Cambio de email

- Exige contraseña actual.
- Envía enlace al email anterior.
- Token expira y es de un solo uso.
- Rechaza email ya utilizado en cualquiera de los realms.
- Actualiza ambos realms juntos.

## 3. Economía

### Créditos

- Dos débitos concurrentes no pueden llevar el saldo por debajo de cero.
- Dos créditos concurrentes no pierden actualizaciones.
- Cada movimiento nuevo aparece en `NEXORA_WALLET_LEDGER` con Platform activo.

### Buy Zen

- Con saldo suficiente: descuenta créditos y acredita Zen.
- Sin saldo: no modifica Zen.
- Personaje inexistente: no descuenta créditos.
- Zen superaría máximo: revierte todo.

### PayPal

Usar sandbox/test.

- Un `txn_id` nuevo acredita una sola vez.
- Reenviar exactamente el mismo `txn_id`: no vuelve a acreditar.
- Dos requests simultáneos con el mismo `txn_id`: una sola acreditación.
- Moneda/receiver/pack inválido: no acredita.
- Revisar `NEXORA_PAYMENT_EVENTS`, ledger y transacción WebEngine.

## 4. Seguridad web

- Formularios POST incluyen `__nexora_csrf`.
- POST sin token válido devuelve rechazo.
- Endpoints API/cron no dependen de CSRF; usan su autenticación propia.
- Operaciones destructivas AdminCP no funcionan por GET.
- `/api/version.php` no expone versión de PHP/Apache.
- `.zip`, `.rar`, `.7z`, `.sql`, `.bak`, `.env` no son servidos por Apache si `.htaccess` está habilitado.
- `includes/config/nexora.local.php` no es accesible públicamente.

## 5. Cron

- Invocar solo por POST.
- Secret correcto mediante `Authorization: Bearer` o header dedicado.
- Secret incorrecto no ejecuta tarea.
- `account_country.php` guarda metadata en Platform y lee sesión desde el realm.
- `temporal_bans.php` desbloquea la cuenta en ambos realms antes de retirar el ban compartido.

## 6. RBAC / Admin

- Admin heredado mantiene acceso como superadmin.
- Asignar `support`: solo lectura compatible con permisos definidos.
- Asignar `content`: puede contenido, no economía/sistema.
- Retirar rol y comprobar acceso.
- Todas las acciones relevantes generan audit log.

## 7. Conciliación

En `Account Reconciliation` revisar:

- cuentas presentes en ambos;
- solo Legado;
- solo Seasonal;
- email diferente;
- bloqueo diferente.

No realizar sincronización masiva hasta definir política para cada categoría.

## Gate para avanzar a producción

No avanzar si falla cualquiera de estos puntos:

- registro dual consistente;
- recovery seguro;
- PayPal idempotente;
- Buy Zen atómico;
- CSRF en AdminCP/UserCP;
- secretos fuera del repositorio;
- rollback del trigger probado;
- backup restaurable verificado.

### PayPal reversal / privacy
- With `NEXORA_PAYPAL_GEOLOOKUP=false`, confirm a completed sandbox payment performs no external IP geolocation lookup.
- Replay the same completed `txn_id`: confirm credits are added once.
- Send a valid reversal/refund/chargeback for an order that was never credited: confirm it is rejected/no account block occurs.
- Send a valid reversal for a previously credited order: confirm only the affected realm account is blocked and the payment state is marked reversed.
