mirror of
https://github.com/n8n-io/n8n.git
synced 2024-09-21 07:17:38 -07:00
0004dc7ee8
* WIP: Cypress parallel CI run test * Trigger action on branch push * Change build artifacts path * Make sure to checkout the repo for testing job * Use Cypress action for installing * Lock cypress action userd version * Skip node install step since we're using cypress node16 container * Let Cypress handle pnpm install * Use setup-node action for caching pnpm * Set CYPRESS_CACHE_FOLDER * Set CYPRESS_CACHE_FOLDER * Manually cache pnpm store * Dont fix pnpm version * Use caching action also in testing job * Zip packages dist before uploading the artifacts and change caching key * Use absolute build paths for zipping job * Use zip command in action * Use tar for zipping packages * Debuggin directory ls * Debugging caching of modules * Attempt to fix permissions issue * Porivde Cypress executable via `CYPRESS_RUN_BINARY` * Cache /github/home * Adjust caching keys * Debug: search for cypress exec * Debugging: List dirs * Use pnpm install action to install node_modules * Do not log /home/runner * Use node_modules/.bin Cypress binary * Use absolute path to nodue modules * Run Cypress via custom command * Try with patched cypress action * Revert logging * Manually specify cypress config file * Use absolute paths * Fix cypress config name * Debug print cypress config * Remove debugging, increase to 4 containers * Increase amount of containers * Add env-version matrix * Replace node14 with node18 in testing matrix * Remove debugging and add node 14 * Use just node14 * Use cypress:base and remove browser req * Give more general timeouts * Try with node16 * Change cache directive position * Replace zip artifact upload with cache * Cache full packages not just dist * Test with variable inputs * Add commit info message * Remove wrongly commited code * Allow WF API dispatch * Try Chrome browser again for comparison * Include Monaco in the build * Make e2e workflow re-usable * Comment out invalid reusable workflow args * Use electron and add node 14 run * Fix env arg * Provide custom ci-build-id * Refactor remaining e2e workflow to use reusable action * Remove single matrix directive * Refactor ci-pull-req * Make lint job dependant on test jobs * Disable debugging job * Make containers dynamic * Cleanup & install git for linting action * Use regular buntu image for PR linting * Debugging failing tests * Remove fixed spec name * Debug e2e env var * Do not use realkeypress which crashes electron runner * Debugging * chore: remove console * chore: remove console * test: remove node 14 tests * test: replace test branch with master * test: use tests in current branch * test: use relative path * chore: clean up * test: only trigger on approval * ci: update test PR * ci: use curr branch * ci: only run 14 on schedule, not for slack command * ci: only run test on approval * ci: clean up branch, rename step * ci: rename steps * ci: clean up cancel * ci: clean up env var * ci: set var * ci: use chromef * ci: use electron * chore: add console log * chore: add console log * ci: update to string * ci: set all env options * test: build * ci: fix step issue * Fix failing tests & upgrade to Cypress 12 * Allow WF dispatch of e2e reusable * Fix wrong naming in e2e-tests workflow * Redeploy * Fix tests * Fix NDV tests and remove skipping of webhooks execution tests * Fix clipboard read command * Fix execution failing tests * Reset before each 15 and 3 * Fix flaky tests * Cleanup and log envs * Test fixes * Default owner spec fixes * Get rid of CYPRESS_RUN_ENV * Increase amount of containers, cleanup and add mock for credentials test call * Cleanup & fix PR tests unit tests * Wait for WF to loade in sharing spec * Do linting and unit tests first * Use frozen lockfile * Revert back ci pull request jobs order * Refine credential input selector and move cy.waitForLoad to correct position in 15-scheduler spec * test: build * Wait for WF execution instead of arbitraty timeout in WF execution spec, change order of jobs for ci pull request * Fix flaky 3-default owner spec and wait for execution list to load in 20-workflow-executions * Use setup node action * Remove caching for lint/unit tests * Experiment with parallel test & lint on ci * Provide cache key dynamically * Run e2e in parallel on pr * Only run node14 e2e on daily schedule * Make sure to generate generate new ci-build-id on re-runs * Remove debugging prints * Address PR comments * Rename custom onBeforeUnload handler * Make sure 19-execution spec waits for wf to load properly before import fixtures --------- Co-authored-by: Mutasem <mutdmour@gmail.com>
149 lines
6.4 KiB
TypeScript
149 lines
6.4 KiB
TypeScript
import { NodeCreator } from '../pages/features/node-creator';
|
|
import { WorkflowPage as WorkflowPageClass } from '../pages/workflow';
|
|
import { NDV } from '../pages/ndv';
|
|
|
|
const nodeCreatorFeature = new NodeCreator();
|
|
const WorkflowPage = new WorkflowPageClass();
|
|
const NDVModal = new NDV();
|
|
|
|
describe('Node Creator', () => {
|
|
before(() => {
|
|
cy.resetAll();
|
|
cy.skipSetup();
|
|
});
|
|
|
|
beforeEach(() => {
|
|
cy.visit(nodeCreatorFeature.url);
|
|
cy.waitForLoad();
|
|
});
|
|
|
|
it('should open node creator on trigger tab if no trigger is on canvas', () => {
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
|
|
|
nodeCreatorFeature.getters.nodeCreator().contains('Select a trigger').should('be.visible');
|
|
});
|
|
|
|
it('should navigate subcategory', () => {
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
nodeCreatorFeature.getters.getCreatorItem('On app event').click();
|
|
nodeCreatorFeature.getters.activeSubcategory().should('have.text', 'On app event');
|
|
// Go back
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').click();
|
|
nodeCreatorFeature.getters.activeSubcategory().should('not.have.text', 'On app event');
|
|
});
|
|
|
|
it('should search for nodes', () => {
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('manual');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 1);
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('manual123');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
|
nodeCreatorFeature.getters
|
|
.noResults()
|
|
.should('exist')
|
|
.should('contain.text', "We didn't make that... yet");
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 1);
|
|
|
|
nodeCreatorFeature.getters
|
|
.searchBar()
|
|
.find('input')
|
|
.clear()
|
|
.type('this node totally does not exist');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear();
|
|
nodeCreatorFeature.getters.getCreatorItem('On app event').click();
|
|
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image');
|
|
nodeCreatorFeature.getters.getCreatorItem('Results in other categories (1)').should('exist');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 2);
|
|
nodeCreatorFeature.getters.getCreatorItem('Edit Image').should('exist');
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('edit image123123');
|
|
nodeCreatorFeature.getters.creatorItem().should('have.length', 0);
|
|
});
|
|
|
|
it('should check correct view panels', () => {
|
|
nodeCreatorFeature.getters.canvasAddButton().click();
|
|
WorkflowPage.actions.addNodeToCanvas('Manual', false);
|
|
|
|
nodeCreatorFeature.getters.canvasAddButton().should('not.be.visible');
|
|
nodeCreatorFeature.getters.nodeCreator().should('not.exist');
|
|
|
|
// TODO: Replace once we have canvas feature utils
|
|
cy.get('div').contains('Add first step').should('be.hidden');
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
nodeCreatorFeature.getters.nodeCreator().contains('What happens next?').should('be.visible');
|
|
|
|
nodeCreatorFeature.getters.getCreatorItem('Add another trigger').click();
|
|
nodeCreatorFeature.getters.nodeCreator().contains('Select a trigger').should('be.visible');
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').should('exist');
|
|
nodeCreatorFeature.getters.activeSubcategory().find('button').click();
|
|
nodeCreatorFeature.getters.nodeCreator().contains('What happens next?').should('be.visible');
|
|
});
|
|
|
|
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();
|
|
NDVModal.getters.parameterInput('operation').should('contain.text', 'Crop');
|
|
});
|
|
|
|
it('should search through actions and confirm added action', () => {
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('ftp');
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('{rightarrow}');
|
|
nodeCreatorFeature.getters.activeSubcategory().should('have.text', 'FTP');
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type('file');
|
|
// Navigate to rename action which should be the 4th item
|
|
nodeCreatorFeature.getters.searchBar().find('input').type('{downarrow} {downarrow} {downarrow} {rightarrow}');
|
|
NDVModal.getters.parameterInput('operation').should('contain.text', 'Rename');
|
|
})
|
|
|
|
it('should render and select community node', () => {
|
|
const customNode = 'E2E Node';
|
|
|
|
nodeCreatorFeature.actions.openNodeCreator();
|
|
nodeCreatorFeature.getters.searchBar().find('input').clear().type(customNode);
|
|
|
|
nodeCreatorFeature.getters
|
|
.getCreatorItem(customNode)
|
|
.findChildByTestId('node-creator-item-tooltip')
|
|
.should('exist');
|
|
nodeCreatorFeature.actions.selectNode(customNode);
|
|
|
|
// TODO: Replace once we have canvas feature utils
|
|
cy.get('.data-display .node-name').contains(customNode).should('exist');
|
|
|
|
const nodeParameters = () => cy.getByTestId('node-parameters');
|
|
const firstParameter = () => nodeParameters().find('.parameter-item').eq(0);
|
|
const secondParameter = () => nodeParameters().find('.parameter-item').eq(1);
|
|
|
|
// Check correct fields are rendered
|
|
nodeParameters().should('exist');
|
|
// Test property text input
|
|
firstParameter().contains('Test property').should('exist');
|
|
firstParameter().find('input.el-input__inner').should('have.value', 'Some default');
|
|
// Resource select input
|
|
secondParameter().find('label').contains('Resource').should('exist');
|
|
secondParameter().find('input.el-input__inner').should('have.value', 'option2');
|
|
secondParameter().find('.el-select').click();
|
|
secondParameter().find('.el-select-dropdown__list').should('exist');
|
|
// Check if all options are rendered and select the fourth one
|
|
secondParameter().find('.el-select-dropdown__list').children().should('have.length', 4);
|
|
secondParameter()
|
|
.find('.el-select-dropdown__list')
|
|
.children()
|
|
.eq(3)
|
|
.contains('option4')
|
|
.should('exist')
|
|
.click();
|
|
secondParameter().find('input.el-input__inner').should('have.value', 'option4');
|
|
});
|
|
});
|