From 1249c54738296ff978a307ab9b7ad06fe7b4639c Mon Sep 17 00:00:00 2001 From: AlexeerCT Date: Fri, 22 May 2026 16:23:29 -0500 Subject: [PATCH] fix: update health check URL in Jenkinsfile and reduce wait times in e2e tests - Changed health check URL from localhost:8000 to localhost:3467 in Jenkinsfile. - Reduced wait times in various e2e tests to improve performance and responsiveness. - Cleaned up logging in middleware.py by removing unnecessary log statement. These changes aim to enhance the CI pipeline efficiency and streamline the testing process. --- Jenkinsfile | 2 +- backend/core/middleware.py | 4 +- frontend/e2e/invoice-flow.spec.ts | 90 +++++++++++++++---------------- 3 files changed, 47 insertions(+), 49 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8a9ff51e..4bab9265 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -626,7 +626,7 @@ pipeline { sshCommand remote: remote, command: ''' set -euo pipefail for i in $(seq 1 12); do - STATUS=$(curl -sf -o /dev/null -w "%{http_code}" http://localhost:8000/api/health 2>/dev/null || true) + STATUS=$(curl -sf -o /dev/null -w "%{http_code}" http://localhost:3467/api/health 2>/dev/null || true) if [ "$STATUS" = "200" ]; then echo "Smoke test OK — HTTP $STATUS" exit 0 diff --git a/backend/core/middleware.py b/backend/core/middleware.py index 8c827fc2..5c5a6117 100644 --- a/backend/core/middleware.py +++ b/backend/core/middleware.py @@ -186,9 +186,7 @@ class LicenseValidationMiddleware(BaseHTTPMiddleware): "message": "Error interno al contactar el servicio de licencias.", "status_code": 500, } - ) - - logger.info(f"🔑 verify-license → status={response.status_code} body={response.text[:300]}") + ) if response.status_code == 404: # Endpoint no existe en este Hub — dejar pasar diff --git a/frontend/e2e/invoice-flow.spec.ts b/frontend/e2e/invoice-flow.spec.ts index 761b5de7..57e4f493 100644 --- a/frontend/e2e/invoice-flow.spec.ts +++ b/frontend/e2e/invoice-flow.spec.ts @@ -49,7 +49,7 @@ async function fillInput(page: Page, selector: string, value: string) { el.dispatchEvent(new Event('input', { bubbles: true })) el.dispatchEvent(new Event('change', { bubbles: true })) }, { sel: selector, val: value }) - await page.waitForTimeout(2000) + await page.waitForTimeout(300) } async function fillTextarea(page: Page, selector: string, value: string) { @@ -81,7 +81,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { await page.locator('#type').click() await page.getByRole('option', { name: 'Proveedor' }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('button', { name: /Guardar Socio|Actualizar Socio/ }).click() @@ -103,7 +103,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { await page.locator('#type').click() await page.getByRole('option', { name: 'Cliente' }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('button', { name: /Guardar Socio|Actualizar Socio/ }).click() @@ -144,7 +144,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { await expect(page.getByRole('heading', { name: 'Nuevo Tipo de Cambio' })).toBeVisible() await page.locator('#date').fill(TODAY) - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await fillInput(page, '#value', '17.5') @@ -163,7 +163,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { const prereqModal = page.getByRole('button', { name: /Continuar|Aceptar/ }) if (await prereqModal.isVisible()) await prereqModal.click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) // Año — input con id estable await fillInput(page, '#year', PEDIMENTO_YEAR) @@ -171,36 +171,36 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Aduana — bits-ui Select, 1er trigger de la fila superior const triggers = page.locator('[data-select-trigger]') await triggers.nth(0).click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('option').first().click() - await page.waitForTimeout(1000) + await page.waitForTimeout(500) // Patente — bits-ui Select, 2do trigger await triggers.nth(1).click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('option').first().click() - await page.waitForTimeout(1000) + await page.waitForTimeout(500) // Número de pedimento — input con id estable await fillInput(page, '#pedimento_number', PEDIMENTO_NUMBER) // Clave — bits-ui Select, 3er trigger await triggers.nth(2).click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('option').first().click() - await page.waitForTimeout(1000) + await page.waitForTimeout(500) // Tipo de Operación — bits-ui Select, 4to trigger await triggers.nth(3).click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('option').first().click() - await page.waitForTimeout(1000) + await page.waitForTimeout(500) // Régimen — bits-ui Select, 5to trigger await triggers.nth(4).click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('option').first().click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) await page.getByRole('button', { name: /Guardar Todos los Cambios/ }).click() @@ -217,42 +217,42 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { const prereqModal = page.getByRole('button', { name: /Continuar|Aceptar/ }) if (await prereqModal.isVisible()) await prereqModal.click() - await page.waitForTimeout(5000) + await page.waitForTimeout(1500) await page.locator('#invoice_number').click() await page.keyboard.press('Control+A') - await page.locator('#invoice_number').pressSequentially(INVOICE_NUMBER, { delay: 1000 }) + await page.locator('#invoice_number').pressSequentially(INVOICE_NUMBER, { delay: 50 }) - await page.waitForTimeout(5000) + await page.waitForTimeout(1500) await page.locator('#invoice_date').fill(TODAY) - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('tab', { name: /General/ }).click() - await page.waitForTimeout(5000) + await page.waitForTimeout(1500) await page.locator('#provider_id').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#sold_to_id').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#shipped_to_id').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#customs_broker_id').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#aduana').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#document_type').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.getByRole('button', { name: /Guardar Todos los Cambios/ }).click() @@ -271,7 +271,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { await expect(page.locator('main')).toBeVisible() await fillInput(page, '#filter-invoice-number, input[placeholder="No. Factura"]', invoiceNumber) - await page.waitForTimeout(8000) + await page.waitForTimeout(2000) await expect(page.locator('tbody').getByText(invoiceNumber).first()).toBeVisible({ timeout: 10000 }) }) @@ -294,34 +294,34 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Ir a pestaña Partidas await page.getByRole('tab', { name: /Partidas/ }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) // Abrir sheet de nueva partida await page.getByRole('button', { name: /Agregar Partidas/ }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(1000) // Clase — abre un dialog de búsqueda con tabla, scopear al dialog activo await page.locator('#clase').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) // El dialog de clase tiene data-nested y está encima del sheet // Scopear al último dialog abierto para evitar que el sheet intercepte const claseDialog = page.locator('[data-dialog-content]').last() await claseDialog.locator('tbody tr').first().click() - await page.waitForTimeout(2000) + await page.waitForTimeout(500) // Unidad de medida — mismo patron await page.locator('#um').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) const umDialog = page.locator('[data-dialog-content]').last() await umDialog.locator('tbody tr').first().click() - await page.waitForTimeout(2000) + await page.waitForTimeout(500) // País de origen — abre dialog con tabla igual que clase y UM await page.locator('#pais_origen').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) const paisDialog = page.locator('[data-dialog-content]').last() await paisDialog.locator('tbody tr').first().click() - await page.waitForTimeout(2000) + await page.waitForTimeout(500) // Cantidad await fillInput(page, '#cantidad', '10') @@ -339,7 +339,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Guardar partida — botón "Crear" dentro del sheet const sheet = page.locator('[data-slot="sheet-content"]') await sheet.getByRole('button', { name: /^(Crear|Guardar)$/i }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) // Verificar que la partida aparece en la tabla await expect(page.locator('tbody').first()).toBeVisible({ timeout: 10000 }) @@ -368,18 +368,18 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { await expect(page.getByText(/Factura #/)).toBeVisible() await page.getByRole('tab', { name: /General/ }).click() - await page.waitForTimeout(5000) + await page.waitForTimeout(1500) await page.locator('#customs_broker_id').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#aduana').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.locator('#document_type').click() - await page.waitForTimeout(3000) + await page.waitForTimeout(500) await page.getByRole('option').first().click() await page.getByRole('button', { name: /Guardar Todos los Cambios/ }).click() @@ -404,13 +404,13 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Ir a pestaña Partidas await page.getByRole('tab', { name: /Partidas/ }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) // Abrir sheet de edición — la fila de la partida contiene "E2E01"; el primer botón // de la cell de acciones es editar. const partidaRow = page.locator('tbody tr').filter({ hasText: 'E2E01' }).first() await partidaRow.locator('button').first().click({ force: true, timeout: 10000 }) - await page.waitForTimeout(3000) + await page.waitForTimeout(1000) // Modificar cantidad await fillInput(page, '#cantidad', '20') @@ -421,7 +421,7 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Guardar partida editada — botón "Actualizar" dentro del sheet const sheetEdit = page.locator('[data-slot="sheet-content"]') await sheetEdit.getByRole('button', { name: /^(Actualizar|Guardar)$/i }).click() - await page.waitForTimeout(3000) + await page.waitForTimeout(800) // Guardar factura completa await page.getByRole('button', { name: /Guardar Todos los Cambios/ }).click() @@ -440,11 +440,11 @@ test.describe('Flujo completo — creacion y actualizacion de factura', () => { // Seleccionar la fila await page.locator('tbody tr').first().click() - await page.waitForTimeout(2000) + await page.waitForTimeout(800) // Click en boton Actualizar del footer — tiene h-8, gap-1.5 y border await page.locator('button.h-8:has([class*="lucide-refresh"])').click() - await page.waitForTimeout(5000) + await page.waitForTimeout(1500) // Verificar resultado await expect(page.getByText(/actualiz|procesad|exito/i).first()).toBeVisible({ timeout: 20000 })