This is an automated email from the ASF dual-hosted git repository.

HTHou pushed a commit to branch codex/fix-nodejs-ssl-connection
in repository https://gitbox.apache.org/repos/asf/iotdb-client-nodejs.git

commit 4fd64afb08b0390423bb766a125618fc572674d8
Author: HTHou <[email protected]>
AuthorDate: Fri Jun 26 16:18:58 2026 +0800

    Fix SSL connection creation
---
 src/connection/Connection.ts  |   4 +-
 tests/unit/Connection.test.ts | 132 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 134 insertions(+), 2 deletions(-)

diff --git a/src/connection/Connection.ts b/src/connection/Connection.ts
index d668ac7..54d0b2b 100644
--- a/src/connection/Connection.ts
+++ b/src/connection/Connection.ts
@@ -56,8 +56,8 @@ export class Connection {
         ...this.config.sslOptions,
       };
 
-      if (this.config.enableSSL && this.config.sslOptions) {
-        this.connection = thrift.createConnection(
+      if (this.config.enableSSL) {
+        this.connection = thrift.createSSLConnection(
           this.config.host,
           this.config.port,
           {
diff --git a/tests/unit/Connection.test.ts b/tests/unit/Connection.test.ts
new file mode 100644
index 0000000..26eca2d
--- /dev/null
+++ b/tests/unit/Connection.test.ts
@@ -0,0 +1,132 @@
+/**
+ * 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();
+  });
+});

Reply via email to