2022-11-25 04:52:33 -08:00
|
|
|
import { NodeCreator } from '../pages/features/node-creator';
|
2023-02-17 06:08:26 -08:00
|
|
|
import { WorkflowPage as WorkflowPageClass } from '../pages/workflow';
|
|
|
|
import { NDV } from '../pages/ndv';
|
2023-07-28 00:51:07 -07:00
|
|
|
import { getVisibleSelect } from '../utils';
|
2023-12-13 05:45:22 -08:00
|
|
|
import { IF_NODE_NAME } from '../constants';
|
2022-11-25 04:52:33 -08:00
|
|
|
|
|
|
|
const nodeCreatorFeature = new NodeCreator();
|
2023-02-17 06:08:26 -08:00
|
|
|
const WorkflowPage = new WorkflowPageClass();
|
|
|
|
const NDVModal = new NDV();
|
2022-11-25 04:52:33 -08:00
|
|
|
|
|
|
|
describe('Node Creator', () => {
|
|
|
|
beforeEach(() => {
|
2023-03-08 06:11:13 -08:00
|
|
|
WorkflowPage.actions.visit();
|
2022-11-25 04:52:33 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should open node creator on trigger tab if no trigger is on canvas', () => {
|
|
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
|
|
|
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.nodeCreator()
|
|
|
|
.contains('What triggers this workflow?')
|
|
|
|
.should('be.visible');
|
2022-11-25 04:52:33 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should navigate subcategory', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
2023-02-17 06:08:26 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On app event').click();
|
|
|
|
nodeCreatorFeature.getters.activeSubcategory().should('have.text', 'On app event');
|
2022-11-25 04:52:33 -08:00
|
|
|
// Go back
|
2022-12-15 07:39:59 -08:00
|
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').click();
|
2023-02-17 06:08:26 -08:00
|
|
|
nodeCreatorFeature.getters.activeSubcategory().should('not.have.text', 'On app event');
|
2022-12-15 07:39:59 -08:00
|
|
|
});
|
2022-11-25 04:52:33 -08:00
|
|
|
|
|
|
|
it('should search for nodes', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('manual');
|
2024-01-09 03:11:39 -08:00
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 2);
|
2022-11-25 04:52:33 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('manual123');
|
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
2022-12-15 07:39:59 -08:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.noResults()
|
|
|
|
.should('exist')
|
|
|
|
.should('contain.text', "We didn't make that... yet");
|
2022-11-25 04:52:33 -08:00
|
|
|
|
feat(editor): Node creator actions (#4696)
* WIP: Node Actions List UI
* WIP: Recommended Actions and preseting of fields
* WIP: Resource category
* :art: Moved actions categorisation to the server
* :label: Add missing INodeAction type
* :sparkles: Improve SSR categorisation, fix adding of mixed actions
* :recycle: Refactor CategorizedItems to composition api, style fixes
* WIP: Adding multiple nodes
* :recycle: Refactor rest of the NodeCreator component to composition API, conver globalLinkActions to composable
* :sparkles: Allow actions dragging, fix search and refactor passing of actions to categorized items
* :lipstick: Fix node actions title
* Migrate to the pinia store, add posthog feature and various fixes
* :bug: Fix filtering of trigger actions when not merged
* fix: N8N-5439 — Do not use simple node item when at NodeHelperPanel root
* :bug: Design review fixes
* :bug: Fix disabling of merged actions
* Fix trigger root filtering
* :sparkles: Allow for custom node actions parser, introduce hubspot parser
* :bug: Fix initial node params validation, fix position of second added node
* :bug: Introduce operations category, removed canvas node names overrride, fix API actions display and prevent dragging of action nodes
* :sparkles: Prevent NDV auto-open feature flag
* :bug: Inject recommened action for trigger nodes without actions
* Refactored NodeCreatorNode to Storybook, change filtering of merged nodes for the trigger helper panel, minor fixes
* Improve rendering of app nodes and animation
* Cleanup, any only enable accordion transition on triggerhelperpanel
* Hide node creator scrollbars in Firefox
* Minor styles fixes
* Do not copy the array in rendering method
* Removed unused props
* Fix memory leak
* Fix categorisation of regular nodes with a single resource
* Implement telemetry calls for node actions
* Move categorization to FE
* Fix client side actions categorisation
* Skip custom action show
* Only load tooltip for NodeIcon if necessary
* Fix lodash startCase import
* Remove lodash.startcase
* Cleanup
* Fix node creator autofocus on "tab"
* Prevent posthog getFeatureFlag from crashing
* Debugging preview env search issues
* Remove logs
* Make sure the pre-filled params are update not overwritten
* Get rid of transition in itemiterator
* WIP: Rough version of NodeActions keyboard navigation, replace nodeCreator composable with Pinia store module
* Rewrite to add support for ActionItem to ItemIterator and make CategorizedItems accept items props
* Fix category item counter & cleanup
* Add APIHint to actions search no-result, clean up NodeCreatorNode
* Improve node actions no results message
* Remove logging, fix filtering of recommended placeholder category
* Remove unused NodeActions component and node merging feature falg
* Do not show regular nodes without actions
* Make sure to add manual trigger when adding http node via actions hint
* Fixed api hint footer line height
* Prevent pointer-events od NodeIcon img and remove "this" from template
* Address PR points
* Fix e2e specs
* Make sure canvas ia loaded
* Make sure canvas ia loaded before opening nodeCreator in e2e spec
* Fix flaky workflows tags e2e getter
* Imrpove node creator click outside UX, add manual node to regular nodes added from trigger panel
* Add manual trigger node if dragging regular from trigger panel
2022-12-09 01:56:36 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image');
|
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 1);
|
|
|
|
|
2022-12-15 07:39:59 -08:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('this node totally does not exist');
|
feat(editor): Node creator actions (#4696)
* WIP: Node Actions List UI
* WIP: Recommended Actions and preseting of fields
* WIP: Resource category
* :art: Moved actions categorisation to the server
* :label: Add missing INodeAction type
* :sparkles: Improve SSR categorisation, fix adding of mixed actions
* :recycle: Refactor CategorizedItems to composition api, style fixes
* WIP: Adding multiple nodes
* :recycle: Refactor rest of the NodeCreator component to composition API, conver globalLinkActions to composable
* :sparkles: Allow actions dragging, fix search and refactor passing of actions to categorized items
* :lipstick: Fix node actions title
* Migrate to the pinia store, add posthog feature and various fixes
* :bug: Fix filtering of trigger actions when not merged
* fix: N8N-5439 — Do not use simple node item when at NodeHelperPanel root
* :bug: Design review fixes
* :bug: Fix disabling of merged actions
* Fix trigger root filtering
* :sparkles: Allow for custom node actions parser, introduce hubspot parser
* :bug: Fix initial node params validation, fix position of second added node
* :bug: Introduce operations category, removed canvas node names overrride, fix API actions display and prevent dragging of action nodes
* :sparkles: Prevent NDV auto-open feature flag
* :bug: Inject recommened action for trigger nodes without actions
* Refactored NodeCreatorNode to Storybook, change filtering of merged nodes for the trigger helper panel, minor fixes
* Improve rendering of app nodes and animation
* Cleanup, any only enable accordion transition on triggerhelperpanel
* Hide node creator scrollbars in Firefox
* Minor styles fixes
* Do not copy the array in rendering method
* Removed unused props
* Fix memory leak
* Fix categorisation of regular nodes with a single resource
* Implement telemetry calls for node actions
* Move categorization to FE
* Fix client side actions categorisation
* Skip custom action show
* Only load tooltip for NodeIcon if necessary
* Fix lodash startCase import
* Remove lodash.startcase
* Cleanup
* Fix node creator autofocus on "tab"
* Prevent posthog getFeatureFlag from crashing
* Debugging preview env search issues
* Remove logs
* Make sure the pre-filled params are update not overwritten
* Get rid of transition in itemiterator
* WIP: Rough version of NodeActions keyboard navigation, replace nodeCreator composable with Pinia store module
* Rewrite to add support for ActionItem to ItemIterator and make CategorizedItems accept items props
* Fix category item counter & cleanup
* Add APIHint to actions search no-result, clean up NodeCreatorNode
* Improve node actions no results message
* Remove logging, fix filtering of recommended placeholder category
* Remove unused NodeActions component and node merging feature falg
* Do not show regular nodes without actions
* Make sure to add manual trigger when adding http node via actions hint
* Fixed api hint footer line height
* Prevent pointer-events od NodeIcon img and remove "this" from template
* Address PR points
* Fix e2e specs
* Make sure canvas ia loaded
* Make sure canvas ia loaded before opening nodeCreator in e2e spec
* Fix flaky workflows tags e2e getter
* Imrpove node creator click outside UX, add manual node to regular nodes added from trigger panel
* Add manual trigger node if dragging regular from trigger panel
2022-12-09 01:56:36 -08:00
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
|
|
|
|
2022-12-15 07:39:59 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear();
|
2023-02-17 06:08:26 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On app event').click();
|
feat(editor): Node creator actions (#4696)
* WIP: Node Actions List UI
* WIP: Recommended Actions and preseting of fields
* WIP: Resource category
* :art: Moved actions categorisation to the server
* :label: Add missing INodeAction type
* :sparkles: Improve SSR categorisation, fix adding of mixed actions
* :recycle: Refactor CategorizedItems to composition api, style fixes
* WIP: Adding multiple nodes
* :recycle: Refactor rest of the NodeCreator component to composition API, conver globalLinkActions to composable
* :sparkles: Allow actions dragging, fix search and refactor passing of actions to categorized items
* :lipstick: Fix node actions title
* Migrate to the pinia store, add posthog feature and various fixes
* :bug: Fix filtering of trigger actions when not merged
* fix: N8N-5439 — Do not use simple node item when at NodeHelperPanel root
* :bug: Design review fixes
* :bug: Fix disabling of merged actions
* Fix trigger root filtering
* :sparkles: Allow for custom node actions parser, introduce hubspot parser
* :bug: Fix initial node params validation, fix position of second added node
* :bug: Introduce operations category, removed canvas node names overrride, fix API actions display and prevent dragging of action nodes
* :sparkles: Prevent NDV auto-open feature flag
* :bug: Inject recommened action for trigger nodes without actions
* Refactored NodeCreatorNode to Storybook, change filtering of merged nodes for the trigger helper panel, minor fixes
* Improve rendering of app nodes and animation
* Cleanup, any only enable accordion transition on triggerhelperpanel
* Hide node creator scrollbars in Firefox
* Minor styles fixes
* Do not copy the array in rendering method
* Removed unused props
* Fix memory leak
* Fix categorisation of regular nodes with a single resource
* Implement telemetry calls for node actions
* Move categorization to FE
* Fix client side actions categorisation
* Skip custom action show
* Only load tooltip for NodeIcon if necessary
* Fix lodash startCase import
* Remove lodash.startcase
* Cleanup
* Fix node creator autofocus on "tab"
* Prevent posthog getFeatureFlag from crashing
* Debugging preview env search issues
* Remove logs
* Make sure the pre-filled params are update not overwritten
* Get rid of transition in itemiterator
* WIP: Rough version of NodeActions keyboard navigation, replace nodeCreator composable with Pinia store module
* Rewrite to add support for ActionItem to ItemIterator and make CategorizedItems accept items props
* Fix category item counter & cleanup
* Add APIHint to actions search no-result, clean up NodeCreatorNode
* Improve node actions no results message
* Remove logging, fix filtering of recommended placeholder category
* Remove unused NodeActions component and node merging feature falg
* Do not show regular nodes without actions
* Make sure to add manual trigger when adding http node via actions hint
* Fixed api hint footer line height
* Prevent pointer-events od NodeIcon img and remove "this" from template
* Address PR points
* Fix e2e specs
* Make sure canvas ia loaded
* Make sure canvas ia loaded before opening nodeCreator in e2e spec
* Fix flaky workflows tags e2e getter
* Imrpove node creator click outside UX, add manual node to regular nodes added from trigger panel
* Add manual trigger node if dragging regular from trigger panel
2022-12-09 01:56:36 -08:00
|
|
|
|
2022-11-25 04:52:33 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Results in other categories').should('exist');
|
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 1);
|
2022-11-25 04:52:33 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Edit Image').should('exist');
|
2023-02-17 06:08:26 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image123123');
|
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
2022-12-15 07:39:59 -08:00
|
|
|
});
|
2022-11-25 04:52:33 -08:00
|
|
|
|
2023-02-17 06:08:26 -08:00
|
|
|
it('should check correct view panels', () => {
|
2022-11-25 04:52:33 -08:00
|
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
2023-02-17 06:08:26 -08:00
|
|
|
WorkflowPage.actions.addNodeToCanvas('Manual', false);
|
2022-11-25 04:52:33 -08:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.canvasAddButton().should('not.be.visible');
|
|
|
|
nodeCreatorFeature.getters.nodeCreator().should('not.exist');
|
|
|
|
|
|
|
|
// TODO: Replace once we have canvas feature utils
|
2023-02-17 06:08:26 -08:00
|
|
|
cy.get('div').contains('Add first step').should('be.hidden');
|
2023-02-24 09:07:35 -08:00
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.nodeCreator().contains('What happens next?').should('be.visible');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Add another trigger').click();
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.nodeCreator()
|
|
|
|
.contains('What triggers this workflow?')
|
|
|
|
.should('be.visible');
|
2023-02-24 09:07:35 -08:00
|
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').should('exist');
|
|
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').click();
|
|
|
|
nodeCreatorFeature.getters.nodeCreator().contains('What happens next?').should('be.visible');
|
2022-12-15 07:39:59 -08:00
|
|
|
});
|
2022-11-25 04:52:33 -08:00
|
|
|
|
2023-02-17 06:08:26 -08:00
|
|
|
it('should add node to canvas from actions panel', () => {
|
|
|
|
const editImageNode = 'Edit Image';
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type(editImageNode);
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem(editImageNode).click();
|
|
|
|
nodeCreatorFeature.getters.activeSubcategory().should('have.text', editImageNode);
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Crop Image').click();
|
2023-07-28 00:51:07 -07:00
|
|
|
NDVModal.getters.parameterInput('operation').find('input').should('have.value', 'Crop');
|
2023-02-24 09:07:35 -08:00
|
|
|
});
|
2023-02-17 06:08:26 -08:00
|
|
|
|
2023-02-20 06:59:38 -08:00
|
|
|
it('should search through actions and confirm added action', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('ftp');
|
2023-03-02 07:50:21 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('{rightarrow}');
|
2023-02-20 06:59:38 -08:00
|
|
|
nodeCreatorFeature.getters.activeSubcategory().should('have.text', 'FTP');
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('file');
|
feat(editor): Add sections to create node panel (#7831)
This PR sets the stage for the node creator to handle sections within
subcategories. No visible changes result from this PR; the next PR will
define sections and assign nodes accordingly.
Sections are configurable in
`packages/editor-ui/src/components/Node/NodeCreator/viewsData.ts`:
```
{
type: 'subcategory',
key: FILES_SUBCATEGORY,
category: CORE_NODES_CATEGORY,
properties: {
title: FILES_SUBCATEGORY,
icon: 'file-alt',
sections: [
{
key: 'popular',
title: i18n.baseText('nodeCreator.sectionNames.popular'),
items: ['n8n-nodes-base.readBinaryFiles', 'n8n-nodes-base.compression'],
},
],
},
},
```
For example:
<img width="302" alt="image"
src="https://github.com/n8n-io/n8n/assets/8850410/74470c07-f4ea-4306-bd4a-8d33bd769b86">
---------
Co-authored-by: Michael Kret <michael.k@radency.com>
2023-12-04 01:02:07 -08:00
|
|
|
// The 1st trigger is selected, up 1x to the collapsable header, up 2x to the last action (rename)
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('{uparrow}{uparrow}{rightarrow}');
|
2023-07-28 00:51:07 -07:00
|
|
|
NDVModal.getters.parameterInput('operation').find('input').should('have.value', 'Rename');
|
|
|
|
});
|
2023-02-20 06:59:38 -08:00
|
|
|
|
2023-03-14 08:41:49 -07:00
|
|
|
it('should not show actions for single action nodes', () => {
|
|
|
|
const singleActionNodes = [
|
|
|
|
'DHL',
|
2024-01-03 03:08:16 -08:00
|
|
|
'Edit Fields',
|
2023-03-14 08:41:49 -07:00
|
|
|
'LingvaNex',
|
|
|
|
'Mailcheck',
|
|
|
|
'MSG91',
|
|
|
|
'OpenThesaurus',
|
|
|
|
'Spontit',
|
|
|
|
'Vonage',
|
|
|
|
'Send Email',
|
2023-07-28 00:51:07 -07:00
|
|
|
'Toggl Trigger',
|
|
|
|
];
|
|
|
|
const doubleActionNode = 'OpenWeatherMap';
|
2023-03-14 08:41:49 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
singleActionNodes.forEach((node) => {
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type(node);
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCreatorItem(node)
|
|
|
|
.find('button[class*="panelIcon"]')
|
|
|
|
.should('not.exist');
|
|
|
|
});
|
2023-03-14 08:41:49 -07:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type(doubleActionNode);
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem(doubleActionNode).click();
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 4);
|
2023-07-28 00:51:07 -07:00
|
|
|
});
|
2023-03-14 08:41:49 -07:00
|
|
|
|
2023-04-26 00:18:10 -07:00
|
|
|
it('should have "Actions" section collapsed when opening actions view from Trigger root view', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('ActiveCampaign');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('ActiveCampaign').click();
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').should('exist');
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Triggers').should('exist');
|
|
|
|
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Triggers')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'false');
|
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Actions')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'true');
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
|
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Actions')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'false');
|
2023-04-26 00:18:10 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should have "Triggers" section collapsed when opening actions view from Regular root view', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Manually').click();
|
|
|
|
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('n8n');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('n8n').click();
|
|
|
|
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Actions')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'false');
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
|
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Actions')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'true');
|
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Triggers')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'true');
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Triggers').click();
|
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.getCategoryItem('Triggers')
|
|
|
|
.parent()
|
|
|
|
.should('have.attr', 'data-category-collapsed', 'false');
|
2023-04-26 00:18:10 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should show callout and two suggested nodes if node has no trigger actions', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('Customer Datastore (n8n training)');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Customer Datastore (n8n training)').click();
|
|
|
|
|
|
|
|
cy.getByTestId('actions-panel-no-triggers-callout').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On a Schedule').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On a Webhook call').should('be.visible');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should show intro callout if user has not made a production execution', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('Customer Datastore (n8n training)');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Customer Datastore (n8n training)').click();
|
|
|
|
|
|
|
|
cy.getByTestId('actions-panel-activation-callout').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').click();
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear();
|
2023-04-26 00:18:10 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On a schedule').click();
|
|
|
|
|
|
|
|
// Setup 1s interval execution
|
|
|
|
cy.getByTestId('parameter-input-field').click();
|
2023-07-28 00:51:07 -07:00
|
|
|
getVisibleSelect().find('.option-headline').contains('Seconds').click();
|
2023-04-26 00:18:10 -07:00
|
|
|
cy.getByTestId('parameter-input-secondsInterval').clear().type('1');
|
|
|
|
|
|
|
|
NDVModal.actions.close();
|
|
|
|
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('Customer Datastore (n8n training)');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Customer Datastore (n8n training)').click();
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Get All People').click();
|
|
|
|
NDVModal.actions.close();
|
|
|
|
|
|
|
|
WorkflowPage.actions.saveWorkflowOnButtonClick();
|
|
|
|
WorkflowPage.actions.activateWorkflow();
|
|
|
|
WorkflowPage.getters.activatorSwitch().should('have.class', 'is-checked');
|
|
|
|
|
|
|
|
// Wait for schedule 1s execution to mark user as having made a production execution
|
|
|
|
cy.wait(1500);
|
2023-07-28 00:51:07 -07:00
|
|
|
cy.reload();
|
2023-04-26 00:18:10 -07:00
|
|
|
|
|
|
|
// Action callout should not be visible after user has made a production execution
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('Customer Datastore (n8n training)');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Customer Datastore (n8n training)').click();
|
|
|
|
|
|
|
|
cy.getByTestId('actions-panel-activation-callout').should('not.exist');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should show Trigger and Actions sections during search', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
|
2023-07-28 00:51:07 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.searchBar()
|
|
|
|
.find('input')
|
|
|
|
.clear()
|
|
|
|
.type('Customer Datastore (n8n training)');
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Customer Datastore (n8n training)').click();
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('Non existent action name');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Triggers').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').should('be.visible');
|
|
|
|
cy.getByTestId('actions-panel-no-triggers-callout').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On a Schedule').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('On a Webhook call').should('be.visible');
|
|
|
|
});
|
|
|
|
|
2023-03-09 06:22:12 -08:00
|
|
|
describe('should correctly append manual trigger for regular actions', () => {
|
|
|
|
// For these sources, manual node should be added
|
|
|
|
const sourcesWithAppend = [
|
|
|
|
{
|
|
|
|
name: 'canvas add button',
|
|
|
|
handler: () => nodeCreatorFeature.getters.canvasAddButton().click(),
|
2023-07-28 00:51:07 -07:00
|
|
|
},
|
|
|
|
{
|
2023-03-09 06:22:12 -08:00
|
|
|
name: 'plus button',
|
|
|
|
handler: () => nodeCreatorFeature.getters.plusButton().click(),
|
|
|
|
},
|
|
|
|
// We can't test this one because it's not possible to trigger tab key in Cypress
|
|
|
|
// only way is to use `realPress` which is hanging the tests in Electron for some reason
|
|
|
|
// {
|
|
|
|
// name: 'tab key',
|
|
|
|
// handler: () => cy.realPress('Tab'),
|
|
|
|
// },
|
2023-07-28 00:51:07 -07:00
|
|
|
];
|
2023-03-09 06:22:12 -08:00
|
|
|
sourcesWithAppend.forEach((source) => {
|
|
|
|
it(`should append manual trigger when source is ${source.name}`, () => {
|
2023-07-28 00:51:07 -07:00
|
|
|
source.handler();
|
2023-03-09 06:22:12 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('n8n');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('n8n').click();
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
|
2023-03-09 06:22:12 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Create a credential').click();
|
|
|
|
NDVModal.actions.close();
|
|
|
|
WorkflowPage.getters.canvasNodes().should('have.length', 2);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2023-07-28 00:51:07 -07:00
|
|
|
// @TODO FIX ADDING 2 NODES IN ONE GO
|
2023-03-09 06:22:12 -08:00
|
|
|
it('should not append manual trigger when source is canvas related', () => {
|
|
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('n8n');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('n8n').click();
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
|
2023-03-09 06:22:12 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Create a credential').click();
|
|
|
|
NDVModal.actions.close();
|
2024-01-22 00:20:02 -08:00
|
|
|
WorkflowPage.actions.deleteNode('When clicking "Test workflow"');
|
2023-07-28 00:51:07 -07:00
|
|
|
WorkflowPage.getters.canvasNodePlusEndpointByName('n8n').click();
|
2023-03-09 06:22:12 -08:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('n8n');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('n8n').click();
|
2023-04-26 00:18:10 -07:00
|
|
|
nodeCreatorFeature.getters.getCategoryItem('Actions').click();
|
2023-03-09 06:22:12 -08:00
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Create a credential').click();
|
|
|
|
NDVModal.actions.close();
|
|
|
|
WorkflowPage.getters.canvasNodes().should('have.length', 2);
|
|
|
|
WorkflowPage.actions.zoomToFit();
|
2023-12-08 02:40:05 -08:00
|
|
|
WorkflowPage.actions.addNodeBetweenNodes('n8n', 'n8n1', 'Summarize');
|
2023-03-09 06:22:12 -08:00
|
|
|
WorkflowPage.getters.canvasNodes().should('have.length', 3);
|
2023-07-28 00:51:07 -07:00
|
|
|
});
|
2023-03-09 06:22:12 -08:00
|
|
|
});
|
2023-09-20 07:47:51 -07:00
|
|
|
|
2023-10-06 06:31:18 -07:00
|
|
|
it('should correctly append a No Op node when Loop Over Items node is added (from add button)', () => {
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('Loop Over Items');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Loop Over Items').click();
|
|
|
|
NDVModal.actions.close();
|
|
|
|
|
|
|
|
WorkflowPage.getters.canvasNodes().should('have.length', 3);
|
|
|
|
WorkflowPage.getters.nodeConnections().should('have.length', 3);
|
|
|
|
|
|
|
|
WorkflowPage.getters.getConnectionBetweenNodes('Loop Over Items', 'Replace Me').should('exist');
|
|
|
|
WorkflowPage.getters.getConnectionBetweenNodes('Replace Me', 'Loop Over Items').should('exist');
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should correctly append a No Op node when Loop Over Items node is added (from connection)', () => {
|
|
|
|
WorkflowPage.actions.addNodeToCanvas('Manual');
|
|
|
|
cy.get('.plus-endpoint').should('be.visible').click();
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('Loop Over Items');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Loop Over Items').click();
|
|
|
|
NDVModal.actions.close();
|
|
|
|
|
|
|
|
WorkflowPage.getters.canvasNodes().should('have.length', 3);
|
|
|
|
WorkflowPage.getters.nodeConnections().should('have.length', 3);
|
|
|
|
|
|
|
|
WorkflowPage.getters.getConnectionBetweenNodes('Loop Over Items', 'Replace Me').should('exist');
|
|
|
|
WorkflowPage.getters.getConnectionBetweenNodes('Replace Me', 'Loop Over Items').should('exist');
|
|
|
|
});
|
|
|
|
|
2023-09-20 07:47:51 -07:00
|
|
|
it('should have most relevenat nodes on top when searching', () => {
|
|
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('email');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Email Trigger (IMAP)');
|
|
|
|
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('Set');
|
2023-09-20 07:47:51 -07:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Edit Fields (Set)');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('i');
|
2023-12-13 05:45:22 -08:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', IF_NODE_NAME);
|
2023-09-20 07:47:51 -07:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Switch');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('sw');
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('Edit F');
|
2023-09-20 07:47:51 -07:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Edit Fields (Set)');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('i');
|
2023-12-13 05:45:22 -08:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', IF_NODE_NAME);
|
2023-09-20 07:47:51 -07:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Switch');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('IF');
|
2023-12-13 05:45:22 -08:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', IF_NODE_NAME);
|
2023-09-20 07:47:51 -07:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Switch');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('sw');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Switch');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('swit');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Switch');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('red');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Redis');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Reddit');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('redd');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Reddit');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('wh');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Webhook');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('web');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Webflow');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Webhook');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('webh');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Webhook');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('func');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Code');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('cod');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Coda');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Code');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('code');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Code');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('js');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Code');
|
2023-12-08 02:40:05 -08:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Edit Fields (Set)');
|
2023-09-20 07:47:51 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('fi');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Filter');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('filt');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Filter');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('manu');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Manual Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('sse');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'SSE Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('cmpar');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Compare Datasets');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('fb');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Facebook Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('crn');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Schedule Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('cron');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Schedule Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('sch');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Schedule Trigger');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('time');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Schedule Trigger');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(2).should('have.text', 'Wait');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('mail');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Mailgun');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('mailc');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Mailcheck');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Mailchimp');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('api');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'HTTP Request');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('s3');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'S3');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('no op');
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.nodeItemName()
|
|
|
|
.first()
|
|
|
|
.should('have.text', 'No Operation, do nothing');
|
2023-09-20 07:47:51 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('do no');
|
2023-10-05 06:19:19 -07:00
|
|
|
nodeCreatorFeature.getters
|
|
|
|
.nodeItemName()
|
|
|
|
.first()
|
|
|
|
.should('have.text', 'No Operation, do nothing');
|
2023-09-20 07:47:51 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('htt');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'HTTP Request');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Webhook');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('http');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'HTTP Request');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Webhook');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('wa');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Wait');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('wait');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Wait');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('spreadsheet');
|
2024-01-03 03:08:16 -08:00
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Convert to File');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'Extract From File');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(2).should('have.text', 'Google Sheets');
|
2023-09-20 07:47:51 -07:00
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('sheets');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Google Sheets');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('ggle she');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Google Sheets');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('hub');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'HubSpot');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('git');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'Git');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().eq(1).should('have.text', 'GitHub');
|
|
|
|
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('gith');
|
|
|
|
nodeCreatorFeature.getters.nodeItemName().first().should('have.text', 'GitHub');
|
|
|
|
});
|
2022-11-25 04:52:33 -08:00
|
|
|
});
|