import { test, expect } from '../../fixtures/base'; import type { n8nPage } from '../../pages/n8nPage'; import { measurePerformance, attachMetric } from '../../utils/performance-helper'; async function setupPerformanceTest(n8n: n8nPage, size: number) { await n8n.start.fromImportedWorkflow('large.json'); await n8n.notifications.closeNotificationByText('Successful'); await n8n.canvas.openNode('Edit Fields'); await n8n.ndv.fillParameterInputByName('value', size.toString()); await n8n.ndv.clickBackToCanvasButton(); } test.use({ capability: { resourceQuota: { memory: 0.75, cpu: 0.5, }, }, }); test.describe( 'Large Data Size Performance - Cloud Resources', { annotation: [{ type: 'owner', description: 'Catalysts' }], }, () => { test('Code Node with 30000 items', async ({ n8n }, testInfo) => { const itemCount = 30000; await setupPerformanceTest(n8n, itemCount); const workflowExecuteTimeout = 65_000; const loopSize = 30; const stats = []; const triggerDuration = await measurePerformance(n8n.page, 'trigger-workflow', async () => { await n8n.workflowComposer.executeWorkflowAndWaitForNotification( 'Workflow executed successfully', { timeout: workflowExecuteTimeout, }, ); }); for (let i = 0; i < loopSize; i++) { const openNodeDuration = await measurePerformance(n8n.page, `open-node-${i}`, async () => { await n8n.canvas.openNode('Code'); }); stats.push(openNodeDuration); await n8n.ndv.clickBackToCanvasButton(); } const average = stats.reduce((a, b) => a + b, 0) / stats.length; await attachMetric(testInfo, 'open-node', average, 'ms', { item_count: itemCount }); await attachMetric(testInfo, 'trigger-workflow', triggerDuration, 'ms', { item_count: itemCount, }); expect(average).toBeGreaterThan(0); expect(triggerDuration).toBeGreaterThan(0); console.log( `[PERF] Open node avg: ${average.toFixed(2)} ms | Workflow trigger: ${triggerDuration.toFixed(2)} ms`, ); }); }, );