n8n/packages/nodes-base/nodes/MySql/test/v2/runQueries.test.ts

179 lines
5.5 KiB
TypeScript

import { createMockExecuteFunction } from '@test/nodes/Helpers';
import { configureQueryRunner } from '../../v2/helpers/utils';
import type { Mysql2Pool, QueryRunner } from '../../v2/helpers/interfaces';
import { BATCH_MODE } from '../../v2/helpers/interfaces';
import type { IDataObject, INode } from 'n8n-workflow';
import mysql2 from 'mysql2/promise';
const mySqlMockNode: INode = {
id: '1',
name: 'MySQL node',
typeVersion: 2,
type: 'n8n-nodes-base.mySql',
position: [60, 760],
parameters: {
operation: 'select',
},
};
const fakeConnection = {
format(query: string, values: any[]) {
return mysql2.format(query, values);
},
query: jest.fn(async () => [{}]),
release: jest.fn(),
beginTransaction: jest.fn(),
commit: jest.fn(),
rollback: jest.fn(),
};
const createFakePool = (connection: IDataObject) => {
return {
getConnection() {
return connection;
},
query: jest.fn(async () => [{}]),
} as unknown as Mysql2Pool;
};
describe('Test MySql V2, runQueries', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('should execute in "Single" mode, should return success true', async () => {
const nodeOptions: IDataObject = { queryBatching: BATCH_MODE.SINGLE, nodeVersion: 2 };
const pool = createFakePool(fakeConnection);
const fakeExecuteFunction = createMockExecuteFunction({}, mySqlMockNode);
const runQueries: QueryRunner = configureQueryRunner.call(
fakeExecuteFunction,
nodeOptions,
pool,
);
const poolGetConnectionSpy = jest.spyOn(pool, 'getConnection');
const poolQuerySpy = jest.spyOn(pool, 'query');
const connectionReleaseSpy = jest.spyOn(fakeConnection, 'release');
const connectionFormatSpy = jest.spyOn(fakeConnection, 'format');
const result = await runQueries([
{ query: 'SELECT * FROM my_table WHERE id = ?', values: [55] },
]);
expect(result).toBeDefined();
expect(result).toHaveLength(1);
expect(result).toEqual([{ json: { success: true } }]);
expect(poolGetConnectionSpy).toBeCalledTimes(1);
expect(connectionReleaseSpy).toBeCalledTimes(1);
expect(poolQuerySpy).toBeCalledTimes(1);
expect(poolQuerySpy).toBeCalledWith('SELECT * FROM my_table WHERE id = 55');
expect(connectionFormatSpy).toBeCalledTimes(1);
expect(connectionFormatSpy).toBeCalledWith('SELECT * FROM my_table WHERE id = ?', [55]);
});
it('should execute in "independently" mode, should return success true', async () => {
const nodeOptions: IDataObject = { queryBatching: BATCH_MODE.INDEPENDENTLY, nodeVersion: 2 };
const pool = createFakePool(fakeConnection);
const fakeExecuteFunction = createMockExecuteFunction({}, mySqlMockNode);
const runQueries: QueryRunner = configureQueryRunner.call(
fakeExecuteFunction,
nodeOptions,
pool,
);
const poolGetConnectionSpy = jest.spyOn(pool, 'getConnection');
const connectionReleaseSpy = jest.spyOn(fakeConnection, 'release');
const connectionFormatSpy = jest.spyOn(fakeConnection, 'format');
const connectionQuerySpy = jest.spyOn(fakeConnection, 'query');
const result = await runQueries([
{
query: 'SELECT * FROM my_table WHERE id = ?; SELECT * FROM my_table WHERE id = ?',
values: [55, 42],
},
]);
expect(result).toBeDefined();
expect(result).toHaveLength(1);
expect(result).toEqual([{ json: { success: true } }]);
expect(poolGetConnectionSpy).toBeCalledTimes(1);
expect(connectionQuerySpy).toBeCalledTimes(2);
expect(connectionQuerySpy).toBeCalledWith('SELECT * FROM my_table WHERE id = 55');
expect(connectionQuerySpy).toBeCalledWith('SELECT * FROM my_table WHERE id = 42');
expect(connectionFormatSpy).toBeCalledTimes(1);
expect(connectionFormatSpy).toBeCalledWith(
'SELECT * FROM my_table WHERE id = ?; SELECT * FROM my_table WHERE id = ?',
[55, 42],
);
expect(connectionReleaseSpy).toBeCalledTimes(1);
});
it('should execute in "transaction" mode, should return success true', async () => {
const nodeOptions: IDataObject = { queryBatching: BATCH_MODE.TRANSACTION, nodeVersion: 2 };
const pool = createFakePool(fakeConnection);
const fakeExecuteFunction = createMockExecuteFunction({}, mySqlMockNode);
const runQueries: QueryRunner = configureQueryRunner.call(
fakeExecuteFunction,
nodeOptions,
pool,
);
const poolGetConnectionSpy = jest.spyOn(pool, 'getConnection');
const connectionReleaseSpy = jest.spyOn(fakeConnection, 'release');
const connectionFormatSpy = jest.spyOn(fakeConnection, 'format');
const connectionQuerySpy = jest.spyOn(fakeConnection, 'query');
const connectionBeginTransactionSpy = jest.spyOn(fakeConnection, 'beginTransaction');
const connectionCommitSpy = jest.spyOn(fakeConnection, 'commit');
const result = await runQueries([
{
query: 'SELECT * FROM my_table WHERE id = ?; SELECT * FROM my_table WHERE id = ?',
values: [55, 42],
},
]);
expect(result).toBeDefined();
expect(result).toHaveLength(1);
expect(result).toEqual([{ json: { success: true } }]);
expect(poolGetConnectionSpy).toBeCalledTimes(1);
expect(connectionBeginTransactionSpy).toBeCalledTimes(1);
expect(connectionQuerySpy).toBeCalledTimes(2);
expect(connectionQuerySpy).toBeCalledWith('SELECT * FROM my_table WHERE id = 55');
expect(connectionQuerySpy).toBeCalledWith('SELECT * FROM my_table WHERE id = 42');
expect(connectionFormatSpy).toBeCalledTimes(1);
expect(connectionFormatSpy).toBeCalledWith(
'SELECT * FROM my_table WHERE id = ?; SELECT * FROM my_table WHERE id = ?',
[55, 42],
);
expect(connectionCommitSpy).toBeCalledTimes(1);
expect(connectionReleaseSpy).toBeCalledTimes(1);
});
});