ci: optimize test performance — from ~3h to 3.5s

- Lazy-load tesseract.js only in OCR route (skips 30MB WASM download)
- Conditional tracing.js import (skip OTel gRPC in test mode)
- Remove unused barcode-detector import
- Add testTimeout/openHandlesTimeout to jest.config.js
- Add --forceExitTimeout=30000 to test script
- Split CI test jobs into parallel workflows (backend/frontend/mobile)
- Add timeout-minutes: 15 to all test jobs
- Use npm ci --ignore-scripts + selective native rebuild
This commit is contained in:
Antoni Nuñez Romeu
2026-07-14 12:42:02 +02:00
parent 84bf5f3f79
commit 52b5b72cfb
5 changed files with 79 additions and 29 deletions
+4
View File
@@ -3,4 +3,8 @@ export default {
transform: {},
moduleFileExtensions: ['js', 'json'],
testMatch: ['**/__tests__/**/*.test.js'],
testTimeout: 15000,
openHandlesTimeout: 5000,
// Run test files in parallel (not individual tests within a file)
// workerIdleMemoryLimit: '512MB',
}
+1 -1
View File
@@ -12,7 +12,7 @@
"migrate": "node migrate.js",
"reset-db": "bash reset-db.sh",
"import-farmacias": "node import-farmacias.js",
"test": "NODE_OPTIONS='--experimental-vm-modules' npx jest --forceExit"
"test": "NODE_OPTIONS='--experimental-vm-modules' npx jest --ci --forceExit --forceExitTimeout=30000"
},
"keywords": [],
"author": "",
+5 -3
View File
@@ -1,5 +1,8 @@
// OpenTelemetry SDK — must be imported first to instrument http, express, pg, etc.
import './src/tracing.js';
// Skipped in test to avoid gRPC connection attempts to a non-existent collector.
if (process.env.NODE_ENV !== 'test') {
await import('./src/tracing.js');
}
import express from 'express';
import redisClient from './redis-client.js';
@@ -19,8 +22,6 @@ import webpush from 'web-push';
import pino from 'pino';
import pinoHttp from 'pino-http';
import multer from 'multer';
import { createWorker } from 'tesseract.js';
import { BarcodeDetector } from 'barcode-detector';
import { searchMedicines, getMedicineDetails, searchOTC } from './cima-service.js';
import { searchBabyProducts, getBabyProductDetails } from './off-service.js';
import { runFarmaciaWebhookImport, DEFAULT_FARMACIAS_WEBHOOK, importPharmaciesFromRows } from './farmacias-webhook-import.js';
@@ -914,6 +915,7 @@ app.post('/api/tsi/ocr', upload.single('photo'), async (req, res) => {
console.log('[OCR] Processing image, size:', req.file.size, 'bytes');
const { createWorker } = await import('tesseract.js');
const worker = await createWorker('spa+eng');
const { data } = await worker.recognize(req.file.buffer);
await worker.terminate();