diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/helpers.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/helpers.ts index eb36bfc660..385a2fa571 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/helpers.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/helpers.ts @@ -15,23 +15,25 @@ export const node: INode = { export const createMockExecuteFunction = (nodeParameters: IDataObject) => { const fakeExecuteFunction = { - getInputData() { + getInputData: jest.fn(() => { return [{ json: {} }]; - }, - getNodeParameter( - parameterName: string, - _itemIndex: number, - fallbackValue?: IDataObject, - options?: IGetNodeParameterOptions, - ) { - const parameter = options?.extractValue ? `${parameterName}.value` : parameterName; - return get(nodeParameters, parameter, fallbackValue); - }, - getNode() { + }), + getNodeParameter: jest.fn( + ( + parameterName: string, + _itemIndex: number, + fallbackValue?: IDataObject, + options?: IGetNodeParameterOptions, + ) => { + const parameter = options?.extractValue ? `${parameterName}.value` : parameterName; + return get(nodeParameters, parameter, fallbackValue); + }, + ), + getNode: jest.fn(() => { return node; - }, - helpers: { constructExecutionMetaData }, - continueOnFail: () => false, + }), + helpers: { constructExecutionMetaData: jest.fn(constructExecutionMetaData) }, + continueOnFail: jest.fn(() => false), } as unknown as IExecuteFunctions; return fakeExecuteFunction; }; diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts index 3ca1da0576..211d05421d 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts @@ -154,4 +154,55 @@ describe('Test AirtableV2, create operation', () => { typecast: false, }); }); + + it('should skip validation if typecast option is true', async () => { + const nodeParameters = { + operation: 'create', + columns: { + mappingMode: 'defineBelow', + value: { + bar: 'bar 1', + foo: 'foo 1', + }, + matchingColumns: [], + schema: [ + { + id: 'foo', + displayName: 'foo', + required: false, + defaultMatch: false, + display: true, + type: 'string', + }, + { + id: 'bar', + displayName: 'bar', + required: false, + defaultMatch: false, + display: true, + type: 'string', + }, + ], + }, + options: { + typecast: true, + }, + }; + + const mockExecuteFunctions = createMockExecuteFunction(nodeParameters); + await create.execute.call(mockExecuteFunctions, [{ json: {} }], 'appYoLbase', 'tblltable'); + + expect(mockExecuteFunctions.getNodeParameter).toHaveBeenCalledWith('columns.value', 0, [], { + skipValidation: true, + }); + + expect(transport.apiRequest).toHaveBeenCalledTimes(1); + expect(transport.apiRequest).toHaveBeenCalledWith('POST', 'appYoLbase/tblltable', { + fields: { + foo: 'foo 1', + bar: 'bar 1', + }, + typecast: true, + }); + }); }); diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts index 2ae70b5d7d..f088f58ab9 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts @@ -63,17 +63,18 @@ export async function execute( for (let i = 0; i < items.length; i++) { try { const options = this.getNodeParameter('options', i, {}); + const typecast = Boolean(options.typecast); - const body: IDataObject = { - typecast: options.typecast ? true : false, - }; + const body: IDataObject = { typecast }; if (dataMode === 'autoMapInputData') { body.fields = removeIgnored(items[i].json, options.ignoreFields as string); } if (dataMode === 'defineBelow') { - const fields = this.getNodeParameter('columns.value', i, []) as IDataObject; + const fields = this.getNodeParameter('columns.value', i, [], { + skipValidation: typecast, + }) as IDataObject; body.fields = fields; } @@ -85,7 +86,7 @@ export async function execute( { itemData: { item: i } }, ); - returnData.push(...executionData); + returnData.push.apply(returnData, executionData); } catch (error) { error = processAirtableError(error as NodeApiError, undefined, i); if (this.continueOnFail()) {