mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-09 03:47:29 -08:00
254 lines
6.4 KiB
TypeScript
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' },
|
||
|
]);
|
||
|
});
|
||
|
});
|