chdb
Version:
chDB bindings for nodejs
176 lines (145 loc) • 7.61 kB
JavaScript
const { expect } = require('chai');
const { Session } = require(".");
describe('chDB Connection Tests', function () {
describe('Session Connection Management', function () {
let session;
before(function () {
// Delete existing directory and create a new session instance
const fs = require('fs');
const tmpDir = "./test-connection-tmp";
if (fs.existsSync(tmpDir)) {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
session = new Session(tmpDir);
});
after(function () {
// Clean up the session after all tests are done
session.cleanup();
});
it('should create session successfully with path and connection ID', function () {
expect(session.path).to.equal("./test-connection-tmp");
expect(session.connection).to.not.be.null;
expect(session.connection).to.not.be.undefined;
console.log("✓ Session created successfully, path:", session.path);
console.log("✓ Connection:", session.connection);
});
it('should execute simple query and return correct result', function () {
const result = session.query("SELECT 1 as test_col", "CSV");
console.log("Query result:", result.trim());
expect(result).to.be.a('string');
expect(result.trim()).to.equal('1');
});
it('should return version information', function () {
const result = session.query("SELECT version()", "CSV");
console.log("Version info:", result.trim());
expect(result).to.be.a('string');
expect(result).to.include('.');
});
it('should create database and table successfully', function () {
// This should not throw an error
expect(() => {
session.query("CREATE DATABASE IF NOT EXISTS test_conn_db");
session.query("CREATE TABLE IF NOT EXISTS test_conn_db.test_table (id UInt32, name String) ENGINE = MergeTree() ORDER BY id");
}).to.not.throw();
console.log("✓ Database and table created successfully");
});
it('should insert data successfully', function () {
expect(() => {
session.query("INSERT INTO test_conn_db.test_table VALUES (1, 'Alice'), (2, 'Bob')");
}).to.not.throw();
console.log("✓ Data inserted successfully");
});
it('should query inserted data and verify connection reuse', function () {
const result = session.query("SELECT * FROM test_conn_db.test_table ORDER BY id", "CSV");
console.log("Query result:", result.trim());
expect(result).to.be.a('string');
expect(result).to.include('Alice');
expect(result).to.include('Bob');
expect(result).to.include('1');
expect(result).to.include('2');
});
it('should throw error when using queryBind with session', function () {
expect(() => {
session.queryBind("SELECT {id:UInt32}", {id: 42});
}).to.throw(Error, /QueryBind is not supported with connection-based sessions. Please use the standalone queryBind function instead./);
console.log("✓ queryBind correctly throws error");
});
it('should handle multiple queries in sequence (connection persistence)', function () {
const result1 = session.query("SELECT COUNT(*) FROM test_conn_db.test_table", "CSV");
const result2 = session.query("SELECT MAX(id) FROM test_conn_db.test_table", "CSV");
const result3 = session.query("SELECT name FROM test_conn_db.test_table WHERE id = 1", "CSV");
expect(result1.trim()).to.equal('2');
expect(result2.trim()).to.equal('2');
expect(result3.trim()).to.include('Alice');
console.log("✓ Connection persistence test passed");
});
it('should persist data after session cleanup and reopen', function () {
session.cleanup();
// Create a new session with the same path
session = new Session("./test-connection-tmp");
session.query("USE test_conn_db")
// Query the data to see if it persists
const result = session.query("SELECT * FROM test_table ORDER BY id", "CSV");
console.log("Query result after session reopen:", result.trim());
expect(result).to.be.a('string');
expect(result).to.include('Alice');
expect(result).to.include('Bob');
expect(result).to.include('1');
expect(result).to.include('2');
console.log("✓ Data persisted after session cleanup and reopen");
});
});
describe('Session without Path (In-Memory)', function () {
let session;
it('should create session successfully without path', function () {
session = new Session();
expect(session.path).to.not.be.null;
expect(session.path).to.not.be.undefined;
expect(session.connection).to.not.be.null;
expect(session.connection).to.not.be.undefined;
console.log("✓ In-memory session created successfully");
console.log("✓ Connection:", session.connection);
});
it('should execute simple query in memory session', function () {
const result = session.query("SELECT 1 as test_col", "CSV");
console.log("Query result:", result.trim());
expect(result).to.be.a('string');
expect(result.trim()).to.equal('1');
});
it('should create table and insert data in memory session', function () {
expect(() => {
session.query("CREATE TABLE memory_test (id UInt32, name String) ENGINE = Memory");
session.query("INSERT INTO memory_test VALUES (1, 'MemoryAlice'), (2, 'MemoryBob')");
}).to.not.throw();
console.log("✓ Memory table created and data inserted successfully");
});
it('should query data from memory table', function () {
const result = session.query("SELECT * FROM memory_test ORDER BY id", "CSV");
console.log("Memory query result:", result.trim());
expect(result).to.be.a('string');
expect(result).to.include('MemoryAlice');
expect(result).to.include('MemoryBob');
expect(result).to.include('1');
expect(result).to.include('2');
});
it('should cleanup session and verify data is not accessible in new session', function () {
// Cleanup the current session
session.cleanup();
console.log("✓ Memory session cleaned up");
// Create a new session without path
session = new Session();
console.log("✓ New memory session created");
// Try to query the previous table - should fail or return empty
expect(() => {
const result = session.query("SELECT * FROM memory_test", "CSV");
}).to.throw(); // Expected to throw error since table shouldn't exist
console.log("✓ Data correctly cleaned up - table not accessible in new session");
});
after(function () {
// Clean up the session after all tests are done
if (session) {
session.cleanup();
}
});
});
});