From 92e75f0577055126a245d82b271db12ccf0e587b Mon Sep 17 00:00:00 2001 From: bmc Date: Thu, 17 Jan 2013 18:14:13 -0600 Subject: [PATCH] add ConnectionParameters object --- lib/connection-parameters.js | 38 +++++++++++ .../connection-parameters/creation-tests.js | 49 ++++++++++++++ .../environment-variable-tests.js | 65 +++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 lib/connection-parameters.js create mode 100644 test/unit/connection-parameters/creation-tests.js create mode 100644 test/unit/connection-parameters/environment-variable-tests.js diff --git a/lib/connection-parameters.js b/lib/connection-parameters.js new file mode 100644 index 00000000..bbbbf1dc --- /dev/null +++ b/lib/connection-parameters.js @@ -0,0 +1,38 @@ +var defaults = require(__dirname + '/defaults'); + +var val = function(key, config) { + return config[key] || + process.env['PG' + key.toUpperCase()] || + defaults[key]; +} + +var ConnectionParameters = function(config) { + config = typeof config == 'string' ? parse(config) : (config || {}); + this.user = val('user', config); + this.database = val('database', config); + this.port = parseInt(val('port', config)); + this.host = val('host', config); + this.password = val('password', config); + this.binary = val('binary', config); + this.ssl = config.ssl || defaults.ssl; +} + +var url = require('url'); +//parses a connection string +var parse = function(str) { + //unix socket + if(str.charAt(0) === '/') { + return { host: str }; + } + var result = url.parse(str); + var config = {}; + config.host = result.hostname; + config.database = result.pathname ? result.pathname.slice(1) : null + var auth = (result.auth || ':').split(':'); + config.user = auth[0]; + config.password = auth[1]; + config.port = result.port; + return config; +} + +module.exports = ConnectionParameters; diff --git a/test/unit/connection-parameters/creation-tests.js b/test/unit/connection-parameters/creation-tests.js new file mode 100644 index 00000000..de22c6dc --- /dev/null +++ b/test/unit/connection-parameters/creation-tests.js @@ -0,0 +1,49 @@ +var test = require('tap').test; + +var ConnectionParameters = require(__dirname + '/../../../lib/connection-parameters'); +var defaults = require(__dirname + '/../../../lib').defaults; + +//clear process.env +for(var key in process.env) { + delete process.env[key]; +} + +test('ConnectionParameters construction', function(t) { + t.ok(new ConnectionParameters(), 'with null config'); + t.ok(new ConnectionParameters({user: 'asdf'}), 'with config object'); + t.ok(new ConnectionParameters('pg://localhost/postgres'), 'with connection string'); + t.end(); +}) + +var compare = function(t, actual, expected, type) { + t.equal(actual.user, expected.user, type + ' user'); + t.equal(actual.database, expected.database, type + ' database'); + t.equal(actual.port, expected.port, type + ' port'); + t.equal(actual.host, expected.host, type + ' host'); + t.equal(actual.password, expected.password, type + ' password'); + t.equal(actual.binary, expected.binary, type + ' binary'); +} + +test('ConnectionParameters initializing from defaults', function(t) { + var subject = new ConnectionParameters(); + compare(t, subject, defaults, 'defaults'); + t.end(); +}) + +test('ConnectionParameters initializing from config', function(t) { + var config = { + user: 'brian', + database: 'home', + port: 7777, + password: 'pizza', + binary: true, + encoding: 'utf8', + host: 'yo', + ssl: { + asdf: 'blah' + } + } + var subject = new ConnectionParameters(config); + compare(t, subject, config, 'config'); + t.end(); +}) diff --git a/test/unit/connection-parameters/environment-variable-tests.js b/test/unit/connection-parameters/environment-variable-tests.js new file mode 100644 index 00000000..2edc25a1 --- /dev/null +++ b/test/unit/connection-parameters/environment-variable-tests.js @@ -0,0 +1,65 @@ +var test = require('tap').test; + +var ConnectionParameters = require(__dirname + '/../../../lib/connection-parameters'); +var defaults = require(__dirname + '/../../../lib').defaults; + + +//clear process.env +var realEnv = {}; +for(var key in process.env) { + realEnv[key] = process.env[key]; + delete process.env[key]; +} + + +test('ConnectionParameters initialized from environment variables', function(t) { + process.env['PGHOST'] = 'local'; + process.env['PGUSER'] = 'bmc2'; + process.env['PGPORT'] = 7890; + process.env['PGDATABASE'] = 'allyerbase'; + process.env['PGPASSWORD'] = 'open'; + + var subject = new ConnectionParameters(); + t.equal(subject.host, 'local', 'env host'); + t.equal(subject.user, 'bmc2', 'env user'); + t.equal(subject.port, 7890, 'env port'); + t.equal(subject.database, 'allyerbase', 'env database'); + t.equal(subject.password, 'open', 'env password'); + t.end(); +}) + +test('ConnectionParameters initialized from mix', function(t) { + delete process.env['PGPASSWORD']; + delete process.env['PGDATABASE']; + var subject = new ConnectionParameters({ + user: 'testing', + database: 'zugzug' + }) + t.equal(subject.host, 'local', 'env host'); + t.equal(subject.user, 'testing', 'config user'); + t.equal(subject.port, 7890, 'env port'); + t.equal(subject.database, 'zugzug', 'config database'); + t.equal(subject.password, defaults.password, 'defaults password'); + t.end(); +}) + +//clear process.env +for(var key in process.env) { + delete process.env[key]; +} + +test('connection string parsing', function(t) { + var string = 'postgres://brian:pw@boom:381/lala'; + var subject = new ConnectionParameters(string); + t.equal(subject.host, 'boom', 'string host'); + t.equal(subject.user, 'brian', 'string user'); + t.equal(subject.password, 'pw', 'string password'); + t.equal(subject.port, 381, 'string port'); + t.equal(subject.database, 'lala', 'string database'); + t.end(); +}) + +//restore process.env +for(var key in realEnv) { + process.env[key] = realEnv[key]; +}