Skip to content

Commit

Permalink
fix(Elasticsearch Node): Fix issue stopping search queries being sent (
Browse files Browse the repository at this point in the history
  • Loading branch information
Joffcom authored Dec 18, 2024
1 parent 54b02ac commit 388a83d
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export class ElasticsearchApi implements ICredentialType {

test: ICredentialTestRequest = {
request: {
baseURL: '={{$credentials.baseUrl}}',
baseURL: '={{$credentials.baseUrl}}'.replace(/\/$/, ''),
url: '/_xpack?human=false',
skipSslCertificateValidation: '={{$credentials.ignoreSSLIssues}}',
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ export class Elasticsearch implements INodeType {
} else {
responseData = await elasticsearchApiRequest.call(
this,
'GET',
'POST',
`/${indexId}/_search`,
body,
qs,
Expand All @@ -184,7 +184,7 @@ export class Elasticsearch implements INodeType {

responseData = await elasticsearchApiRequest.call(
this,
'GET',
'POST',
`/${indexId}/_search`,
body,
qs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export async function elasticsearchBulkApiRequest(this: IExecuteFunctions, body:
method: 'POST',
headers: { 'Content-Type': 'application/x-ndjson' },
body: bulkBody,
url: `${baseUrl}/_bulk`,
url: `${baseUrl.replace(/\/$/, '')}/_bulk`,
skipSslCertificateValidation: ignoreSSLIssues,
returnFullResponse: true,
ignoreHttpStatusErrors: true,
Expand Down Expand Up @@ -66,7 +66,7 @@ export async function elasticsearchApiRequest(
method,
body,
qs,
url: `${baseUrl}${endpoint}`,
url: `${baseUrl.replace(/\/$/, '')}${endpoint}`,
json: true,
skipSslCertificateValidation: ignoreSSLIssues,
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import { type IExecuteFunctions, NodeApiError } from 'n8n-workflow';

import { elasticsearchApiRequest } from '../GenericFunctions';

describe('Elasticsearch -> elasticsearchApiRequest', () => {
let mockExecuteFunctions: IExecuteFunctions;

const mockHttpRequestWithAuthentication = jest.fn();

const setupMockFunctions = () => {
mockExecuteFunctions = {
getCredentials: jest.fn().mockResolvedValue({
baseUrl: 'https://example.com',
ignoreSSLIssues: false,
}),
helpers: {
httpRequestWithAuthentication: mockHttpRequestWithAuthentication,
},
getNode: jest.fn().mockReturnValue({}),
} as unknown as IExecuteFunctions;
jest.clearAllMocks();
};

beforeEach(() => {
setupMockFunctions();
mockHttpRequestWithAuthentication.mockClear();
});

const response = { success: true };

it('should make a successful GET API request', async () => {
mockHttpRequestWithAuthentication.mockResolvedValue(response);

const result = await elasticsearchApiRequest.call(
mockExecuteFunctions,
'GET',
'/test-endpoint',
);

expect(result).toEqual(response);
expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'elasticsearchApi',
expect.objectContaining({
method: 'GET',
url: 'https://example.com/test-endpoint',
json: true,
skipSslCertificateValidation: false,
}),
);
});

it('should make a successful POST API request', async () => {
const body = { key: 'value' };

mockHttpRequestWithAuthentication.mockResolvedValue(response);

const result = await elasticsearchApiRequest.call(
mockExecuteFunctions,
'POST',
'/test-endpoint',
body,
);

expect(result).toEqual(response);
expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'elasticsearchApi',
expect.objectContaining({
body,
method: 'POST',
url: 'https://example.com/test-endpoint',
json: true,
skipSslCertificateValidation: false,
}),
);
});

it('should handle API request errors', async () => {
const errorResponse = { message: 'Error occurred' };
mockHttpRequestWithAuthentication.mockRejectedValue(errorResponse);

await expect(
elasticsearchApiRequest.call(mockExecuteFunctions, 'GET', '/test-endpoint'),
).rejects.toThrow(NodeApiError);

expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'elasticsearchApi',
expect.objectContaining({
method: 'GET',
url: 'https://example.com/test-endpoint',
json: true,
skipSslCertificateValidation: false,
}),
);
});

it('should ignore trailing slashes in the base URL', async () => {
mockHttpRequestWithAuthentication.mockResolvedValue(response);

mockExecuteFunctions.getCredentials = jest.fn().mockResolvedValue({
baseUrl: 'https://elastic.domain.com/',
ignoreSSLIssues: false,
});
await elasticsearchApiRequest.call(mockExecuteFunctions, 'GET', '/test-endpoint');

expect(mockExecuteFunctions.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith(
'elasticsearchApi',
expect.objectContaining({
url: 'https://elastic.domain.com/test-endpoint',
}),
);
});
});

0 comments on commit 388a83d

Please sign in to comment.