n8n/packages/nodes-base/nodes/MailerLite/tests/GenericFunctions.test.ts

254 lines
6.4 KiB
TypeScript

/* eslint-disable n8n-nodes-base/node-param-display-name-miscased */
import {
type IExecuteFunctions,
type ILoadOptionsFunctions,
type IHookFunctions,
NodeApiError,
} from 'n8n-workflow';
import {
getCustomFields,
mailerliteApiRequest,
mailerliteApiRequestAllItems,
} from '../GenericFunctions';
describe('MailerLite -> mailerliteApiRequest', () => {
let mockExecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions;
const setupMockFunctions = (typeVersion: number) => {
mockExecuteFunctions = {
getNode: jest.fn().mockReturnValue({ typeVersion }),
helpers: {
httpRequestWithAuthentication: jest.fn(),
},
} as unknown as IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions;
jest.clearAllMocks();
};
beforeEach(() => {
setupMockFunctions(1);
});
it('should make a successful API request for type version 1', async () => {
const method = 'GET';
const path = '/test';
const body = {};
const qs = {};
const responseData = { success: true };
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock).mockResolvedValue(
responseData,
);
const result = await mailerliteApiRequest.call(mockExecuteFunctions, method, path, body, qs);
expect(result).toEqual(responseData);
expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'mailerLiteApi',
{
method,
qs,
url: 'https://api.mailerlite.com/api/v2/test',
json: true,
},
);
});
it('should make a successful API request for type version 2', async () => {
setupMockFunctions(2);
const method = 'GET';
const path = '/test';
const body = {};
const qs = {};
const responseData = { success: true };
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock).mockResolvedValue(
responseData,
);
const result = await mailerliteApiRequest.call(mockExecuteFunctions, method, path, body, qs);
expect(result).toEqual(responseData);
expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'mailerLiteApi',
{
method,
qs,
url: 'https://connect.mailerlite.com/api/test',
json: true,
},
);
});
it('should make an API request with an empty body', async () => {
const method = 'GET';
const path = '/test';
const body = {};
const qs = {};
const responseData = { success: true };
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock).mockResolvedValue(
responseData,
);
const result = await mailerliteApiRequest.call(mockExecuteFunctions, method, path, body, qs);
expect(result).toEqual(responseData);
expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'mailerLiteApi',
{
method,
qs,
url: 'https://api.mailerlite.com/api/v2/test',
json: true,
},
);
});
it('should throw an error if the API request fails', async () => {
const method = 'GET';
const path = '/test';
const body = {};
const qs = {};
const errorResponse = { message: 'Error' };
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock).mockRejectedValue(
errorResponse,
);
await expect(
mailerliteApiRequest.call(mockExecuteFunctions, method, path, body, qs),
).rejects.toThrow(NodeApiError);
});
});
describe('MailerLite -> mailerliteApiRequestAllItems', () => {
let mockExecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions;
const setupMockFunctions = (typeVersion: number) => {
mockExecuteFunctions = {
getNode: jest.fn().mockReturnValue({ typeVersion }),
helpers: {
httpRequestWithAuthentication: jest.fn(),
},
} as unknown as IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions;
jest.clearAllMocks();
};
beforeEach(() => {
setupMockFunctions(1);
});
it('should handle pagination for type version 1', async () => {
const method = 'GET';
const endpoint = '/test';
const body = {};
const query = {};
const responseDataPage1 = [{ id: 1 }, { id: 2 }];
const responseDataPage2 = [{ id: 3 }, { id: 4 }];
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock)
.mockResolvedValueOnce(responseDataPage1)
.mockResolvedValueOnce(responseDataPage2)
.mockResolvedValueOnce([]);
const result = await mailerliteApiRequestAllItems.call(
mockExecuteFunctions,
method,
endpoint,
body,
query,
);
expect(result).toEqual([...responseDataPage1, ...responseDataPage2]);
});
it('should handle pagination for type version 2', async () => {
setupMockFunctions(2);
const method = 'GET';
const endpoint = '/test';
const body = {};
const query = {};
const responseDataPage1 = {
data: [{ id: 1 }, { id: 2 }],
meta: { next_cursor: 'cursor1' },
links: { next: 'nextLink1' },
};
const responseDataPage2 = {
data: [{ id: 3 }, { id: 4 }],
meta: { next_cursor: null },
links: { next: null },
};
(mockExecuteFunctions.helpers.httpRequestWithAuthentication as jest.Mock)
.mockResolvedValueOnce(responseDataPage1)
.mockResolvedValueOnce(responseDataPage2);
const result = await mailerliteApiRequestAllItems.call(
mockExecuteFunctions,
method,
endpoint,
body,
query,
);
expect(result).toEqual([...responseDataPage1.data, ...responseDataPage2.data]);
});
});
describe('MailerLite -> getCustomFields', () => {
let mockExecuteFunctions: ILoadOptionsFunctions;
const v1FieldResponse = [
{ name: 'Field1', key: 'field1' },
{ name: 'Field2', key: 'field2' },
];
const v2FieldResponse = {
data: v1FieldResponse,
};
const setupMockFunctions = (typeVersion: number) => {
mockExecuteFunctions = {
getNode: jest.fn().mockReturnValue({ typeVersion }),
helpers: {
httpRequestWithAuthentication: jest
.fn()
.mockResolvedValue(typeVersion === 1 ? v1FieldResponse : v2FieldResponse),
},
} as unknown as ILoadOptionsFunctions;
jest.clearAllMocks();
};
beforeEach(() => {
setupMockFunctions(1);
});
it('should return custom fields for type version 1', async () => {
const result = await getCustomFields.call(mockExecuteFunctions);
expect(result).toEqual([
{ name: 'field1', value: 'field1' },
{ name: 'field2', value: 'field2' },
]);
});
it('should return custom fields for type version 2', async () => {
setupMockFunctions(2);
const result = await getCustomFields.call(mockExecuteFunctions);
expect(result).toEqual([
{ name: 'Field1', value: 'field1' },
{ name: 'Field2', value: 'field2' },
]);
});
});