Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Giofelix/Proyecto-automatizacion-Empresa/llms.txt

Use this file to discover all available pages before exploring further.

La aplicación Sistema de Gestión Tributaria Pasto es una SPA Angular con un flujo de login de dos pasos: primero se introduce el usuario y se hace clic en “Siguiente”; después se introduce la contraseña y se hace clic en “Iniciar Sesión”. Repetir ese flujo en cada test añade entre 5 y 15 segundos por caso, y con decenas de tests en la suite el tiempo se vuelve inmanejable. La solución adoptada en automation-arqc es realizar el login una sola vez en el global-setup, serializar el sessionStorage resultante en un archivo JSON, e inyectarlo en cada test mediante un addInitScript antes de que Angular cargue — sin tocar la red de autenticación en ningún test individual.

Flujo de autenticación

1

global-setup.js ejecuta el login completo

Antes de que arranque cualquier test, Playwright invoca playwright/global-setup.js. Este script lanza una instancia de Chromium en modo headless, navega a BASE_URL y delega el flujo de login de dos pasos a LoginPage (ubicado en pages/login/login.page.js). El script valida de antemano que las tres variables de entorno estén presentes (BASE_URL, USER_GENERIC, PASSWORD_UNIVERSAL) y lanza un error descriptivo si falta alguna.
2

El sessionStorage se serializa en user.json

Después de un login exitoso, el script extrae todas las entradas de window.sessionStorage (los tokens y metadatos de sesión que Angular almacena) y los persiste en playwright/.auth/user.json con la estructura:
{
  "cookies": [],
  "sessionStorage": {
    "<clave-angular-1>": "<valor>",
    "<clave-angular-2>": "<valor>"
  }
}
Si sessionStorage queda vacío tras el login, el script lanza un error (El login no generó datos en sessionStorage) y guarda una captura de pantalla del fallo en playwright/.auth/globalsetup-failure.png.
3

La sesión se reutiliza si es reciente (solo en local)

En entornos locales, si user.json ya existe y tiene menos de 8 horas de antigüedad, el global-setup lo reutiliza sin lanzar un nuevo login. En CI (process.env.CI definido), la sesión siempre se regenera desde cero para garantizar que no haya tokens expirados entre builds.
const MAX_SESSION_AGE_MS = 8 * 60 * 60 * 1000; // 8 horas

const shouldReuse = !process.env.CI && fs.existsSync(authFile);
if (shouldReuse) {
    const age = Date.now() - fs.statSync(authFile).mtimeMs;
    if (age < MAX_SESSION_AGE_MS) {
        console.log(`[globalSetup] Sesión reutilizada (${Math.round(age / 60000)} min de antigüedad)`);
        return;
    }
}
4

auth.fixture.js inyecta la sesión en cada test

El fixture paginaAutenticada (definido en fixtures/auth.fixture.js) lee user.json, registra un addInitScript que escribe todas las entradas en window.sessionStorage antes de que Angular inicialice, y luego navega a BASE_URL. Cuando Angular arranca ya encuentra los tokens en el almacén de sesión y trata al usuario como autenticado, saltando directamente a la pantalla de módulos.
5

global-teardown.js cierra la sesión y elimina user.json

Al finalizar toda la suite, playwright/global-teardown.js carga la sesión de user.json, inyecta el sessionStorage en una página nueva, navega a la aplicación y llama a LoginPage.logout() para hacer un cierre de sesión limpio en el servidor. En el bloque finally, independientemente de si el logout tuvo éxito, elimina user.json para que el siguiente build empiece siempre con una sesión fresca.

Comportamiento de global-setup.js

El setup incluye validaciones y salvaguardas pensadas para servidores Angular remotos con latencia variable:
  • Validación temprana de variables de entorno: si BASE_URL, USER_GENERIC o PASSWORD_UNIVERSAL no están definidas, el proceso aborta con un mensaje claro antes de abrir el navegador.
  • Eliminación del user.json anterior: si existe un archivo previo que haya superado las 8 horas, se elimina antes de generar uno nuevo para garantizar que nunca se inyecta una sesión parcialmente corrupta.
  • Captura de pantalla en fallo: si el login lanza una excepción, se guarda playwright/.auth/globalsetup-failure.png para facilitar el diagnóstico sin necesidad de reproducir el error manualmente.
  • Flags de Chromium para entornos CI: el navegador se lanza con --no-sandbox y --disable-dev-shm-usage para compatibilidad con agentes de Jenkins sin entorno gráfico.

La fixture paginaAutenticada

Este es el código completo de fixtures/auth.fixture.js. Todos los tests de automation-arqc reciben paginaAutenticada como parámetro en lugar del page de Playwright base, lo que garantiza que la sesión esté activa desde el primer milisegundo del test:
const test = base.extend({
  paginaAutenticada: async ({ page }, use) => {
    const authData = JSON.parse(readFileSync(authFile, 'utf8'));

    await page.addInitScript((sessionData) => {
      for (const [key, value] of Object.entries(sessionData)) {
        window.sessionStorage.setItem(key, value);
      }
    }, authData.sessionStorage);

    await page.goto(process.env.BASE_URL, { timeout: 60000, waitUntil: 'domcontentloaded' });
    await page.waitForURL('**/modulos**', { timeout: 30000 });
    await page.locator('.mat-drawer-inner-container').waitFor({ state: 'visible', timeout: 30000 });

    await use(page);
  }
});
El waitFor del .mat-drawer-inner-container asegura que el menú lateral de Angular Material está completamente renderizado antes de que el test empiece a interactuar con él, evitando falsos fallos por timing en el arranque de la SPA.
playwright/.auth/user.json está en el .gitignore del repositorio y nunca se versiona. Cada desarrollador debe generarlo localmente antes de correr los tests por primera vez:
node playwright/global-setup.js
En CI, Jenkins ejecuta globalSetup automáticamente como parte del paso de ejecución de Playwright, por lo que no es necesario ningún paso manual adicional.
Si user.json tiene más de 8 horas de antigüedad en tu máquina local, los tests fallarán con errores de redirección al login (Angular no reconocerá los tokens expirados y redirigirá a /login en lugar de /modulos). En ese caso, regenera la sesión manualmente:
node playwright/global-setup.js
Verás en la consola [globalSetup] ✓ Sesión guardada con N entradas cuando el proceso termine correctamente.

Build docs developers (and LLMs) love