diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/base/getSchema.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/base/getSchema.test.ts index fe07bc7c93b..2c819f37e83 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/base/getSchema.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/base/getSchema.test.ts @@ -1,13 +1,16 @@ +import { mockDeep } from 'jest-mock-extended'; +import { get } from 'lodash'; +import type { IExecuteFunctions } from 'n8n-workflow'; + import * as getSchema from '../../../../v2/actions/base/getSchema.operation'; import * as transport from '../../../../v2/transport'; -import { createMockExecuteFunction } from '../helpers'; jest.mock('../../../../v2/transport', () => { const originalModule = jest.requireActual('../../../../v2/transport'); return { ...originalModule, apiRequest: jest.fn(async function () { - return {}; + return { tables: [] }; }), }; }); @@ -18,19 +21,35 @@ describe('Test AirtableV2, base => getSchema', () => { resource: 'base', operation: 'getSchema', base: { - value: 'appYobase', + value: '={{$json.id}}', }, }; const items = [ { - json: {}, + json: { id: 'appYobase1' }, + }, + { + json: { id: 'appYobase2' }, }, ]; - await getSchema.execute.call(createMockExecuteFunction(nodeParameters), items); + await getSchema.execute.call( + mockDeep({ + getInputData: jest.fn(() => items), + getNodeParameter: jest.fn((param: string, itemIndex: number) => { + if (param === 'base') { + return items[itemIndex].json.id; + } - expect(transport.apiRequest).toBeCalledTimes(1); - expect(transport.apiRequest).toHaveBeenCalledWith('GET', 'meta/bases/appYobase/tables'); + return get(nodeParameters, param); + }), + }), + items, + ); + + expect(transport.apiRequest).toBeCalledTimes(2); + expect(transport.apiRequest).toHaveBeenCalledWith('GET', 'meta/bases/appYobase1/tables'); + expect(transport.apiRequest).toHaveBeenCalledWith('GET', 'meta/bases/appYobase2/tables'); }); }); diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/base/getSchema.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/base/getSchema.operation.ts index b687cac225a..eef6c16358d 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/base/getSchema.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/base/getSchema.operation.ts @@ -1,8 +1,7 @@ import type { - IDataObject, + IExecuteFunctions, INodeExecutionData, INodeProperties, - IExecuteFunctions, NodeApiError, } from 'n8n-workflow'; @@ -10,6 +9,7 @@ import { updateDisplayOptions, wrapData } from '../../../../../utils/utilities'; import { processAirtableError } from '../../helpers/utils'; import { apiRequest } from '../../transport'; import { baseRLC } from '../common.descriptions'; +import type { TablesResponse } from '../types'; const properties: INodeProperties[] = [ { @@ -31,22 +31,25 @@ export async function execute( this: IExecuteFunctions, items: INodeExecutionData[], ): Promise { - const returnData: INodeExecutionData[] = []; + let returnData: INodeExecutionData[] = []; for (let i = 0; i < items.length; i++) { try { - const baseId = this.getNodeParameter('base', 0, undefined, { + const baseId = this.getNodeParameter('base', i, undefined, { extractValue: true, }) as string; - const responseData = await apiRequest.call(this, 'GET', `meta/bases/${baseId}/tables`); - - const executionData = this.helpers.constructExecutionMetaData( - wrapData(responseData.tables as IDataObject[]), - { itemData: { item: i } }, + const responseData: TablesResponse = await apiRequest.call( + this, + 'GET', + `meta/bases/${baseId}/tables`, ); - returnData.push(...executionData); + const executionData = this.helpers.constructExecutionMetaData(wrapData(responseData.tables), { + itemData: { item: i }, + }); + + returnData = returnData.concat(executionData); } catch (error) { error = processAirtableError(error as NodeApiError, undefined, i); if (this.continueOnFail()) { diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/types.ts b/packages/nodes-base/nodes/Airtable/v2/actions/types.ts new file mode 100644 index 00000000000..7d8259df6b4 --- /dev/null +++ b/packages/nodes-base/nodes/Airtable/v2/actions/types.ts @@ -0,0 +1,15 @@ +export type Table = { + id: string; + name: string; + fields: Field[]; +}; + +export type TablesResponse = { + tables: Table[]; +}; + +export type Field = { + id: string; + name: string; + type: string; +};