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

15 KiB

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

# 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:

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:

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:

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:

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:

{
  "show_ads": false,
  "reasons": ["component_disabled"],
  "cache_seconds": 3600
}

Comando de Prueba:

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:

{
  "show_ads": true,
  "reasons": [],
  "cache_seconds": 60
}

Comando de Prueba:

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:

{
  "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:

{
  "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:

{
  "show_ads": false,
  "reasons": ["post_excluded"],
  "cache_seconds": 60
}

Comando de Prueba:

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:

// 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:
    {
      "show_ads": true,
      "reasons": [],
      "timestamp": 1733900000,
      "cache_seconds": 60
    }
    
  • Segunda carga NO hace request al endpoint (usa cache)

Verificacion en Consola:

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:

// 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