blob: 1606f473f9b8d4c09814e8a250201882661f1982 [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.
*/
import {
Config,
DEFAULT_CONFIG,
DEFAULT_POOL_CONFIG,
PoolConfig,
ConfigBuilder,
PoolConfigBuilder,
EndPoint,
parseNodeUrls
} from '../../src/utils/Config';
describe('Config', () => {
test('DEFAULT_CONFIG should have correct values', () => {
expect(DEFAULT_CONFIG.port).toBe(6667);
expect(DEFAULT_CONFIG.username).toBe('root');
expect(DEFAULT_CONFIG.password).toBe('root');
expect(DEFAULT_CONFIG.fetchSize).toBe(1024);
expect(DEFAULT_CONFIG.enableSSL).toBe(false);
});
test('DEFAULT_POOL_CONFIG should have correct values', () => {
expect(DEFAULT_POOL_CONFIG.maxPoolSize).toBe(10);
expect(DEFAULT_POOL_CONFIG.minPoolSize).toBe(1);
expect(DEFAULT_POOL_CONFIG.maxIdleTime).toBe(60000);
expect(DEFAULT_POOL_CONFIG.waitTimeout).toBe(60000);
});
test('Should merge config with defaults', () => {
const customConfig: Partial<Config> = {
host: 'localhost',
port: 8080,
username: 'admin',
};
const merged = { ...DEFAULT_CONFIG, ...customConfig };
expect(merged.host).toBe('localhost');
expect(merged.port).toBe(8080);
expect(merged.username).toBe('admin');
expect(merged.password).toBe('root'); // Should keep default
});
test('Should support SSL options', () => {
const sslConfig: Partial<Config> = {
host: 'localhost',
enableSSL: true,
sslOptions: {
rejectUnauthorized: false,
},
};
expect(sslConfig.enableSSL).toBe(true);
expect(sslConfig.sslOptions?.rejectUnauthorized).toBe(false);
});
test('PoolConfig should extend Config', () => {
const poolConfig: Partial<PoolConfig> = {
host: 'localhost',
maxPoolSize: 20,
minPoolSize: 5,
maxIdleTime: 30000,
};
expect(poolConfig.host).toBe('localhost');
expect(poolConfig.maxPoolSize).toBe(20);
expect(poolConfig.minPoolSize).toBe(5);
});
test('Should support nodeUrls configuration', () => {
const nodeUrls: EndPoint[] = [
{ host: 'node1.example.com', port: 6667 },
{ host: 'node2.example.com', port: 6668 },
{ host: 'node3.example.com', port: 6669 },
];
const config: Partial<Config> = {
nodeUrls,
username: 'root',
password: 'root',
};
expect(config.nodeUrls).toBeDefined();
expect(config.nodeUrls?.length).toBe(3);
expect(config.nodeUrls?.[0].host).toBe('node1.example.com');
expect(config.nodeUrls?.[1].port).toBe(6668);
});
test('Should support nodeUrls in string array format', () => {
const nodeUrls: string[] = [
'node1.example.com:6667',
'node2.example.com:6668',
'node3.example.com:6669',
];
const config: Partial<Config> = {
nodeUrls,
username: 'root',
password: 'root',
};
expect(config.nodeUrls).toBeDefined();
expect(config.nodeUrls?.length).toBe(3);
expect(config.nodeUrls?.[0]).toBe('node1.example.com:6667');
});
test('Should validate empty nodeUrls array', () => {
const config: Partial<Config> = {
nodeUrls: [],
username: 'root',
password: 'root',
};
expect(config.nodeUrls).toBeDefined();
expect(config.nodeUrls?.length).toBe(0);
});
});
describe('parseNodeUrls', () => {
test('Should parse valid nodeUrls string array', () => {
const nodeUrls = [
'localhost:6667',
'node1:6668',
'node2.example.com:6669',
];
const parsed = parseNodeUrls(nodeUrls);
expect(parsed).toHaveLength(3);
expect(parsed[0]).toEqual({ host: 'localhost', port: 6667 });
expect(parsed[1]).toEqual({ host: 'node1', port: 6668 });
expect(parsed[2]).toEqual({ host: 'node2.example.com', port: 6669 });
});
test('Should throw error for invalid format - no colon', () => {
const nodeUrls = ['localhost6667'];
expect(() => parseNodeUrls(nodeUrls)).toThrow('Invalid nodeUrl format');
});
test('Should throw error for invalid format - multiple colons', () => {
const nodeUrls = ['localhost:6667:extra'];
expect(() => parseNodeUrls(nodeUrls)).toThrow('Invalid nodeUrl format');
});
test('Should throw error for empty host', () => {
const nodeUrls = [':6667'];
expect(() => parseNodeUrls(nodeUrls)).toThrow('Invalid nodeUrl format');
});
test('Should throw error for invalid port', () => {
const nodeUrls = ['localhost:abc'];
expect(() => parseNodeUrls(nodeUrls)).toThrow('Invalid nodeUrl format');
});
test('Should throw error for port out of range', () => {
const nodeUrls = ['localhost:70000'];
expect(() => parseNodeUrls(nodeUrls)).toThrow('Invalid nodeUrl format');
});
test('Should handle whitespace in nodeUrls', () => {
const nodeUrls = [' localhost : 6667 '];
const parsed = parseNodeUrls(nodeUrls);
expect(parsed[0]).toEqual({ host: 'localhost', port: 6667 });
});
});
describe('ConfigBuilder', () => {
test('Should build config with host and port', () => {
const config = new ConfigBuilder()
.host('localhost')
.port(6667)
.username('root')
.password('root')
.build();
expect(config.host).toBe('localhost');
expect(config.port).toBe(6667);
expect(config.username).toBe('root');
expect(config.password).toBe('root');
});
test('Should build config with nodeUrls', () => {
const nodeUrls: EndPoint[] = [
{ host: 'node1', port: 6667 },
{ host: 'node2', port: 6668 },
];
const config = new ConfigBuilder()
.nodeUrls(nodeUrls)
.username('admin')
.password('admin123')
.build();
expect(config.nodeUrls).toEqual(nodeUrls);
expect(config.username).toBe('admin');
expect(config.password).toBe('admin123');
});
test('Should build config with nodeUrls in string format', () => {
const nodeUrls: string[] = [
'node1:6667',
'node2:6668',
];
const config = new ConfigBuilder()
.nodeUrls(nodeUrls)
.username('admin')
.password('admin123')
.build();
expect(config.nodeUrls).toEqual(nodeUrls);
expect(config.username).toBe('admin');
expect(config.password).toBe('admin123');
});
test('Should build config with SSL options', () => {
const config = new ConfigBuilder()
.host('secure.example.com')
.port(6667)
.enableSSL(true)
.sslOptions({ rejectUnauthorized: true })
.build();
expect(config.enableSSL).toBe(true);
expect(config.sslOptions?.rejectUnauthorized).toBe(true);
});
test('Should build config with all options', () => {
const config = new ConfigBuilder()
.host('myhost')
.port(8080)
.username('user')
.password('pass')
.database('mydb')
.timezone('UTC')
.fetchSize(2048)
.enableSSL(false)
.build();
expect(config.host).toBe('myhost');
expect(config.port).toBe(8080);
expect(config.username).toBe('user');
expect(config.password).toBe('pass');
expect(config.database).toBe('mydb');
expect(config.timezone).toBe('UTC');
expect(config.fetchSize).toBe(2048);
expect(config.enableSSL).toBe(false);
});
test('Should allow method chaining', () => {
const builder = new ConfigBuilder();
const result = builder.host('test');
expect(result).toBe(builder); // Should return the same instance
});
});
describe('PoolConfigBuilder', () => {
test('Should build pool config with host and port', () => {
const config = new PoolConfigBuilder()
.host('localhost')
.port(6667)
.username('root')
.password('root')
.maxPoolSize(20)
.minPoolSize(5)
.build();
expect(config.host).toBe('localhost');
expect(config.port).toBe(6667);
expect(config.maxPoolSize).toBe(20);
expect(config.minPoolSize).toBe(5);
});
test('Should build pool config with nodeUrls', () => {
const nodeUrls: EndPoint[] = [
{ host: 'node1', port: 6667 },
{ host: 'node2', port: 6668 },
{ host: 'node3', port: 6669 },
];
const config = new PoolConfigBuilder()
.nodeUrls(nodeUrls)
.username('root')
.password('root')
.maxPoolSize(30)
.minPoolSize(10)
.build();
expect(config.nodeUrls).toEqual(nodeUrls);
expect(config.maxPoolSize).toBe(30);
expect(config.minPoolSize).toBe(10);
});
test('Should build pool config with all pool options', () => {
const config = new PoolConfigBuilder()
.host('myhost')
.port(6667)
.maxPoolSize(15)
.minPoolSize(3)
.maxIdleTime(30000)
.waitTimeout(45000)
.build();
expect(config.maxPoolSize).toBe(15);
expect(config.minPoolSize).toBe(3);
expect(config.maxIdleTime).toBe(30000);
expect(config.waitTimeout).toBe(45000);
});
test('Should allow method chaining', () => {
const builder = new PoolConfigBuilder();
const result = builder.maxPoolSize(10);
expect(result).toBe(builder); // Should return the same instance
});
test('Should inherit all Config options', () => {
const config = new PoolConfigBuilder()
.host('myhost')
.port(6667)
.username('user')
.password('pass')
.database('mydb')
.timezone('UTC+8')
.fetchSize(512)
.enableSSL(true)
.maxPoolSize(10)
.build();
expect(config.host).toBe('myhost');
expect(config.username).toBe('user');
expect(config.database).toBe('mydb');
expect(config.timezone).toBe('UTC+8');
expect(config.maxPoolSize).toBe(10);
});
});