Skip to content

Commit c92701c

Browse files
authored
feat(editor): Change default node names depending on node operation and resource (#15954)
1 parent 33f8fab commit c92701c

File tree

21 files changed

+574
-182
lines changed

21 files changed

+574
-182
lines changed

cypress/e2e/11-inline-expression-editor.cy.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe('Inline expression editor', () => {
5050
beforeEach(() => {
5151
WorkflowPage.actions.addNodeToCanvas('Hacker News');
5252
WorkflowPage.actions.zoomToFit();
53-
WorkflowPage.actions.openNode('Hacker News');
53+
WorkflowPage.actions.openNode('Get many items');
5454
WorkflowPage.actions.openInlineExpressionEditor();
5555
});
5656

@@ -112,7 +112,7 @@ describe('Inline expression editor', () => {
112112
WorkflowPage.actions.addNodeToCanvas('No Operation');
113113
WorkflowPage.actions.addNodeToCanvas('Hacker News');
114114
WorkflowPage.actions.zoomToFit();
115-
WorkflowPage.actions.openNode('Hacker News');
115+
WorkflowPage.actions.openNode('Get many items');
116116
WorkflowPage.actions.openInlineExpressionEditor();
117117
});
118118

@@ -150,7 +150,7 @@ describe('Inline expression editor', () => {
150150
// Run workflow
151151
ndv.actions.close();
152152
WorkflowPage.actions.executeNode('No Operation, do nothing', { anchor: 'topLeft' });
153-
WorkflowPage.actions.openNode('Hacker News');
153+
WorkflowPage.actions.openNode('Get many items');
154154
WorkflowPage.actions.openInlineExpressionEditor();
155155

156156
// Previous nodes have run, input can be resolved

cypress/e2e/17-sharing.cy.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ describe('Sharing', { disableAutoLogin: true }, () => {
9696
ndv.actions.close();
9797
workflowPage.actions.saveWorkflowOnButtonClick();
9898

99-
workflowPage.actions.openNode('Notion');
99+
workflowPage.actions.openNode('Append a block');
100100
ndv.getters.credentialInput().should('have.value', 'Credential C1').should('be.disabled');
101101
ndv.actions.close();
102102
});
@@ -112,7 +112,7 @@ describe('Sharing', { disableAutoLogin: true }, () => {
112112
ndv.actions.close();
113113
workflowPage.actions.saveWorkflowOnButtonClick();
114114

115-
workflowPage.actions.openNode('Notion');
115+
workflowPage.actions.openNode('Append a block');
116116
ndv.getters
117117
.credentialInput()
118118
.find('input')
@@ -136,7 +136,7 @@ describe('Sharing', { disableAutoLogin: true }, () => {
136136
cy.visit(workflowsPage.url);
137137
workflowsPage.getters.workflowCards().should('have.length', 2);
138138
workflowsPage.getters.workflowCardContent('Workflow W1').click();
139-
workflowPage.actions.openNode('Notion');
139+
workflowPage.actions.openNode('Append a block');
140140
ndv.getters
141141
.credentialInput()
142142
.find('input')

cypress/e2e/39-projects.cy.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ describe('Projects', { disableAutoLogin: true }, () => {
157157
expect(interception.request.query).not.to.have.property('projectId');
158158
expect(interception.request.query).to.have.property('workflowId');
159159
});
160-
workflowPage.getters.canvasNodeByName(NOTION_NODE_NAME).should('be.visible').dblclick();
160+
workflowPage.getters.canvasNodeByName('Append a block').should('be.visible').dblclick();
161161
workflowPage.getters.nodeCredentialsSelect().first().click();
162162
getVisibleSelect()
163163
.find('li')
@@ -182,7 +182,7 @@ describe('Projects', { disableAutoLogin: true }, () => {
182182
workflowPage.actions.saveWorkflowOnButtonClick();
183183

184184
cy.reload();
185-
workflowPage.getters.canvasNodeByName(NOTION_NODE_NAME).should('be.visible').dblclick();
185+
workflowPage.getters.canvasNodeByName('Append a block').should('be.visible').dblclick();
186186
workflowPage.getters.nodeCredentialsSelect().first().click();
187187
getVisibleSelect()
188188
.find('li')
@@ -211,7 +211,7 @@ describe('Projects', { disableAutoLogin: true }, () => {
211211
workflowPage.actions.saveWorkflowOnButtonClick();
212212

213213
cy.reload();
214-
workflowPage.getters.canvasNodeByName(NOTION_NODE_NAME).should('be.visible').dblclick();
214+
workflowPage.getters.canvasNodeByName('Append a block').should('be.visible').dblclick();
215215
workflowPage.getters.nodeCredentialsSelect().first().click();
216216
getVisibleSelect()
217217
.find('li')
@@ -280,7 +280,7 @@ describe('Projects', { disableAutoLogin: true }, () => {
280280
workflowsPage.getters.workflowCards().first().findChildByTestId('card-content').click();
281281

282282
// Check if the credential can be changed
283-
workflowPage.getters.canvasNodeByName(NOTION_NODE_NAME).should('be.visible').dblclick();
283+
workflowPage.getters.canvasNodeByName('Append a block').should('be.visible').dblclick();
284284
ndv.getters.credentialInput().find('input').should('be.enabled');
285285
});
286286

cypress/e2e/4-node-creator.cy.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,15 +316,19 @@ describe('Node Creator', () => {
316316
nodeCreatorFeature.getters.getCreatorItem('Create a credential').click();
317317
NDVModal.actions.close();
318318
WorkflowPage.actions.deleteNode('When clicking ‘Execute workflow’');
319-
WorkflowPage.getters.canvasNodePlusEndpointByName('n8n').click();
319+
WorkflowPage.getters.canvasNodePlusEndpointByName('Create a credential').click();
320320
nodeCreatorFeature.getters.searchBar().find('input').clear().type('n8n');
321321
nodeCreatorFeature.getters.getCreatorItem('n8n').click();
322322
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
323323
nodeCreatorFeature.getters.getCreatorItem('Create a credential').click();
324324
NDVModal.actions.close();
325325
WorkflowPage.getters.canvasNodes().should('have.length', 2);
326326
WorkflowPage.actions.zoomToFit();
327-
WorkflowPage.actions.addNodeBetweenNodes('n8n', 'n8n1', 'Summarize');
327+
WorkflowPage.actions.addNodeBetweenNodes(
328+
'Create a credential',
329+
'Create a credential1',
330+
'Summarize',
331+
);
328332
WorkflowPage.getters.canvasNodes().should('have.length', 3);
329333
});
330334
});

cypress/e2e/41-editors.cy.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ describe('Editors', () => {
2424
.type('SELECT * FROM `testTable`', { delay: TYPING_DELAY })
2525
.type('{esc}');
2626
ndv.actions.close();
27-
workflowPage.actions.openNode('Postgres');
27+
workflowPage.actions.openNode('Execute a SQL query');
2828
ndv.getters
2929
.sqlEditorContainer()
3030
.find('.cm-content')
3131
.type('{end} LIMIT 10', { delay: TYPING_DELAY })
3232
.type('{esc}');
3333
ndv.actions.close();
34-
workflowPage.actions.openNode('Postgres');
34+
workflowPage.actions.openNode('Execute a SQL query');
3535
ndv.getters.sqlEditorContainer().should('contain', 'SELECT * FROM `testTable` LIMIT 10');
3636
});
3737

@@ -45,7 +45,7 @@ describe('Editors', () => {
4545
ndv.actions.setPinnedData([{ table: 'test_table' }]);
4646
ndv.actions.close();
4747

48-
workflowPage.actions.openNode('MySQL');
48+
workflowPage.actions.openNode('Execute a SQL query');
4949
ndv.getters
5050
.sqlEditorContainer()
5151
.find('.cm-content')
@@ -86,7 +86,7 @@ describe('Editors', () => {
8686
ndv.actions.close();
8787
workflowPage.actions.saveWorkflowOnButtonClick();
8888
workflowPage.getters.isWorkflowSaved();
89-
workflowPage.actions.openNode('Postgres');
89+
workflowPage.actions.openNode('Execute a SQL query');
9090
ndv.actions.close();
9191
// Workflow should still be saved
9292
workflowPage.getters.isWorkflowSaved();
@@ -100,7 +100,7 @@ describe('Editors', () => {
100100
ndv.actions.close();
101101
workflowPage.actions.saveWorkflowOnButtonClick();
102102
workflowPage.getters.isWorkflowSaved();
103-
workflowPage.actions.openNode('Postgres');
103+
workflowPage.actions.openNode('Execute a SQL query');
104104
ndv.getters
105105
.sqlEditorContainer()
106106
.click()
@@ -131,14 +131,14 @@ describe('Editors', () => {
131131
.paste('SELECT * FROM `secondTable`');
132132
ndv.actions.close();
133133

134-
workflowPage.actions.openNode('Postgres');
135-
ndv.actions.clickFloatingNode('Postgres1');
134+
workflowPage.actions.openNode('Execute a SQL query');
135+
ndv.actions.clickFloatingNode('Execute a SQL query1');
136136
ndv.getters
137137
.sqlEditorContainer()
138138
.find('.cm-content')
139139
.should('have.text', 'SELECT * FROM `secondTable`');
140140

141-
ndv.actions.clickFloatingNode('Postgres');
141+
ndv.actions.clickFloatingNode('Execute a SQL query');
142142
ndv.getters
143143
.sqlEditorContainer()
144144
.find('.cm-content')

cypress/e2e/45-ai-assistant.cy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ describe('AI Assistant Credential Help', () => {
364364
}).as('chatRequest');
365365
wf.actions.addNodeToCanvas(SCHEDULE_TRIGGER_NODE_NAME);
366366
wf.actions.addNodeToCanvas(GMAIL_NODE_NAME);
367-
wf.actions.openNode('Gmail');
367+
wf.actions.openNode('Add label to message');
368368
openCredentialSelect();
369369
clickCreateNewCredential();
370370
aiAssistant.getters.credentialEditAssistantButton().find('button').should('be.visible');

cypress/e2e/5-ndv.cy.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,11 @@ describe('NDV', () => {
8686
cy.get('[class*=hasIssues]').should('have.length', 1);
8787
});
8888

89-
it('should show validation errors only after blur or re-opening of NDV', () => {
89+
it('should show validation errors only after blur or re-opening of NDV of a node with operation and resource', () => {
9090
workflowPage.actions.addNodeToCanvas('Manual');
9191
workflowPage.actions.addNodeToCanvas('Airtable', true, true, 'Search records');
9292
ndv.getters.container().should('be.visible');
93-
cy.get('.has-issues').should('have.length', 0);
94-
ndv.getters.parameterInput('table').find('input').eq(1).focus().blur();
95-
ndv.getters.parameterInput('base').find('input').eq(1).focus().blur();
9693
cy.get('.has-issues').should('have.length', 2);
97-
ndv.getters.backToCanvas().click();
98-
workflowPage.actions.openNode('Airtable');
99-
cy.get('.has-issues').should('have.length', 2);
100-
cy.get('[class*=hasIssues]').should('have.length', 1);
10194
});
10295

10396
// Correctly failing in V2 - node issues are only shows after execution

cypress/e2e/9-expression-editor-modal.cy.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('Expression editor modal', () => {
1717
beforeEach(() => {
1818
WorkflowPage.actions.addNodeToCanvas('Hacker News');
1919
WorkflowPage.actions.zoomToFit();
20-
WorkflowPage.actions.openNode('Hacker News');
20+
WorkflowPage.actions.openNode('Get many items');
2121
WorkflowPage.actions.openExpressionEditorModal();
2222
});
2323

@@ -34,7 +34,7 @@ describe('Expression editor modal', () => {
3434
beforeEach(() => {
3535
WorkflowPage.actions.addNodeToCanvas('Hacker News');
3636
WorkflowPage.actions.zoomToFit();
37-
WorkflowPage.actions.openNode('Hacker News');
37+
WorkflowPage.actions.openNode('Get many items');
3838
WorkflowPage.actions.openExpressionEditorModal();
3939
});
4040

@@ -90,7 +90,7 @@ describe('Expression editor modal', () => {
9090
WorkflowPage.actions.addNodeToCanvas('No Operation');
9191
WorkflowPage.actions.addNodeToCanvas('Hacker News');
9292
WorkflowPage.actions.zoomToFit();
93-
WorkflowPage.actions.openNode('Hacker News');
93+
WorkflowPage.actions.openNode('Get many items');
9494
WorkflowPage.actions.openExpressionEditorModal();
9595
});
9696

@@ -125,7 +125,7 @@ describe('Expression editor modal', () => {
125125
cy.get('body').type('{esc}');
126126
ndv.actions.close();
127127
WorkflowPage.actions.executeNode('No Operation, do nothing', { anchor: 'topLeft' });
128-
WorkflowPage.actions.openNode('Hacker News');
128+
WorkflowPage.actions.openNode('Get many items');
129129
WorkflowPage.actions.openExpressionEditorModal();
130130

131131
// Previous nodes have run, input can be resolved

cypress/pages/workflow.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export class WorkflowPage extends BasePage {
217217
cy.get('body').then((body) => {
218218
if (body.find('[data-test-id=node-creator]').length > 0) {
219219
if (action) {
220-
cy.contains(action).click();
220+
cy.get('[data-keyboard-nav-type="action"]').contains(action).click();
221221
} else {
222222
// Select the first action
223223
if (body.find('[data-keyboard-nav-type="action"]').length > 0) {

packages/cli/src/__tests__/manual-execution.service.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,11 @@ describe('ManualExecutionService', () => {
562562
return null;
563563
}),
564564
getTriggerNodes: jest.fn().mockReturnValue([determinedStartNode]),
565+
nodeTypes: {
566+
getByNameAndVersion: jest
567+
.fn()
568+
.mockReturnValue({ description: { name: '', outputs: [] } }),
569+
},
565570
});
566571

567572
jest

packages/cli/src/manual-execution.service.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ import {
66
filterDisabledNodes,
77
recreateNodeExecutionStack,
88
WorkflowExecute,
9-
isTool,
109
rewireGraph,
1110
} from 'n8n-core';
12-
import { MANUAL_TRIGGER_NODE_TYPE } from 'n8n-workflow';
11+
import { MANUAL_TRIGGER_NODE_TYPE, NodeHelpers } from 'n8n-workflow';
1312
import type {
1413
IExecuteData,
1514
IPinData,
@@ -136,8 +135,12 @@ export class ManualExecutionService {
136135
`Could not find a node named "${data.destinationNode}" in the workflow.`,
137136
);
138137

138+
const destinationNodeType = workflow.nodeTypes.getByNameAndVersion(
139+
destinationNode.type,
140+
destinationNode.typeVersion,
141+
);
139142
// Rewire graph to be able to execute the destination tool node
140-
if (isTool(destinationNode, workflow.nodeTypes)) {
143+
if (NodeHelpers.isTool(destinationNodeType.description, destinationNode.parameters)) {
141144
const graph = rewireGraph(
142145
destinationNode,
143146
DirectedGraph.fromWorkflow(workflow),

packages/core/src/execution-engine/partial-execution-utils/__tests__/is-tool.test.ts

Lines changed: 0 additions & 102 deletions
This file was deleted.

packages/core/src/execution-engine/partial-execution-utils/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ export { recreateNodeExecutionStack } from './recreate-node-execution-stack';
66
export { cleanRunData } from './clean-run-data';
77
export { handleCycles } from './handle-cycles';
88
export { filterDisabledNodes } from './filter-disabled-nodes';
9-
export { isTool } from './is-tool';
109
export { rewireGraph } from './rewire-graph';
1110
export { getNextExecutionIndex } from './run-data-utils';

0 commit comments

Comments
 (0)