From 70af67e744c709b85b600811b792def83518fa7c Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Fri, 26 Jan 2024 15:09:50 +0100 Subject: [PATCH] fix: Use correct node version when pasting/importing nodes (#8456) Co-authored-by: Michael Kret --- cypress/e2e/10-undo-redo.cy.ts | 12 +- cypress/e2e/7-workflow-actions.cy.ts | 10 +- .../Test_workflow-actions_paste-data.json | 156 ++++++++++++++---- packages/workflow/src/TelemetryHelpers.ts | 4 +- 4 files changed, 135 insertions(+), 47 deletions(-) diff --git a/cypress/e2e/10-undo-redo.cy.ts b/cypress/e2e/10-undo-redo.cy.ts index 4182c75507b21..3190987541673 100644 --- a/cypress/e2e/10-undo-redo.cy.ts +++ b/cypress/e2e/10-undo-redo.cy.ts @@ -258,11 +258,11 @@ describe('Undo/Redo', () => { cy.fixture('Test_workflow-actions_paste-data.json').then((data) => { cy.get('body').paste(JSON.stringify(data)); WorkflowPage.actions.zoomToFit(); - WorkflowPage.getters.canvasNodes().should('have.have.length', 2); + WorkflowPage.getters.canvasNodes().should('have.have.length', 5); WorkflowPage.actions.hitUndo(); WorkflowPage.getters.canvasNodes().should('have.have.length', 0); WorkflowPage.actions.hitRedo(); - WorkflowPage.getters.canvasNodes().should('have.have.length', 2); + WorkflowPage.getters.canvasNodes().should('have.have.length', 5); }); }); @@ -338,8 +338,8 @@ describe('Undo/Redo', () => { WorkflowPage.getters.nodeConnections().should('have.length', 1); cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')).should('have.length', 1); cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) - .should('have.css', 'left', `637px`) - .should('have.css', 'top', `501px`); + .should('have.css', 'left', `637px`) + .should('have.css', 'top', `501px`); cy.fixture('Test_workflow_form_switch.json').then((data) => { cy.get('body').paste(JSON.stringify(data)); @@ -353,8 +353,8 @@ describe('Undo/Redo', () => { WorkflowPage.getters.nodeConnections().should('have.length', 1); cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')).should('have.length', 1); cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) - .should('have.css', 'left', `637px`) - .should('have.css', 'top', `501px`); + .should('have.css', 'left', `637px`) + .should('have.css', 'top', `501px`); }); it('should not undo/redo when NDV or a modal is open', () => { diff --git a/cypress/e2e/7-workflow-actions.cy.ts b/cypress/e2e/7-workflow-actions.cy.ts index 096fae738dd3c..0f6705bf349ef 100644 --- a/cypress/e2e/7-workflow-actions.cy.ts +++ b/cypress/e2e/7-workflow-actions.cy.ts @@ -120,10 +120,12 @@ describe('Workflow Actions', () => { WorkflowPage.getters.successToast().should('exist'); }); - it('should paste nodes', () => { + it('should paste nodes (both current and old node versions)', () => { cy.fixture('Test_workflow-actions_paste-data.json').then((data) => { cy.get('body').paste(JSON.stringify(data)); - WorkflowPage.getters.canvasNodes().should('have.have.length', 2); + WorkflowPage.actions.zoomToFit(); + WorkflowPage.getters.canvasNodes().should('have.length', 5); + WorkflowPage.getters.nodeConnections().should('have.length', 5); }); }); @@ -147,8 +149,8 @@ describe('Workflow Actions', () => { .selectFile('cypress/fixtures/Test_workflow-actions_paste-data.json', { force: true }); cy.waitForLoad(false); WorkflowPage.actions.zoomToFit(); - WorkflowPage.getters.canvasNodes().should('have.length', 2); - WorkflowPage.getters.nodeConnections().should('have.length', 1); + WorkflowPage.getters.canvasNodes().should('have.length', 5); + WorkflowPage.getters.nodeConnections().should('have.length', 5); }); it('should update workflow settings', () => { diff --git a/cypress/fixtures/Test_workflow-actions_paste-data.json b/cypress/fixtures/Test_workflow-actions_paste-data.json index f3916fca15af1..c7342ce39641f 100644 --- a/cypress/fixtures/Test_workflow-actions_paste-data.json +++ b/cypress/fixtures/Test_workflow-actions_paste-data.json @@ -1,42 +1,128 @@ { "meta": { - "instanceId": "1a30c82b98a30444ad25bce513655a5e02be772d361403542c23172be6062f04" + "templateCredsSetupCompleted": true, + "instanceId": "669258f419ee5d9faf0a484944244a47fcc28c541f3c6c874e50a171a0be1e6b" }, "nodes": [ - { - "parameters": { - "rule": { - "interval": [{}] - } - }, - "id": "a898563b-d2a4-4b15-a979-366872e801b0", - "name": "Schedule Trigger", - "type": "n8n-nodes-base.scheduleTrigger", - "typeVersion": 1, - "position": [420, 260] + { + "parameters": { + "rule": { + "interval": [ + {} + ] + } }, - { - "parameters": { - "options": {} - }, - "id": "b9a13e3d-bfa5-4873-959f-fd3d67e380d9", - "name": "Set", - "type": "n8n-nodes-base.set", - "typeVersion": 1, - "position": [640, 260] - } + "id": "54b1cdeb-b453-4568-8107-c17fcf2aa25a", + "name": "Schedule Trigger", + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1, + "position": [ + 240, + 560 + ] + }, + { + "parameters": { + "options": {} + }, + "id": "5f6dffef-61f7-459d-930c-ef701d08d49a", + "name": "Set", + "type": "n8n-nodes-base.set", + "typeVersion": 1, + "position": [ + 460, + 460 + ] + }, + { + "parameters": { + "rules": { + "rules": [ + { + "outputKey": "a" + } + ] + } + }, + "id": "c07d3a12-1ee2-4131-bec2-ab366457d042", + "name": "Old version Switch Node", + "type": "n8n-nodes-base.switch", + "typeVersion": 2, + "position": [ + 460, + 680 + ] + }, + { + "parameters": { + "options": {} + }, + "id": "182a833d-3b93-4e86-a0db-3ceb19d6562b", + "name": "Loop Over Items", + "type": "n8n-nodes-base.splitInBatches", + "typeVersion": 3, + "position": [ + 720, + 560 + ] + }, + { + "parameters": {}, + "id": "b0d0aeb7-0c8f-4810-8b78-6c0db3c9a486", + "name": "Replace Me", + "type": "n8n-nodes-base.noOp", + "typeVersion": 1, + "position": [ + 900, + 560 + ] + } ], "connections": { - "Schedule Trigger": { - "main": [ - [ - { - "node": "Set", - "type": "main", - "index": 0 - } - ] - ] - } - } -} + "Schedule Trigger": { + "main": [ + [ + { + "node": "Set", + "type": "main", + "index": 0 + }, + { + "node": "Old version Switch Node", + "type": "main", + "index": 0 + }, + { + "node": "Loop Over Items", + "type": "main", + "index": 0 + } + ] + ] + }, + "Loop Over Items": { + "main": [ + null, + [ + { + "node": "Replace Me", + "type": "main", + "index": 0 + } + ] + ] + }, + "Replace Me": { + "main": [ + [ + { + "node": "Loop Over Items", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "pinData": {} + } diff --git a/packages/workflow/src/TelemetryHelpers.ts b/packages/workflow/src/TelemetryHelpers.ts index e4c5ed30f4350..cdcf0f3a91340 100644 --- a/packages/workflow/src/TelemetryHelpers.ts +++ b/packages/workflow/src/TelemetryHelpers.ts @@ -184,7 +184,7 @@ export function generateNodesGraph( webhookNodeNames.push(node.name); } else { try { - const nodeType = nodeTypes.getByNameAndVersion(node.type); + const nodeType = nodeTypes.getByNameAndVersion(node.type, node.typeVersion); if (nodeType) { const nodeParameters = getNodeParameters( nodeType.description.properties, @@ -230,7 +230,7 @@ export function generateNodesGraph( Object.keys(connections).forEach((key) => { connections[key].forEach((element) => { - element.forEach((element2) => { + (element ?? []).forEach((element2) => { nodeGraph.node_connections.push(getGraphConnectionItem(nodeName, element2)); }); });