fix(phase-4): fix translation interpolation and n8n webhook connection in E2E tests

This commit is contained in:
Luis Gabriel Ramos Robles 2026-06-11 22:51:23 +00:00
parent d5a09e14a4
commit 49229263c6
3 changed files with 18 additions and 10 deletions

View file

@ -69,9 +69,10 @@ async function cleanupDb() {
// Clean sales results created by test scripts
await tx.salesResult.deleteMany({
where: {
idempotencyKey: {
startsWith: 'test-key-p4'
}
OR: [
{ idempotencyKey: { startsWith: 'test-key-p4' } },
{ idempotencyKey: { startsWith: 'key-' } }
]
}
});
// Clean audit logs associated
@ -92,8 +93,10 @@ async function runTests() {
// 2. Start Next.js production server on port 3012
console.log(`Starting Next.js production server on port ${PORT}...`);
const testEnv = { ...process.env, PORT: String(PORT), IS_E2E_TEST: 'true', N8N_WEBHOOK_SECRET: 'local_shared_signature_to_verify_n8n_callbacks' };
delete testEnv.N8N_WEBHOOK_URL; // Force direct database save mode for E2E tests
nextProcess = spawn('node', ['node_modules/next/dist/bin/next', 'start', '--port', String(PORT)], {
env: { ...process.env, PORT: String(PORT) }
env: testEnv
});
nextProcess.stdout.on('data', (data) => {
@ -181,6 +184,7 @@ async function runTests() {
await page.waitForSelector('#btn-create-plan');
// Navigate to import page
await page.waitForSelector('#nav-import-sales');
await page.click('#nav-import-sales');
await page.waitForSelector('#btn-download-template');
await page.screenshot({ path: path.join(SCREENSHOT_DIR, '02_admin_import_view.png') });
@ -214,7 +218,7 @@ async function runTests() {
assert(validationErrorCount === 4, "Atomic validation catches all 4 invalid rows in the sheet");
const errorTexts = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.cellMsg')).map(el => el.textContent);
return Array.from(document.querySelectorAll('tbody tr td:last-child')).map(el => el.textContent);
});
assert(errorTexts.some(t => t.includes("colaborador_inexistente")), "Rendered 'colaborador_inexistente' username validation error");
assert(errorTexts.some(t => t.includes("2026/06")), "Rendered invalid Period format validation error");

View file

@ -228,7 +228,7 @@ export const POST = withAuth(async (req, { session, prisma }) => {
}
// 4. Dispatch to n8n or direct save
const useN8n = process.env.N8N_WEBHOOK_URL && !req.nextUrl.searchParams.has('direct');
const useN8n = process.env.N8N_WEBHOOK_URL && process.env.NODE_ENV !== 'test' && process.env.IS_E2E_TEST !== 'true' && !req.nextUrl.searchParams.has('direct');
if (useN8n) {
const response = await fetch(process.env.N8N_WEBHOOK_URL!, {

View file

@ -32,10 +32,14 @@ const TRANSLATIONS: Record<string, string> = {
IMPORT_ACCEPTED: "La importación ha sido aceptada y se está procesando mediante n8n en segundo plano."
};
const translate = (code: string, metadata: any = {}) => {
const translate = (code: string, metadata: any = {}, value?: any) => {
let template = TRANSLATIONS[code] || code;
for (const key of Object.keys(metadata)) {
template = template.replace(`{${key}}`, String(metadata[key]));
const merged = { ...metadata };
if (value !== undefined) {
merged.value = value;
}
for (const key of Object.keys(merged)) {
template = template.replace(`{${key}}`, String(merged[key]));
}
return template;
};
@ -314,7 +318,7 @@ export default function SalesImportPage() {
<td className={styles.cellRow}>Fila {err.row}</td>
<td className={styles.cellCol}>{err.column}</td>
<td className={styles.cellVal}><code>{String(err.value || '')}</code></td>
<td className={styles.cellMsg}>{translate(err.code, err.metadata)}</td>
<td className={styles.cellMsg}>{translate(err.code, err.metadata, err.value)}</td>
</tr>
))}
</tbody>