mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-16 09:36:44 +00:00
test: Migrate cypress tests batch 1 to playwright (#19569)
This commit is contained in:
@@ -1,71 +0,0 @@
|
||||
import { getWorkflowHistoryCloseButton } from '../composables/workflow';
|
||||
import { WorkflowPage as WorkflowPageClass } from '../pages';
|
||||
|
||||
const workflowPage = new WorkflowPageClass();
|
||||
|
||||
const switchBetweenEditorAndHistory = () => {
|
||||
workflowPage.getters.workflowHistoryButton().click();
|
||||
cy.wait(['@getHistory']);
|
||||
cy.wait(['@getVersion']);
|
||||
|
||||
cy.intercept('GET', '/rest/workflows/*').as('workflowGet');
|
||||
getWorkflowHistoryCloseButton().click();
|
||||
cy.wait(['@workflowGet']);
|
||||
cy.wait(1000);
|
||||
|
||||
workflowPage.getters.canvasNodes().first().should('be.visible');
|
||||
workflowPage.getters.canvasNodes().last().should('be.visible');
|
||||
};
|
||||
|
||||
const switchBetweenEditorAndWorkflowlist = () => {
|
||||
cy.getByTestId('menu-item').first().click();
|
||||
cy.wait(['@getUsers', '@getWorkflows', '@getActiveWorkflows', '@getProjects']);
|
||||
|
||||
cy.getByTestId('resources-list-item-workflow').first().click();
|
||||
|
||||
workflowPage.getters.canvasNodes().first().should('be.visible');
|
||||
workflowPage.getters.canvasNodes().last().should('be.visible');
|
||||
};
|
||||
|
||||
const zoomInAndCheckNodes = () => {
|
||||
cy.getByTestId('zoom-in-button').click();
|
||||
cy.getByTestId('zoom-in-button').click();
|
||||
cy.getByTestId('zoom-in-button').click();
|
||||
cy.getByTestId('zoom-in-button').click();
|
||||
|
||||
workflowPage.getters.canvasNodes().first().should('not.be.visible');
|
||||
workflowPage.getters.canvasNodes().last().should('not.be.visible');
|
||||
};
|
||||
|
||||
describe('Editor zoom should work after route changes', () => {
|
||||
beforeEach(() => {
|
||||
cy.enableFeature('debugInEditor');
|
||||
cy.enableFeature('workflowHistory');
|
||||
cy.signinAsOwner();
|
||||
workflowPage.actions.visit();
|
||||
cy.createFixtureWorkflow('Lots_of_nodes.json');
|
||||
workflowPage.actions.saveWorkflowOnButtonClick();
|
||||
});
|
||||
|
||||
it('after switching between Editor and Workflow history and Workflow list', () => {
|
||||
cy.intercept('GET', '/rest/workflow-history/workflow/*/version/*').as('getVersion');
|
||||
cy.intercept('GET', '/rest/workflow-history/workflow/*').as('getHistory');
|
||||
cy.intercept('GET', '/rest/users?*').as('getUsers');
|
||||
cy.intercept('GET', '/rest/workflows?*').as('getWorkflows');
|
||||
cy.intercept('GET', '/rest/active-workflows').as('getActiveWorkflows');
|
||||
cy.intercept('GET', '/rest/projects').as('getProjects');
|
||||
|
||||
switchBetweenEditorAndHistory();
|
||||
zoomInAndCheckNodes();
|
||||
switchBetweenEditorAndHistory();
|
||||
switchBetweenEditorAndHistory();
|
||||
zoomInAndCheckNodes();
|
||||
switchBetweenEditorAndWorkflowlist();
|
||||
zoomInAndCheckNodes();
|
||||
switchBetweenEditorAndWorkflowlist();
|
||||
switchBetweenEditorAndWorkflowlist();
|
||||
zoomInAndCheckNodes();
|
||||
switchBetweenEditorAndHistory();
|
||||
switchBetweenEditorAndWorkflowlist();
|
||||
});
|
||||
});
|
||||
@@ -1,74 +0,0 @@
|
||||
import { WorkflowPage } from '../pages';
|
||||
import { errorToast, successToast } from '../pages/notifications';
|
||||
|
||||
const workflowPage = new WorkflowPage();
|
||||
|
||||
before(() => {
|
||||
cy.fixture('Onboarding_workflow.json').then((data) => {
|
||||
cy.intercept('GET', '/rest/workflows/from-url*', {
|
||||
body: { data },
|
||||
}).as('downloadWorkflowFromURL');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Import workflow', () => {
|
||||
describe('From URL', () => {
|
||||
it('should import workflow', () => {
|
||||
workflowPage.actions.visit(true);
|
||||
workflowPage.getters.workflowMenu().click();
|
||||
workflowPage.getters.workflowMenuItemImportFromURLItem().click();
|
||||
|
||||
workflowPage.getters.inputURLImportWorkflowFromURL().should('be.visible');
|
||||
|
||||
workflowPage.getters
|
||||
.inputURLImportWorkflowFromURL()
|
||||
.type('https://fakepage.com/workflow.json');
|
||||
|
||||
workflowPage.getters.confirmActionImportWorkflowFromURL().click();
|
||||
|
||||
workflowPage.actions.zoomToFit();
|
||||
|
||||
workflowPage.getters.canvasNodes().should('have.length', 4);
|
||||
|
||||
errorToast().should('not.exist');
|
||||
|
||||
successToast().should('not.exist');
|
||||
});
|
||||
|
||||
it('clicking outside modal should not show error toast', () => {
|
||||
workflowPage.actions.visit(true);
|
||||
workflowPage.getters.workflowMenu().click();
|
||||
workflowPage.getters.workflowMenuItemImportFromURLItem().click();
|
||||
|
||||
cy.get('body').click(0, 0);
|
||||
|
||||
errorToast().should('not.exist');
|
||||
});
|
||||
|
||||
it('canceling modal should not show error toast', () => {
|
||||
workflowPage.actions.visit(true);
|
||||
|
||||
workflowPage.getters.workflowMenu().click();
|
||||
workflowPage.getters.workflowMenuItemImportFromURLItem().click();
|
||||
workflowPage.getters.cancelActionImportWorkflowFromURL().click();
|
||||
|
||||
errorToast().should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
describe('From File', () => {
|
||||
it('should import workflow', () => {
|
||||
workflowPage.actions.visit(true);
|
||||
|
||||
workflowPage.getters.workflowMenu().click();
|
||||
workflowPage.getters.workflowMenuItemImportFromFile().click();
|
||||
workflowPage.getters
|
||||
.workflowImportInput()
|
||||
.selectFile('fixtures/Test_workflow-actions_paste-data.json', { force: true });
|
||||
cy.waitForLoad(false);
|
||||
workflowPage.actions.zoomToFit();
|
||||
workflowPage.getters.canvasNodes().should('have.length', 5);
|
||||
workflowPage.getters.nodeConnections().should('have.length', 5);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,91 +0,0 @@
|
||||
import {
|
||||
clickAssignmentCollectionAdd,
|
||||
clickGetBackToCanvas,
|
||||
getNodeRunInfoStale,
|
||||
getOutputTbodyCell,
|
||||
} from '../composables/ndv';
|
||||
import {
|
||||
clickExecuteWorkflowButton,
|
||||
getNodeByName,
|
||||
getZoomToFitButton,
|
||||
navigateToNewWorkflowPage,
|
||||
openNode,
|
||||
} from '../composables/workflow';
|
||||
import { NDV, WorkflowPage } from '../pages';
|
||||
|
||||
const canvas = new WorkflowPage();
|
||||
const ndv = new NDV();
|
||||
|
||||
describe('Manual partial execution', () => {
|
||||
it('should not execute parent nodes with no run data', () => {
|
||||
canvas.actions.visit();
|
||||
|
||||
cy.fixture('manual-partial-execution.json').then((data) => {
|
||||
cy.get('body').paste(JSON.stringify(data));
|
||||
});
|
||||
|
||||
canvas.actions.zoomToFit();
|
||||
|
||||
canvas.actions.openNode('Edit Fields');
|
||||
|
||||
cy.get('button').contains('Execute step').click(); // create run data
|
||||
cy.get('button').contains('Execute step').click(); // use run data
|
||||
|
||||
ndv.actions.close();
|
||||
|
||||
canvas.actions.openNode('Webhook1');
|
||||
|
||||
ndv.getters.nodeRunSuccessIndicator().should('not.exist');
|
||||
ndv.getters.nodeRunTooltipIndicator().should('not.exist');
|
||||
ndv.getters.outputRunSelector().should('not.exist');
|
||||
});
|
||||
|
||||
describe('partial execution v2', () => {
|
||||
beforeEach(() => {
|
||||
cy.window().then((win) => {
|
||||
win.localStorage.setItem('PartialExecution.version', '2');
|
||||
});
|
||||
navigateToNewWorkflowPage();
|
||||
});
|
||||
|
||||
it('should execute from the first dirty node up to the current node', () => {
|
||||
cy.createFixtureWorkflow('Test_workflow_partial_execution_v2.json');
|
||||
|
||||
getZoomToFitButton().click();
|
||||
|
||||
// First, execute the whole workflow
|
||||
clickExecuteWorkflowButton();
|
||||
|
||||
getNodeByName('A').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
getNodeByName('B').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
getNodeByName('C').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
openNode('A');
|
||||
getOutputTbodyCell(1, 0).invoke('text').as('before', { type: 'static' });
|
||||
clickGetBackToCanvas();
|
||||
|
||||
// Change parameter of the node in the middle
|
||||
openNode('B');
|
||||
clickAssignmentCollectionAdd();
|
||||
getNodeRunInfoStale().should('be.visible');
|
||||
clickGetBackToCanvas();
|
||||
|
||||
getNodeByName('A').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
getNodeByName('B').findChildByTestId('canvas-node-status-warning').should('be.visible');
|
||||
getNodeByName('C').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
|
||||
// Partial execution
|
||||
getNodeByName('C').findChildByTestId('execute-node-button').click();
|
||||
|
||||
getNodeByName('A').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
getNodeByName('B').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
getNodeByName('C').findChildByTestId('canvas-node-status-success').should('be.visible');
|
||||
openNode('A');
|
||||
getOutputTbodyCell(1, 0).invoke('text').as('after', { type: 'static' });
|
||||
|
||||
// Assert that 'A' ran only once by comparing its output
|
||||
cy.get('@before').then((before) =>
|
||||
cy.get('@after').then((after) => expect(before).to.equal(after)),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user