feat(Airtop Node): Add Airtop node (#13809)

This commit is contained in:
Cesar Sanchez
2025-04-01 21:51:04 +02:00
committed by GitHub
parent cf37ee3ced
commit a7a165dda2
48 changed files with 5026 additions and 0 deletions

View File

@@ -0,0 +1,201 @@
import type { IExecuteFunctions } from 'n8n-workflow';
import { createMockExecuteFunction } from './node/helpers';
import { SESSION_MODE } from '../actions/common/fields';
import { executeRequestWithSessionManagement } from '../actions/common/session.utils';
import * as transport from '../transport';
jest.mock('../transport', () => {
const originalModule = jest.requireActual<typeof transport>('../transport');
return {
...originalModule,
apiRequest: jest.fn(async () => {
return {
success: true,
};
}),
};
});
jest.mock('../GenericFunctions', () => ({
shouldCreateNewSession: jest.fn(function (this: IExecuteFunctions, index: number) {
const sessionMode = this.getNodeParameter('sessionMode', index);
return sessionMode === SESSION_MODE.NEW;
}),
createSessionAndWindow: jest.fn(async () => ({
sessionId: 'new-session-123',
windowId: 'new-window-123',
})),
validateSessionAndWindowId: jest.fn(() => ({
sessionId: 'existing-session-123',
windowId: 'existing-window-123',
})),
validateAirtopApiResponse: jest.fn(),
}));
describe('executeRequestWithSessionManagement', () => {
afterAll(() => {
jest.unmock('../transport');
});
afterEach(() => {
jest.clearAllMocks();
});
describe("When 'sessionMode' is 'new'", () => {
it("should create a new session and window when 'sessionMode' is 'new'", async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.NEW,
url: 'https://example.com',
autoTerminateSession: true,
};
const result = await executeRequestWithSessionManagement.call(
createMockExecuteFunction(nodeParameters),
0,
{
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {},
},
);
expect(result).toEqual([
{
json: {
success: true,
},
},
]);
});
it("should not terminate session when 'autoTerminateSession' is false", async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.NEW,
url: 'https://example.com',
autoTerminateSession: false,
};
const result = await executeRequestWithSessionManagement.call(
createMockExecuteFunction(nodeParameters),
0,
{
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {},
},
);
expect(transport.apiRequest).not.toHaveBeenCalledWith(
'DELETE',
'/sessions/existing-session-123',
);
expect(result).toEqual([
{
json: {
sessionId: 'new-session-123',
windowId: 'new-window-123',
success: true,
},
},
]);
});
it("should terminate session when 'autoTerminateSession' is true", async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.NEW,
url: 'https://example.com',
autoTerminateSession: true,
};
await executeRequestWithSessionManagement.call(createMockExecuteFunction(nodeParameters), 0, {
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {},
});
expect(transport.apiRequest).toHaveBeenNthCalledWith(
2,
'DELETE',
'/sessions/new-session-123',
);
});
it("should call the operation passed in the 'request' parameter", async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.NEW,
url: 'https://example.com',
autoTerminateSession: true,
};
await executeRequestWithSessionManagement.call(createMockExecuteFunction(nodeParameters), 0, {
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {
operation: 'test-operation',
},
});
expect(transport.apiRequest).toHaveBeenNthCalledWith(
1,
'POST',
'/sessions/new-session-123/windows/new-window-123/action',
{
operation: 'test-operation',
},
);
});
});
describe("When 'sessionMode' is 'existing'", () => {
it('should not create a new session and window', async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.EXISTING,
url: 'https://example.com',
sessionId: 'existing-session-123',
windowId: 'existing-window-123',
};
await executeRequestWithSessionManagement.call(createMockExecuteFunction(nodeParameters), 0, {
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {},
});
expect(transport.apiRequest).toHaveBeenCalledTimes(1);
expect(transport.apiRequest).toHaveBeenCalledWith(
'POST',
'/sessions/existing-session-123/windows/existing-window-123/action',
{},
);
});
it("should call the operation passed in the 'request' parameter", async () => {
const nodeParameters = {
sessionMode: SESSION_MODE.EXISTING,
url: 'https://example.com',
sessionId: 'existing-session-123',
windowId: 'existing-window-123',
};
await executeRequestWithSessionManagement.call(createMockExecuteFunction(nodeParameters), 0, {
method: 'POST',
path: '/sessions/{sessionId}/windows/{windowId}/action',
body: {
operation: 'test-operation',
},
});
expect(transport.apiRequest).toHaveBeenNthCalledWith(
1,
'POST',
'/sessions/existing-session-123/windows/existing-window-123/action',
{
operation: 'test-operation',
},
);
});
});
});