mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-18 02:21:13 +00:00
fix: Run evaluations loop manually always from first row (#15794)
This commit is contained in:
@@ -20,7 +20,7 @@ import {
|
||||
getSheet,
|
||||
} from '../utils/evaluationTriggerUtils';
|
||||
|
||||
export let startingRow = 2;
|
||||
export const DEFAULT_STARTING_ROW = 2;
|
||||
|
||||
export class EvaluationTrigger implements INodeType {
|
||||
description: INodeTypeDescription = {
|
||||
@@ -105,12 +105,7 @@ export class EvaluationTrigger implements INodeType {
|
||||
|
||||
methods = { loadOptions, listSearch };
|
||||
|
||||
async execute(this: IExecuteFunctions, startRow?: number): Promise<INodeExecutionData[][]> {
|
||||
// We need to allow tests to reset the startingRow
|
||||
if (startRow) {
|
||||
startingRow = startRow;
|
||||
}
|
||||
|
||||
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
|
||||
const inputData = this.getInputData();
|
||||
|
||||
const MAX_ROWS = 1000;
|
||||
@@ -119,10 +114,17 @@ export class EvaluationTrigger implements INodeType {
|
||||
? (this.getNodeParameter('maxRows', 0) as number) + 1
|
||||
: MAX_ROWS;
|
||||
|
||||
const previousRunRowNumber = inputData?.[0]?.json?.row_number;
|
||||
const previousRunRowsLeft = inputData?.[0]?.json?._rowsLeft;
|
||||
|
||||
const firstDataRow =
|
||||
typeof previousRunRowNumber === 'number' && previousRunRowsLeft !== 0
|
||||
? previousRunRowNumber + 1
|
||||
: DEFAULT_STARTING_ROW;
|
||||
const rangeOptions = {
|
||||
rangeDefinition: 'specifyRange',
|
||||
headerRow: 1,
|
||||
firstDataRow: startingRow,
|
||||
firstDataRow,
|
||||
};
|
||||
|
||||
const googleSheetInstance = getGoogleSheet.call(this);
|
||||
@@ -153,8 +155,6 @@ export class EvaluationTrigger implements INodeType {
|
||||
const currentRowNumber = currentRow.json?.row_number as number;
|
||||
|
||||
if (currentRow === undefined) {
|
||||
startingRow = 2;
|
||||
|
||||
throw new NodeOperationError(this.getNode(), 'No row found');
|
||||
}
|
||||
|
||||
@@ -168,37 +168,23 @@ export class EvaluationTrigger implements INodeType {
|
||||
|
||||
currentRow.json._rowsLeft = rowsLeft;
|
||||
|
||||
startingRow = currentRowNumber + 1;
|
||||
|
||||
if (rowsLeft === 0) {
|
||||
startingRow = 2;
|
||||
}
|
||||
|
||||
return [[currentRow]];
|
||||
} else {
|
||||
const currentRow = allRows.find((row) => (row?.json?.row_number as number) === startingRow);
|
||||
const currentRow = allRows.find((row) => (row?.json?.row_number as number) === firstDataRow);
|
||||
|
||||
const rowsLeft = await getRowsLeft.call(
|
||||
this,
|
||||
googleSheetInstance,
|
||||
googleSheet.title,
|
||||
`${googleSheet.title}!${startingRow}:${maxRows}`,
|
||||
`${googleSheet.title}!${firstDataRow}:${maxRows}`,
|
||||
);
|
||||
|
||||
if (currentRow === undefined) {
|
||||
startingRow = 2;
|
||||
|
||||
throw new NodeOperationError(this.getNode(), 'No row found');
|
||||
}
|
||||
|
||||
currentRow.json._rowsLeft = rowsLeft;
|
||||
|
||||
startingRow += 1;
|
||||
|
||||
if (rowsLeft === 0) {
|
||||
startingRow = 2;
|
||||
}
|
||||
|
||||
return [[currentRow]];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import { mock } from 'jest-mock-extended';
|
||||
import type { IExecuteFunctions } from 'n8n-workflow';
|
||||
|
||||
import { GoogleSheet } from '../../Google/Sheet/v2/helpers/GoogleSheet';
|
||||
import { EvaluationTrigger, startingRow } from '../EvaluationTrigger/EvaluationTrigger.node.ee';
|
||||
import { EvaluationTrigger } from '../EvaluationTrigger/EvaluationTrigger.node.ee';
|
||||
import * as utils from '../utils/evaluationTriggerUtils';
|
||||
|
||||
describe('Evaluation Trigger Node', () => {
|
||||
@@ -87,8 +87,108 @@ describe('Evaluation Trigger Node', () => {
|
||||
},
|
||||
],
|
||||
]);
|
||||
});
|
||||
|
||||
expect(startingRow).toBe(3);
|
||||
test('should return the next row from google sheet', async () => {
|
||||
mockExecuteFunctions.getInputData.mockReturnValue([
|
||||
{
|
||||
json: {
|
||||
row_number: 2,
|
||||
Header1: 'Value1',
|
||||
Header2: 'Value2',
|
||||
_rowsLeft: 1,
|
||||
},
|
||||
pairedItem: {
|
||||
item: 0,
|
||||
input: undefined,
|
||||
},
|
||||
},
|
||||
]);
|
||||
mockExecuteFunctions.getNodeParameter.mockImplementation(
|
||||
(key: string, _: number, fallbackValue?: string | number | boolean | object) => {
|
||||
const mockParams: { [key: string]: unknown } = {
|
||||
options: {},
|
||||
'filtersUI.values': [],
|
||||
combineFilters: 'AND',
|
||||
documentId: {
|
||||
mode: 'id',
|
||||
value: spreadsheetId,
|
||||
},
|
||||
sheetName,
|
||||
sheetMode: 'id',
|
||||
};
|
||||
return mockParams[key] ?? fallbackValue;
|
||||
},
|
||||
);
|
||||
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
{
|
||||
json: {
|
||||
row_number: 3,
|
||||
Header1: 'Value3',
|
||||
Header2: 'Value4',
|
||||
_rowsLeft: 0,
|
||||
},
|
||||
pairedItem: {
|
||||
item: 0,
|
||||
},
|
||||
},
|
||||
],
|
||||
]);
|
||||
});
|
||||
|
||||
test('should return the first row from google sheet if no rows left', async () => {
|
||||
mockExecuteFunctions.getInputData.mockReturnValue([
|
||||
{
|
||||
json: {
|
||||
row_number: 3,
|
||||
Header1: 'Value3',
|
||||
Header2: 'Value4',
|
||||
_rowsLeft: 0,
|
||||
},
|
||||
pairedItem: {
|
||||
item: 0,
|
||||
input: undefined,
|
||||
},
|
||||
},
|
||||
]);
|
||||
mockExecuteFunctions.getNodeParameter.mockImplementation(
|
||||
(key: string, _: number, fallbackValue?: string | number | boolean | object) => {
|
||||
const mockParams: { [key: string]: unknown } = {
|
||||
options: {},
|
||||
'filtersUI.values': [],
|
||||
combineFilters: 'AND',
|
||||
documentId: {
|
||||
mode: 'id',
|
||||
value: spreadsheetId,
|
||||
},
|
||||
sheetName,
|
||||
sheetMode: 'id',
|
||||
};
|
||||
return mockParams[key] ?? fallbackValue;
|
||||
},
|
||||
);
|
||||
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
{
|
||||
json: {
|
||||
row_number: 2,
|
||||
Header1: 'Value1',
|
||||
Header2: 'Value2',
|
||||
_rowsLeft: 2,
|
||||
},
|
||||
pairedItem: {
|
||||
item: 0,
|
||||
},
|
||||
},
|
||||
],
|
||||
]);
|
||||
});
|
||||
|
||||
test('should return a single row from google sheet with limit', async () => {
|
||||
@@ -111,7 +211,7 @@ describe('Evaluation Trigger Node', () => {
|
||||
},
|
||||
);
|
||||
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions, 2);
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
@@ -128,8 +228,6 @@ describe('Evaluation Trigger Node', () => {
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
expect(startingRow).toBe(2);
|
||||
});
|
||||
|
||||
test('should return the sheet with limits applied when test runner is enabled', async () => {
|
||||
@@ -154,7 +252,7 @@ describe('Evaluation Trigger Node', () => {
|
||||
},
|
||||
);
|
||||
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions, 2);
|
||||
const result = await new EvaluationTrigger().execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
@@ -180,8 +278,6 @@ describe('Evaluation Trigger Node', () => {
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
expect(startingRow).toBe(2);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -240,7 +336,7 @@ describe('Evaluation Trigger Node', () => {
|
||||
|
||||
const evaluationTrigger = new EvaluationTrigger();
|
||||
|
||||
const result = await evaluationTrigger.execute.call(mockExecuteFunctions, 1);
|
||||
const result = await evaluationTrigger.execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
@@ -299,7 +395,7 @@ describe('Evaluation Trigger Node', () => {
|
||||
|
||||
const evaluationTrigger = new EvaluationTrigger();
|
||||
|
||||
const result = await evaluationTrigger.execute.call(mockExecuteFunctions, 1);
|
||||
const result = await evaluationTrigger.execute.call(mockExecuteFunctions);
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user