fix(core): Fix paired item returning wrong data (#5898)

* 🐛 Fix paired item returning wrong data

* 🧪 Add e2e test

*  Restore injection for simulated execution
This commit is contained in:
Iván Ovejero 2023-04-14 13:33:27 +02:00 committed by GitHub
parent ee7d5a841e
commit b13b7d73e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 37 deletions

View file

@ -1,3 +1,9 @@
import {
HTTP_REQUEST_NODE_NAME,
MANUAL_TRIGGER_NODE_DISPLAY_NAME,
PIPEDRIVE_NODE_NAME,
SET_NODE_NAME,
} from '../constants';
import { WorkflowPage, NDV } from '../pages';
const workflowPage = new WorkflowPage();
@ -44,7 +50,7 @@ describe('Data pinning', () => {
});
});
it('Should be be able to set pinned data', () => {
it('Should be able to set pinned data', () => {
workflowPage.actions.addInitialNodeToCanvas('Schedule Trigger', { keepNdvOpen: true });
ndv.getters.container().should('be.visible');
ndv.getters.pinDataButton().should('not.exist');
@ -67,4 +73,35 @@ describe('Data pinning', () => {
ndv.getters.outputTableHeaders().first().should('include.text', 'test');
ndv.getters.outputTbodyCell(1, 0).should('include.text', 1);
});
it('Should be able to reference paired items in a node located before pinned data', () => {
workflowPage.actions.addInitialNodeToCanvas(MANUAL_TRIGGER_NODE_DISPLAY_NAME);
workflowPage.actions.addNodeToCanvas(HTTP_REQUEST_NODE_NAME, true, true);
ndv.actions.setPinnedData([{ http: 123 }]);
ndv.actions.close();
workflowPage.actions.addNodeToCanvas(PIPEDRIVE_NODE_NAME, true, true);
ndv.actions.setPinnedData(Array(3).fill({ pipedrive: 123 }));
ndv.actions.close();
workflowPage.actions.addNodeToCanvas(SET_NODE_NAME, true, true);
setExpressionOnStringValueInSet(`{{ $('${HTTP_REQUEST_NODE_NAME}').item`);
const output = '[Object: {"json": {"http": 123}, "pairedItem": {"item": 0}}]';
cy.get('div').contains(output).should('be.visible');
});
});
function setExpressionOnStringValueInSet(expression: string) {
cy.get('button').contains('Execute node').click();
cy.get('input[placeholder="Add Value"]').click();
cy.get('span').contains('String').click();
ndv.getters.nthParam(3).contains('Expression').invoke('show').click();
ndv.getters
.inlineExpressionEditorInput()
.clear()
.type(expression, { parseSpecialCharSequences: false });
}

View file

@ -140,33 +140,6 @@ export function resolveParameter(
runExecutionData = executionData.data;
}
parentNode.forEach((parentNodeName) => {
const pinData: IPinData[string] | undefined =
useWorkflowsStore().pinDataByNodeName(parentNodeName);
if (pinData) {
runExecutionData = {
...runExecutionData,
resultData: {
...runExecutionData.resultData,
runData: {
...runExecutionData.resultData.runData,
[parentNodeName]: [
{
startTime: new Date().valueOf(),
executionTime: 0,
source: [],
data: {
main: [pinData.map((data) => ({ json: data }))],
},
},
],
},
},
};
}
});
if (_connectionInputData === null) {
_connectionInputData = [];
}
@ -254,7 +227,7 @@ function getWorkflow(nodes: INodeUi[], connections: IConnections, copyData?: boo
nodeTypes,
settings: useWorkflowsStore().workflowSettings,
// @ts-ignore
pinData: useWorkflowsStore().pinData,
pinData: useWorkflowsStore().getPinData,
});
return cachedWorkflow;

View file

@ -719,18 +719,11 @@ export class WorkflowDataProxy {
};
}
const previousNodeHasPinData =
sourceData && this.workflow.getPinDataOfNode(sourceData.previousNode) !== undefined;
let currentPairedItem = pairedItem;
let nodeBeforeLast: string | undefined;
while (
!previousNodeHasPinData &&
sourceData !== null &&
destinationNodeName !== sourceData.previousNode
) {
while (sourceData !== null && destinationNodeName !== sourceData.previousNode) {
taskData =
that.runExecutionData!.resultData.runData[sourceData.previousNode][
sourceData?.previousNodeRun || 0