Files
roi-theme/openspec/specs/adsense-javascript-first/test-plan.md
FrankZamora 0d6b6db108 docs(api): add server info and test results to test-plan
- Add production server connection details
- Add deploy commands reference
- Document T01-T04, T13, T15-T16 test results (7 passed)
- Note pending tests requiring javascript_first_mode enabled

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 13:16:10 -06:00

603 lines
15 KiB
Markdown

# Plan de Pruebas: AdSense JavaScript-First Architecture
> **NOTA IMPORTANTE - PROTOCOLO DE PRUEBAS**
>
> Las pruebas se ejecutan en el servidor de PRODUCCION.
> Si hay algo que corregir, se modifica en LOCAL y luego se despliega.
>
> **PROHIBIDO**: Modificar codigo directamente en produccion.
> **PERMITIDO**: Solo ejecutar pruebas y verificaciones en produccion.
>
> Flujo correcto:
> 1. Ejecutar prueba en produccion
> 2. Si falla, corregir en local
> 3. Desplegar cambios a produccion
> 4. Re-ejecutar prueba
---
## Informacion del Servidor de Produccion
| Campo | Valor |
|-------|-------|
| **Host SSH** | `VPSContabo` (alias en ~/.ssh/config) |
| **IP** | `5.189.136.96` |
| **Usuario** | `root` |
| **Ruta del tema** | `/var/www/preciosunitarios/public_html/wp-content/themes/roi-theme` |
| **URL produccion** | `https://analisisdepreciosunitarios.com` |
| **PHP Version** | 8.2 (php8.2-fpm) |
### Comandos de Deploy
```bash
# 1. Push desde local (sube a GitHub + Gitea automaticamente)
git push origin main
# 2. Pull en produccion
ssh VPSContabo "cd /var/www/preciosunitarios/public_html/wp-content/themes/roi-theme && git pull origin main"
# 3. Limpiar cache de OPcache (IMPORTANTE despues de deploy)
ssh VPSContabo "systemctl restart php8.2-fpm"
```
---
## Resumen de Pruebas
| ID | Categoria | Descripcion | Criterio de Aceptacion |
|----|-----------|-------------|------------------------|
| T01 | Endpoint REST | Endpoint registrado y accesible | HTTP 200 con JSON valido |
| T02 | Endpoint REST | Headers anti-cache presentes | Cache-Control, Pragma, Expires |
| T03 | Endpoint REST | Parametro post_id requerido | HTTP 400 sin post_id |
| T04 | Endpoint REST | post_id=0 valido (archivos/home) | HTTP 200 con post_id=0 |
| T05 | Visibilidad | Componente deshabilitado | show_ads=false, reason=component_disabled |
| T06 | Visibilidad | Usuario anonimo sin exclusiones | show_ads=true, reasons=[] |
| T07 | Visibilidad | Usuario logueado excluido | show_ads=false, reason=logged_in_excluded |
| T08 | Visibilidad | Rol excluido | show_ads=false, reason=role_excluded |
| T09 | Visibilidad | Post excluido | show_ads=false, reason=post_excluded |
| T10 | JavaScript | Script cargado en frontend | roiAdsenseConfig definido |
| T11 | JavaScript | Cache localStorage funciona | Datos guardados correctamente |
| T12 | JavaScript | Fallback cuando error | Ads se muestran en error |
| T13 | Feature Flag | Modo deshabilitado = legacy | No llama endpoint |
| T14 | Feature Flag | Modo habilitado = JS-First | Llama endpoint |
| T15 | Clean Arch | Value Objects inmutables | No WordPress en Domain |
| T16 | Clean Arch | Interface en Domain | AdsenseVisibilityCheckerInterface existe |
---
## Pruebas Detalladas
### T01: Endpoint REST Registrado y Accesible
**Categoria**: Endpoint REST
**Prioridad**: CRITICA
**Spec Reference**: Requirement: Endpoint REST Visibility
**Pasos**:
1. Abrir navegador o usar curl
2. Acceder a: `https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=1`
**Resultado Esperado**:
- HTTP Status: 200
- Content-Type: application/json
- Body contiene: `show_ads`, `reasons`, `cache_seconds`, `timestamp`
**Comando de Prueba**:
```bash
curl -i "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=1"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T02: Headers Anti-Cache Presentes
**Categoria**: Endpoint REST
**Prioridad**: ALTA
**Spec Reference**: Scenario: Headers anti-cache obligatorios
**Pasos**:
1. Hacer request al endpoint
2. Verificar headers de respuesta
**Resultado Esperado**:
- `Cache-Control: no-store, no-cache, must-revalidate, max-age=0`
- `Pragma: no-cache`
- `Expires: Thu, 01 Jan 1970 00:00:00 GMT` o `0`
- `Vary: Cookie`
**Comando de Prueba**:
```bash
curl -I "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=1"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T03: Parametro post_id Requerido
**Categoria**: Endpoint REST
**Prioridad**: ALTA
**Spec Reference**: Scenario: Parametros del endpoint
**Pasos**:
1. Hacer request SIN post_id
2. Verificar respuesta de error
**Resultado Esperado**:
- HTTP Status: 400 (Bad Request)
- Body contiene mensaje de error indicando que post_id es requerido
**Comando de Prueba**:
```bash
curl -i "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T04: post_id=0 Valido para Paginas de Archivo
**Categoria**: Endpoint REST
**Prioridad**: ALTA
**Spec Reference**: Scenario: Parametros del endpoint (validate_callback >= 0)
**Pasos**:
1. Hacer request con post_id=0
2. Verificar que responde correctamente
**Resultado Esperado**:
- HTTP Status: 200
- Body contiene decision de visibilidad valida
**Comando de Prueba**:
```bash
curl -i "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=0"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T05: Componente Deshabilitado Retorna False
**Categoria**: Visibilidad
**Prioridad**: ALTA
**Spec Reference**: Scenario: Componente deshabilitado
**Pre-condicion**:
- Deshabilitar componente en admin (is_enabled = false)
**Pasos**:
1. Deshabilitar adsense-placement en admin
2. Hacer request al endpoint
3. Verificar respuesta
**Resultado Esperado**:
```json
{
"show_ads": false,
"reasons": ["component_disabled"],
"cache_seconds": 3600
}
```
**Comando de Prueba**:
```bash
curl "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=1"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T06: Usuario Anonimo Sin Exclusiones Ve Ads
**Categoria**: Visibilidad
**Prioridad**: CRITICA
**Spec Reference**: Scenario: Usuario anonimo sin exclusiones
**Pre-condicion**:
- Componente habilitado
- javascript_first_mode habilitado
- Sin exclusiones configuradas
- No estar logueado
**Pasos**:
1. Abrir navegador en modo incognito
2. Acceder a un post del sitio
3. Verificar respuesta del endpoint
**Resultado Esperado**:
```json
{
"show_ads": true,
"reasons": [],
"cache_seconds": 60
}
```
**Comando de Prueba**:
```bash
curl "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=1"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T07: Usuario Logueado Excluido
**Categoria**: Visibilidad
**Prioridad**: ALTA
**Spec Reference**: Scenario: Usuario logueado excluido
**Pre-condicion**:
- Activar "Ocultar para usuarios logueados" en admin
**Pasos**:
1. Loguearse en WordPress
2. Copiar cookies de sesion
3. Hacer request con cookies
**Resultado Esperado**:
```json
{
"show_ads": false,
"reasons": ["logged_in_excluded"],
"cache_seconds": 300
}
```
**Verificacion Manual**:
1. Loguearse en wp-admin
2. Visitar un post en el frontend
3. Abrir DevTools > Network
4. Buscar request a `/visibility`
5. Verificar respuesta
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T08: Rol Excluido
**Categoria**: Visibilidad
**Prioridad**: ALTA
**Spec Reference**: Scenario: Rol de usuario excluido
**Pre-condicion**:
- Agregar "administrator" a roles excluidos en admin
**Pasos**:
1. Loguearse como administrator
2. Visitar un post
3. Verificar respuesta del endpoint
**Resultado Esperado**:
```json
{
"show_ads": false,
"reasons": ["role_excluded"],
"cache_seconds": 300
}
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T09: Post Excluido por ID
**Categoria**: Visibilidad
**Prioridad**: ALTA
**Spec Reference**: Scenario: Post excluido por ID
**Pre-condicion**:
- Agregar un ID de post a "IDs de posts excluidos" en admin
**Pasos**:
1. Anotar el ID del post excluido (ej: 123)
2. Hacer request con ese post_id
3. Verificar respuesta
**Resultado Esperado**:
```json
{
"show_ads": false,
"reasons": ["post_excluded"],
"cache_seconds": 60
}
```
**Comando de Prueba**:
```bash
curl "https://analisisdepreciosunitarios.com/wp-json/roi-theme/v1/adsense-placement/visibility?post_id=123"
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T10: Script JavaScript Cargado
**Categoria**: JavaScript
**Prioridad**: CRITICA
**Spec Reference**: Scenario: Configuracion via wp_localize_script
**Pre-condicion**:
- javascript_first_mode habilitado
**Pasos**:
1. Visitar un post en el frontend
2. Abrir DevTools > Console
3. Escribir: `window.roiAdsenseConfig`
**Resultado Esperado**:
- Objeto definido con propiedades:
- `endpoint`: URL del endpoint REST
- `postId`: ID del post actual
- `nonce`: String no vacio
- `featureEnabled`: true
- `debug`: boolean
**Verificacion Alternativa**:
```javascript
// En consola del navegador
console.log(window.roiAdsenseConfig);
console.log(typeof window.roiAdsenseVisibility);
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T11: Cache localStorage Funciona
**Categoria**: JavaScript
**Prioridad**: ALTA
**Spec Reference**: Scenario: Cache en localStorage
**Pasos**:
1. Visitar un post (primera vez)
2. Abrir DevTools > Application > Local Storage
3. Buscar key `roi_adsense_visibility`
4. Recargar pagina
5. Verificar en Network que NO hay nueva llamada al endpoint
**Resultado Esperado**:
- localStorage contiene:
```json
{
"show_ads": true,
"reasons": [],
"timestamp": 1733900000,
"cache_seconds": 60
}
```
- Segunda carga NO hace request al endpoint (usa cache)
**Verificacion en Consola**:
```javascript
localStorage.getItem('roi_adsense_visibility');
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T12: Fallback en Error de Red
**Categoria**: JavaScript
**Prioridad**: ALTA
**Spec Reference**: Scenario: Fallback strategy cached-or-show
**Pasos**:
1. Limpiar localStorage
2. Abrir DevTools > Network
3. Habilitar "Offline" mode
4. Visitar un post
5. Verificar comportamiento
**Resultado Esperado**:
- Los ads se muestran (fallback = show)
- No hay error en consola (error manejado gracefully)
**Verificacion Alternativa**:
```javascript
// Limpiar cache
window.roiAdsenseVisibility.clearCache();
// Recargar con network offline
```
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T13: Feature Flag Deshabilitado = Modo Legacy
**Categoria**: Feature Flag
**Prioridad**: ALTA
**Spec Reference**: Scenario: Feature flag deshabilitado
**Pre-condicion**:
- Deshabilitar javascript_first_mode en admin
**Pasos**:
1. Deshabilitar javascript_first_mode
2. Visitar un post
3. Verificar en Network que NO hay llamada al endpoint
**Resultado Esperado**:
- `roiAdsenseConfig.featureEnabled` = false
- No hay request a `/visibility` endpoint
- Ads se muestran inmediatamente (modo legacy)
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T14: Feature Flag Habilitado = JS-First
**Categoria**: Feature Flag
**Prioridad**: ALTA
**Spec Reference**: Scenario: Feature flag habilitado
**Pre-condicion**:
- Habilitar javascript_first_mode en admin
**Pasos**:
1. Habilitar javascript_first_mode
2. Limpiar cache (localStorage y pagina)
3. Visitar un post
4. Verificar en Network que SI hay llamada al endpoint
**Resultado Esperado**:
- `roiAdsenseConfig.featureEnabled` = true
- Request a `/visibility` endpoint presente
- Ads se muestran/ocultan segun respuesta
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T15: Value Objects Sin Dependencias WordPress
**Categoria**: Clean Architecture
**Prioridad**: MEDIA
**Spec Reference**: Scenario: Value Object VisibilityDecision en Domain
**Verificacion**:
Revisar que los archivos NO contengan funciones de WordPress:
**Archivos a verificar**:
- `Domain/ValueObjects/UserContext.php`
- `Domain/ValueObjects/VisibilityDecision.php`
- `Domain/ValueObjects/AdsenseSettings.php`
- `Domain/Contracts/AdsenseVisibilityCheckerInterface.php`
- `Application/UseCases/CheckAdsenseVisibilityUseCase.php`
**Resultado Esperado**:
- Sin `get_`, `wp_`, `is_user_logged_in`, `WP_*` classes
- Solo PHP puro y tipos del proyecto
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
### T16: Interface en Domain
**Categoria**: Clean Architecture
**Prioridad**: MEDIA
**Spec Reference**: Scenario: Interface en Domain
**Verificacion**:
El archivo `Domain/Contracts/AdsenseVisibilityCheckerInterface.php` debe:
- Existir en la ruta correcta
- Definir metodo `check(int $postId, UserContext $userContext): VisibilityDecision`
- NO referenciar WordPress
**Estado**: [ ] Pendiente
**Resultado**:
**Notas**:
---
## Checklist de Despliegue Pre-Pruebas
Antes de ejecutar las pruebas, verificar:
- [ ] Codigo desplegado a produccion via FTP/SSH
- [ ] Cache de pagina limpiado
- [ ] javascript_first_mode habilitado en admin
- [ ] Componente adsense-placement habilitado
- [ ] Schema sincronizado en BD (campo javascript_first_mode existe)
---
## Registro de Ejecucion
| Fecha | Tester | Pruebas Ejecutadas | Pasadas | Fallidas | Notas |
|-------|--------|-------------------|---------|----------|-------|
| 2025-12-11 | Claude | T01-T04, T13, T15-T16 | 7 | 0 | javascript_first_mode deshabilitado, pruebas T05-T12,T14 requieren habilitarlo |
---
## Resultados de Pruebas (2025-12-11)
### Pruebas Ejecutadas
| ID | Resultado | Evidencia |
|----|-----------|-----------|
| T01 | ✅ PASA | HTTP 200, JSON: `{"show_ads":false,"reasons":["javascript_first_disabled"],"cache_seconds":600,"timestamp":...}` |
| T02 | ✅ PASA | Headers: `Cache-Control: no-store, no-cache, must-revalidate, max-age=0`, `pragma: no-cache`, `expires: Thu, 01 Jan 1970 00:00:00 GMT` |
| T03 | ✅ PASA | HTTP 400: `{"code":"rest_missing_callback_param","message":"Parametro(s) que falta(n): post_id"}` |
| T04 | ✅ PASA | HTTP 200 con post_id=0 |
| T13 | ✅ PASA | Modo legacy activo - roiAdsenseConfig tiene formato antiguo (lazyEnabled, rootMargin) sin endpoint/postId |
| T15 | ✅ PASA | grep en Domain/ no encuentra wp_, get_, is_user, WP_ |
| T16 | ✅ PASA | AdsenseVisibilityCheckerInterface.php existe en Domain/Contracts/ |
### Pruebas Pendientes (requieren javascript_first_mode = true)
| ID | Razon Pendiente |
|----|-----------------|
| T05 | Requiere deshabilitar componente completo |
| T06 | Requiere javascript_first_mode habilitado |
| T07 | Requiere javascript_first_mode + hide_for_logged_in |
| T08 | Requiere javascript_first_mode + roles excluidos |
| T09 | Requiere javascript_first_mode + post excluido |
| T10 | Requiere javascript_first_mode habilitado |
| T11 | Requiere javascript_first_mode habilitado |
| T12 | Requiere javascript_first_mode habilitado |
| T14 | Requiere javascript_first_mode habilitado |
---
## Defectos Encontrados
| ID | Prueba | Descripcion | Severidad | Estado | Correccion |
|----|--------|-------------|-----------|--------|------------|
| - | - | Sin defectos encontrados | - | - | - |
---
## Historial de Versiones
| Version | Fecha | Cambios |
|---------|-------|---------|
| 1.0 | 2025-12-11 | Plan inicial basado en spec v1.5 |
| 1.1 | 2025-12-11 | Agregada info servidor produccion, resultados primera ronda de pruebas |