test: Migrate cypress tests batch 1 to playwright (#19569)

This commit is contained in:
Artem Sorokin
2025-09-16 16:11:51 +02:00
committed by GitHub
parent b480f495d9
commit a4fc24371d
19 changed files with 2573 additions and 239 deletions

View File

@@ -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();
});
});

View File

@@ -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);
});
});
});

View File

@@ -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)),
);
});
});
});