blob: 26eca2d25a855955a33a03245a5e22f720f70958 [file]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
jest.mock("thrift", () => {
const actualThrift = jest.requireActual("thrift");
const mockConnection = {
on: jest.fn(),
removeAllListeners: jest.fn(),
destroy: jest.fn(),
end: jest.fn(),
};
return {
...actualThrift,
__mockConnection: mockConnection,
createConnection: jest.fn(() => mockConnection),
createSSLConnection: jest.fn(() => mockConnection),
createClient: jest.fn(() => ({
openSession: jest.fn((_req, callback) =>
callback(null, { status: { code: 200 }, sessionId: 123 }),
),
requestStatementId: jest.fn((_sessionId, callback) =>
callback(null, 456),
),
closeSession: jest.fn((_req, callback) =>
callback(null, { status: { code: 200 } }),
),
})),
};
});
import * as thrift from "thrift";
import { Connection } from "../../src/connection/Connection";
import { InternalConfig } from "../../src/utils/Config";
const thriftMock = thrift as typeof thrift & {
__mockConnection: {
on: jest.Mock;
removeAllListeners: jest.Mock;
destroy: jest.Mock;
end: jest.Mock;
};
createConnection: jest.Mock;
createSSLConnection: jest.Mock;
createClient: jest.Mock;
};
describe("Connection", () => {
beforeEach(() => {
jest.clearAllMocks();
});
test("Should use SSL connection when SSL is enabled", async () => {
const ca = Buffer.from("ca");
const config: InternalConfig = {
host: "localhost",
port: 6667,
username: "root",
password: "root",
enableSSL: true,
sqlDialect: "tree",
sslOptions: {
ca,
rejectUnauthorized: true,
},
};
const connection = new Connection(config);
await connection.open();
expect(thriftMock.createSSLConnection).toHaveBeenCalledWith(
"localhost",
6667,
expect.objectContaining({
ca,
rejectUnauthorized: true,
https: true,
protocol: thrift.TBinaryProtocol,
transport: thrift.TFramedTransport,
}),
);
expect(thriftMock.createConnection).not.toHaveBeenCalled();
await connection.close();
});
test("Should use plain connection when SSL is disabled", async () => {
const config: InternalConfig = {
host: "localhost",
port: 6667,
username: "root",
password: "root",
enableSSL: false,
sqlDialect: "tree",
};
const connection = new Connection(config);
await connection.open();
expect(thriftMock.createConnection).toHaveBeenCalledWith(
"localhost",
6667,
expect.objectContaining({
https: false,
protocol: thrift.TBinaryProtocol,
transport: thrift.TFramedTransport,
}),
);
expect(thriftMock.createSSLConnection).not.toHaveBeenCalled();
await connection.close();
});
});