mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
92 lines
3 KiB
TypeScript
92 lines
3 KiB
TypeScript
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('Test step').click(); // create run data
|
|
cy.get('button').contains('Test 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)),
|
|
);
|
|
});
|
|
});
|
|
});
|