Migrating test to jest (#292)
* set up jest dependencies * add parser option to eslint to support es6 * migrate first test to jest * migrate the argv test to shpec * convert the env and literal store tests * convert the file-store tests * convert the memory-store tests * convert the hierarchy tests * convert the provider-save test * convert the complete test * convert the provider test * convert the conf test * tweak a test that was no longer working (context changed) * replace in place the helpers file * remove vows dependency * update the test invocation to rely on jest * update the argv test to be able to use the jest --verbose option * Some tweaks to the test to have them working * Update node version tested (+10 +12 -9) * Replace const by var until we drop 0.10/0.12/4 node * Replace let by var until we drop 0.10/0.12/4 node
This commit is contained in:
parent
17376d4d17
commit
b8686aeff0
28 changed files with 4466 additions and 1927 deletions
|
@ -2,6 +2,9 @@
|
||||||
"env": {
|
"env": {
|
||||||
"node": true
|
"node": true
|
||||||
},
|
},
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 6
|
||||||
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"no-unused-vars": "error"
|
"no-unused-vars": "error"
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,8 @@ node_js:
|
||||||
- "4"
|
- "4"
|
||||||
- "6"
|
- "6"
|
||||||
- "8"
|
- "8"
|
||||||
- "9"
|
- "10"
|
||||||
|
- "12"
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- npm test
|
- npm test
|
||||||
|
@ -19,7 +20,6 @@ matrix:
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- node_js: "0.10"
|
- node_js: "0.10"
|
||||||
- node_js: "0.12"
|
- node_js: "0.12"
|
||||||
- node_js: "9"
|
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email:
|
email:
|
||||||
|
|
|
@ -27,6 +27,7 @@ var Argv = exports.Argv = function (options, usage) {
|
||||||
if(typeof options.readOnly === 'boolean') {
|
if(typeof options.readOnly === 'boolean') {
|
||||||
this.readOnly = options.readOnly;
|
this.readOnly = options.readOnly;
|
||||||
delete options.readOnly;
|
delete options.readOnly;
|
||||||
|
// FIXME; should not mutate options!!!!
|
||||||
} else {
|
} else {
|
||||||
this.readOnly = true;
|
this.readOnly = true;
|
||||||
}
|
}
|
||||||
|
|
3413
package-lock.json
generated
3413
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -20,6 +20,7 @@
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ini": "^1.3.0",
|
"ini": "^1.3.0",
|
||||||
|
"jest": "^21.2.1",
|
||||||
"secure-keys": "^1.0.0",
|
"secure-keys": "^1.0.0",
|
||||||
"yargs": "^10.0.3"
|
"yargs": "^10.0.3"
|
||||||
},
|
},
|
||||||
|
@ -28,13 +29,12 @@
|
||||||
"coveralls": "^3.0.2",
|
"coveralls": "^3.0.2",
|
||||||
"eslint": "^5.5.0",
|
"eslint": "^5.5.0",
|
||||||
"istanbul": "^0.4.1",
|
"istanbul": "^0.4.1",
|
||||||
"nconf-yaml": "^1.0.2",
|
"nconf-yaml": "^1.0.2"
|
||||||
"vows": "^0.8.2"
|
|
||||||
},
|
},
|
||||||
"main": "./lib/nconf",
|
"main": "./lib/nconf",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "vows test/*-test.js test/**/*-test.js --spec",
|
"test": "jest --verbose",
|
||||||
"cover": "istanbul cover vows -- test/*-test.js test/**/*-test.js --spec",
|
"cover": "jest --coverage",
|
||||||
"coveralls": "cat coverage/lcov.info | coveralls",
|
"coveralls": "cat coverage/lcov.info | coveralls",
|
||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
/*
|
|
||||||
* common.js: Tests for common utility function in nconf.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
vows = require('vows'),
|
|
||||||
helpers = require('./helpers'),
|
|
||||||
nconf = require('../lib/nconf');
|
|
||||||
|
|
||||||
var mergeDir = path.join(__dirname, 'fixtures', 'merge'),
|
|
||||||
files = fs.readdirSync(mergeDir).map(function (f) { return path.join(mergeDir, f) });
|
|
||||||
|
|
||||||
vows.describe('nconf/common').addBatch({
|
|
||||||
"Using nconf.common module": {
|
|
||||||
"the loadFiles() method": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.loadFiles(files, this.callback);
|
|
||||||
},
|
|
||||||
"should merge the files correctly": helpers.assertMerged
|
|
||||||
},
|
|
||||||
"the loadFilesSync() method": {
|
|
||||||
"should merge the files correctly": function () {
|
|
||||||
helpers.assertMerged(null, nconf.loadFilesSync(files));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
28
test/common.test.js
Normal file
28
test/common.test.js
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* common.js: Tests for common utility function in nconf.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var helpers = require('./helpers');
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
|
||||||
|
var mergeDir = path.join(__dirname, 'fixtures', 'merge');
|
||||||
|
var files = fs.readdirSync(mergeDir).map(function (f) { return path.join(mergeDir, f) });
|
||||||
|
|
||||||
|
describe('nconf/common', () => {
|
||||||
|
describe('Using nconf.common module', () => {
|
||||||
|
it('the loadFiles() method should merge the files correctly', done => {
|
||||||
|
nconf.loadFiles(files, (err, res) => {
|
||||||
|
helpers.assertMerged(err, res);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the loadFilesSync() method should merge the files correctly", () => {
|
||||||
|
helpers.assertMerged(null, nconf.loadFilesSync(files));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,357 +0,0 @@
|
||||||
/*
|
|
||||||
* complete-test.js: Complete test for multiple stores.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
|
||||||
vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../lib/nconf'),
|
|
||||||
data = require('./fixtures/data').data,
|
|
||||||
helpers = require('./helpers');
|
|
||||||
|
|
||||||
var completeTest = helpers.fixture('complete-test.json'),
|
|
||||||
complete = helpers.fixture('complete.json');
|
|
||||||
|
|
||||||
// prime the process.env
|
|
||||||
process.env['NCONF_foo'] = 'bar';
|
|
||||||
process.env.FOO = 'bar';
|
|
||||||
process.env.BAR = 'zalgo';
|
|
||||||
process.env.NODE_ENV = 'debug';
|
|
||||||
process.env.FOOBAR = 'should not load';
|
|
||||||
process.env.TES = 'TING';
|
|
||||||
process.env.json_array = JSON.stringify(['foo', 'bar', 'baz']);
|
|
||||||
process.env.json_obj = JSON.stringify({foo: 'bar', baz: 'foo'});
|
|
||||||
process.env.NESTED__VALUE = 'nested';
|
|
||||||
process.env.NESTED___VALUE_EXTRA_LODASH = '_nested_';
|
|
||||||
|
|
||||||
vows.describe('nconf/multiple-stores').addBatch({
|
|
||||||
"When using the nconf with multiple providers": {
|
|
||||||
topic: function () {
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({
|
|
||||||
// separator: '__',
|
|
||||||
match: /^NCONF_/,
|
|
||||||
whitelist: ['NODE_ENV', 'FOO', 'BAR', 'TES']
|
|
||||||
});
|
|
||||||
nconf.file({ file: completeTest });
|
|
||||||
nconf.use('argv', { type: 'literal', store: data });
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should have the correct `stores`": function () {
|
|
||||||
assert.isObject(nconf.stores.env);
|
|
||||||
assert.isObject(nconf.stores.argv);
|
|
||||||
assert.isObject(nconf.stores.file);
|
|
||||||
},
|
|
||||||
"env vars": {
|
|
||||||
"are present": function () {
|
|
||||||
['NODE_ENV', 'FOO', 'BAR', 'NCONF_foo'].forEach(function (key) {
|
|
||||||
assert.equal(nconf.get(key), process.env[key]);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"are readOnly": function () {
|
|
||||||
nconf.set('tes', 'broken');
|
|
||||||
assert(nconf.get('tes'), 'TING');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"json vars": {
|
|
||||||
topic: function () {
|
|
||||||
fs.readFile(complete, 'utf8', this.callback);
|
|
||||||
},
|
|
||||||
"are present": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
data = JSON.parse(data);
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.deepEqual(nconf.get(key), data[key]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"literal vars": {
|
|
||||||
"are present": function () {
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.deepEqual(nconf.get(key), data[key]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"and saving *synchronously*": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.set('weebls', 'stuff');
|
|
||||||
return nconf.save();
|
|
||||||
},
|
|
||||||
"correct return value": function (topic) {
|
|
||||||
Object.keys(topic).forEach(function (key) {
|
|
||||||
assert.deepEqual(topic[key], nconf.get(key));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"the file": {
|
|
||||||
topic: function () {
|
|
||||||
fs.readFile(completeTest, 'utf8', this.callback);
|
|
||||||
},
|
|
||||||
"saved correctly": function (err, data) {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.deepEqual(data[key], nconf.get(key));
|
|
||||||
});
|
|
||||||
assert.equal(nconf.get('weebls'), 'stuff');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
// remove the file so that we can test saving it async
|
|
||||||
fs.unlinkSync(completeTest);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using the nconf with multiple providers": {
|
|
||||||
"and saving *asynchronously*": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.set('weebls', 'crap');
|
|
||||||
nconf.save(this.callback);
|
|
||||||
},
|
|
||||||
"correct return value": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.deepEqual(data[key], nconf.get(key));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"the file": {
|
|
||||||
topic: function () {
|
|
||||||
fs.readFile(completeTest, 'utf8', this.callback);
|
|
||||||
},
|
|
||||||
"saved correctly": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
data = JSON.parse(data);
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.deepEqual(nconf.get(key), data[key]);
|
|
||||||
});
|
|
||||||
assert.equal(nconf.get('weebls'), 'crap');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
fs.unlinkSync(completeTest);
|
|
||||||
nconf.remove('file');
|
|
||||||
nconf.remove('memory');
|
|
||||||
nconf.remove('argv');
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with lowerCase:true": {
|
|
||||||
topic: function () {
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({ lowerCase: true });
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"env vars": {
|
|
||||||
"keys also available as lower case": function () {
|
|
||||||
Object.keys(process.env).forEach(function (key) {
|
|
||||||
assert.equal(nconf.get(key.toLowerCase()), process.env[key]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with parseValues:true": {
|
|
||||||
topic: function () {
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({ parseValues: true });
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"env vars": {
|
|
||||||
"JSON keys properly parsed": function () {
|
|
||||||
Object.keys(process.env).forEach(function (key) {
|
|
||||||
var val = process.env[key];
|
|
||||||
|
|
||||||
try {
|
|
||||||
val = JSON.parse(val);
|
|
||||||
} catch (err) {}
|
|
||||||
|
|
||||||
assert.deepEqual(nconf.get(key), val);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with transform:fn": {
|
|
||||||
topic: function () {
|
|
||||||
|
|
||||||
function testTransform(obj) {
|
|
||||||
if (obj.key === 'FOO') {
|
|
||||||
obj.key = 'FOOD';
|
|
||||||
obj.value = 'BARFOO';
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({ transform: testTransform })
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"port key/value properly transformed": function() {
|
|
||||||
assert.equal(nconf.get('FOOD'), 'BARFOO');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with a transform:fn that drops an entry": {
|
|
||||||
topic: function () {
|
|
||||||
|
|
||||||
function testTransform(obj) {
|
|
||||||
if (obj.key === 'FOO') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({ transform: testTransform });
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"port key/value properly transformed": function() {
|
|
||||||
assert.equal(typeof nconf.get('FOO'), 'undefined');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with a transform:fn that return an undefined value": {
|
|
||||||
topic: function () {
|
|
||||||
|
|
||||||
function testTransform(obj) {
|
|
||||||
if (obj.key === 'FOO') {
|
|
||||||
return {key: 'FOO', value: undefined};
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
nconf.env({ transform: testTransform });
|
|
||||||
that.callback();
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"port key/value properly transformed": function() {
|
|
||||||
assert.equal(typeof nconf.get('FOO'), 'undefined');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with a bad transform:fn": {
|
|
||||||
topic: function () {
|
|
||||||
function testTransform() {
|
|
||||||
return {foo: 'bar'};
|
|
||||||
}
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
try {
|
|
||||||
nconf.env({ transform: testTransform });
|
|
||||||
that.callback();
|
|
||||||
} catch (err) {
|
|
||||||
that.callback(null, err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"port key/value throws transformation error": function(err) {
|
|
||||||
assert.equal(err.name, 'RuntimeError');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with a bad transform:fn": {
|
|
||||||
topic: function () {
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
try {
|
|
||||||
nconf.env({ separator: /__+/ });
|
|
||||||
that.callback();
|
|
||||||
} catch (err) {
|
|
||||||
that.callback(null, err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"can access to nested values": function(/*err*/) {
|
|
||||||
assert.deepEqual(nconf.get('NESTED'), {VALUE:'nested', VALUE_EXTRA_LODASH: '_nested_'});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
// Threw this in it's own batch to make sure it's run separately from the
|
|
||||||
// sync check
|
|
||||||
"When using env with a readOnly:false": {
|
|
||||||
topic: function () {
|
|
||||||
|
|
||||||
var that = this;
|
|
||||||
helpers.cp(complete, completeTest, function () {
|
|
||||||
try {
|
|
||||||
nconf.env({ readOnly: false });
|
|
||||||
that.callback();
|
|
||||||
} catch (err) {
|
|
||||||
that.callback(null, err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, "env vars": {
|
|
||||||
"can be changed when readOnly is false": function() {
|
|
||||||
assert.equal(nconf.get('TES'), 'TING');
|
|
||||||
nconf.set('TES', 'changed');
|
|
||||||
assert.equal(nconf.get('TES'), 'changed');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
teardown: function () {
|
|
||||||
nconf.remove('env');
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
258
test/complete.test.js
Normal file
258
test/complete.test.js
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
/*
|
||||||
|
* complete-test.js: Complete test for multiple stores.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
var data = require('./fixtures/data').data;
|
||||||
|
var helpers = require('./helpers');
|
||||||
|
|
||||||
|
var completeTest = helpers.fixture('complete-test.json');
|
||||||
|
var complete = helpers.fixture('complete.json');
|
||||||
|
|
||||||
|
// prime the process.env
|
||||||
|
process.env['NCONF_foo'] = 'bar';
|
||||||
|
process.env.FOO = 'bar';
|
||||||
|
process.env.BAR = 'zalgo';
|
||||||
|
process.env.NODE_ENV = 'debug';
|
||||||
|
process.env.FOOBAR = 'should not load';
|
||||||
|
process.env.json_array = JSON.stringify(['foo', 'bar', 'baz']);
|
||||||
|
process.env.json_obj = JSON.stringify({foo: 'bar', baz: 'foo'});
|
||||||
|
process.env.NESTED__VALUE = 'nested';
|
||||||
|
process.env.NESTED___VALUE_EXTRA_LODASH = '_nested_';
|
||||||
|
|
||||||
|
describe('nconf/multiple-stores', () => {
|
||||||
|
describe("When using the nconf with multiple providers", () => {
|
||||||
|
beforeAll(done => {
|
||||||
|
helpers.cp(complete, completeTest, function () {
|
||||||
|
nconf.env({
|
||||||
|
// separator: '__',
|
||||||
|
match: /^NCONF_/,
|
||||||
|
whitelist: ['NODE_ENV', 'FOO', 'BAR']
|
||||||
|
});
|
||||||
|
nconf.file({file: completeTest});
|
||||||
|
nconf.use('argv', {type: 'literal', store: data});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
afterAll(() => {
|
||||||
|
fs.unlinkSync(completeTest);
|
||||||
|
nconf.remove('file');
|
||||||
|
nconf.remove('memory');
|
||||||
|
nconf.remove('argv');
|
||||||
|
nconf.remove('env');
|
||||||
|
})
|
||||||
|
it("should have the correct `stores`", () => {
|
||||||
|
expect(typeof nconf.stores.env).toBe('object');
|
||||||
|
expect(typeof nconf.stores.argv).toBe('object');
|
||||||
|
expect(typeof nconf.stores.file).toBe('object');
|
||||||
|
});
|
||||||
|
it("env vars, are present", () => {
|
||||||
|
['NODE_ENV', 'FOO', 'BAR', 'NCONF_foo'].forEach(function (key) {
|
||||||
|
expect(nconf.get(key)).toEqual(process.env[key]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("json vars are present", done => {
|
||||||
|
fs.readFile(complete, 'utf8', (err, data) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
data = JSON.parse(data);
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
expect(nconf.get(key)).toEqual(data[key]);
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("literal vars are present", () => {
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
expect(nconf.get(key)).toEqual(data[key]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('saving', () => {
|
||||||
|
afterEach(() => {
|
||||||
|
// remove the file so that we can test saving it async
|
||||||
|
fs.unlinkSync(completeTest);
|
||||||
|
});
|
||||||
|
it("and saving *synchronously* correct return value, the file, saved correctly", done => {
|
||||||
|
nconf.set('weebls', 'stuff');
|
||||||
|
var topic = nconf.save();
|
||||||
|
Object.keys(topic).forEach(function (key) {
|
||||||
|
expect(topic[key]).toEqual(nconf.get(key));
|
||||||
|
});
|
||||||
|
fs.readFile(completeTest, 'utf8', function (err, data) {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
data = JSON.parse(data);
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
expect(data[key]).toEqual(nconf.get(key));
|
||||||
|
});
|
||||||
|
expect(nconf.get('weebls')).toEqual('stuff');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("and saving *asynchronously* correct return value, the file, saved correctly", done => {
|
||||||
|
nconf.set('weebls', 'crap');
|
||||||
|
nconf.save((err, data) => {
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
expect(data[key]).toEqual(nconf.get(key));
|
||||||
|
});
|
||||||
|
fs.readFile(completeTest, 'utf8', function (err, data) {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
data = JSON.parse(data);
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
expect(data[key]).toEqual(nconf.get(key));
|
||||||
|
});
|
||||||
|
expect(nconf.get('weebls')).toEqual('crap');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("When using the nconf env with custom options", () => {
|
||||||
|
|
||||||
|
describe("When using env with lowerCase:true", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({lowerCase: true});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it("env vars keys also available as lower case", () => {
|
||||||
|
Object.keys(process.env).forEach(function (key) {
|
||||||
|
expect(nconf.get(key.toLowerCase())).toEqual(process.env[key]);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe("When using env with parseValues:true", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({parseValues: true});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it("JSON keys properly parsed", () => {
|
||||||
|
Object.keys(process.env).forEach(function (key) {
|
||||||
|
var val = process.env[key];
|
||||||
|
|
||||||
|
try {
|
||||||
|
val = JSON.parse(val);
|
||||||
|
} catch (err) {
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(nconf.get(key)).toEqual(val);
|
||||||
|
})
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("When using env with transform:fn", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
function testTransform(obj) {
|
||||||
|
if (obj.key === 'FOO') {
|
||||||
|
obj.key = 'FOOD';
|
||||||
|
obj.value = 'BARFOO';
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({transform: testTransform});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("env vars port key/value properly transformed", () => {
|
||||||
|
expect(nconf.get('FOOD')).toEqual('BARFOO');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
describe("When using env with transform:fn that drops an entry", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
function testTransform(obj) {
|
||||||
|
if (obj.key === 'FOO') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({transform: testTransform});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("env vars port key/value properly transformed", () => {
|
||||||
|
expect(nconf.get('FOO')).toBe(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
describe("When using env with transform:fn that return an undefined value", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
function testTransform(obj) {
|
||||||
|
if (obj.key === 'FOO') {
|
||||||
|
return {key: 'FOO', value: undefined};
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({transform: testTransform});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("env vars port key/value properly transformed", () => {
|
||||||
|
expect(nconf.get('FOO')).toBe(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
describe("When using env with bad transform:fn", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
it(" port key/value throws transformation error", done => {
|
||||||
|
|
||||||
|
function testTransform(obj) {
|
||||||
|
return {foo: 'bar'};
|
||||||
|
}
|
||||||
|
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
try {
|
||||||
|
nconf.env({transform: testTransform});
|
||||||
|
} catch (err) {
|
||||||
|
expect(err.name).toEqual('RuntimeError')
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
describe("When using env with a separator", () => {
|
||||||
|
// Threw this in it's own batch to make sure it's run separately from the sync check
|
||||||
|
beforeAll(done => {
|
||||||
|
helpers.cp(complete, completeTest, () => {
|
||||||
|
nconf.env({separator: /__+/});
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("can access to nested values", () => {
|
||||||
|
expect(nconf.get('NESTED')).toEqual({VALUE: 'nested', VALUE_EXTRA_LODASH: '_nested_'});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => nconf.remove('env'))
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
|
@ -5,33 +5,33 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var assert = require('assert'),
|
var spawn = require('child_process').spawn;
|
||||||
spawn = require('child_process').spawn,
|
var fs = require('fs');
|
||||||
fs = require('fs'),
|
var path = require('path');
|
||||||
path = require('path'),
|
var nconf = require('../lib/nconf');
|
||||||
nconf = require('../lib/nconf');
|
|
||||||
|
|
||||||
exports.assertMerged = function (err, merged) {
|
exports.assertMerged = function (err, merged) {
|
||||||
merged = merged instanceof nconf.Provider
|
merged = merged instanceof nconf.Provider
|
||||||
? merged.store.store
|
? merged.store.store
|
||||||
: merged;
|
: merged;
|
||||||
|
|
||||||
assert.isNull(err);
|
expect()
|
||||||
assert.isObject(merged);
|
expect(err).toBeNull();
|
||||||
assert.isTrue(merged.apples);
|
expect(typeof merged).toBe('object');
|
||||||
assert.isTrue(merged.bananas);
|
expect(merged.apples).toBeTruthy();
|
||||||
assert.isObject(merged.candy);
|
expect(merged.bananas).toBeTruthy();
|
||||||
assert.isTrue(merged.candy.something1);
|
expect(typeof merged.candy).toBe('object');
|
||||||
assert.isTrue(merged.candy.something2);
|
expect(merged.candy.something1).toBeTruthy();
|
||||||
assert.isTrue(merged.candy.something3);
|
expect(merged.candy.something2).toBeTruthy();
|
||||||
assert.isTrue(merged.candy.something4);
|
expect(merged.candy.something3).toBeTruthy();
|
||||||
assert.isTrue(merged.dates);
|
expect(merged.candy.something4).toBeTruthy();
|
||||||
assert.isTrue(merged.elderberries);
|
expect(merged.dates).toBeTruthy();
|
||||||
|
expect(merged.elderberries).toBeTruthy();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//FIXME TODO
|
||||||
exports.assertSystemConf = function (options) {
|
exports.assertSystemConf = function (options) {
|
||||||
return {
|
return done => {
|
||||||
topic: function () {
|
|
||||||
var env = null;
|
var env = null;
|
||||||
|
|
||||||
if (options.env) {
|
if (options.env) {
|
||||||
|
@ -45,12 +45,11 @@ exports.assertSystemConf = function (options) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var child = spawn('node', [options.script].concat(options.argv), { env: env });
|
var child = spawn('node', [options.script].concat(options.argv), {env: env});
|
||||||
child.stdout.once('data', this.callback.bind(this, null));
|
child.stdout.once('data', data => {
|
||||||
},
|
expect(data.toString()).toEqual('foobar');
|
||||||
"should respond with the value passed into the script": function (_, data) {
|
done();
|
||||||
assert.equal(data.toString(), 'foobar');
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,183 +0,0 @@
|
||||||
/*
|
|
||||||
* hierarchy-test.js: Basic tests for hierarchical file stores.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var assert = require('assert'),
|
|
||||||
fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
spawn = require('child_process').spawn,
|
|
||||||
vows = require('vows'),
|
|
||||||
nconf = require('../lib/nconf');
|
|
||||||
|
|
||||||
var configDir = path.join(__dirname, 'fixtures', 'hierarchy'),
|
|
||||||
globalConfig = path.join(configDir, 'global.json'),
|
|
||||||
userConfig = path.join(configDir, 'user.json');
|
|
||||||
|
|
||||||
vows.describe('nconf/hierarchy').addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"configured with two file stores": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.add('user', { type: 'file', file: userConfig });
|
|
||||||
nconf.add('global', { type: 'file', file: globalConfig });
|
|
||||||
nconf.load();
|
|
||||||
return nconf;
|
|
||||||
},
|
|
||||||
"should have the appropriate keys present": function () {
|
|
||||||
assert.equal(nconf.get('title'), 'My specific title');
|
|
||||||
assert.equal(nconf.get('color'), 'green');
|
|
||||||
assert.equal(nconf.get('movie'), 'Kill Bill');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"configured with two file stores using `file`": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.file('user', userConfig);
|
|
||||||
nconf.file('global', globalConfig);
|
|
||||||
nconf.load();
|
|
||||||
return nconf;
|
|
||||||
},
|
|
||||||
"should have the appropriate keys present": function () {
|
|
||||||
assert.equal(nconf.get('title'), 'My specific title');
|
|
||||||
assert.equal(nconf.get('color'), 'green');
|
|
||||||
assert.equal(nconf.get('movie'), 'Kill Bill');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"configured with .argv(), .env() and .file()": {
|
|
||||||
topic: function () {
|
|
||||||
var configFile = path.join(__dirname, 'fixtures', 'load-save.json'),
|
|
||||||
script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-save.js'),
|
|
||||||
argv = ['--foo', 'foo', '--bar', 'bar'],
|
|
||||||
that = this,
|
|
||||||
data = '',
|
|
||||||
child;
|
|
||||||
|
|
||||||
try { fs.unlinkSync(configFile) }
|
|
||||||
catch (ex) {
|
|
||||||
// No-op
|
|
||||||
}
|
|
||||||
|
|
||||||
child = spawn('node', [script].concat(argv));
|
|
||||||
|
|
||||||
child.stdout.on('data', function (d) {
|
|
||||||
data += d;
|
|
||||||
});
|
|
||||||
|
|
||||||
child.on('close', function () {
|
|
||||||
fs.readFile(configFile, 'utf8', that.callback.bind(null, null, data));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should not persist information passed in to process.env and process.argv to disk ": function (_, data, _, ondisk){
|
|
||||||
assert.equal(data, 'foo');
|
|
||||||
assert.deepEqual(JSON.parse(ondisk), {
|
|
||||||
database: {
|
|
||||||
host: '127.0.0.1',
|
|
||||||
port: 5984
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"configured with .argv(), .file() and invoked with nested command line options": {
|
|
||||||
topic: function () {
|
|
||||||
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge.js'),
|
|
||||||
argv = ['--candy:something', 'foo', '--candy:something5:second', 'bar'],
|
|
||||||
that = this,
|
|
||||||
data = '',
|
|
||||||
child;
|
|
||||||
|
|
||||||
child = spawn('node', [script].concat(argv));
|
|
||||||
|
|
||||||
child.stdout.on('data', function (d) {
|
|
||||||
data += d;
|
|
||||||
});
|
|
||||||
|
|
||||||
child.on('close', function() {
|
|
||||||
that.callback(null, data);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should merge nested objects ": function (err, data) {
|
|
||||||
assert.deepEqual(JSON.parse(data), {
|
|
||||||
apples: true,
|
|
||||||
candy: {
|
|
||||||
something: 'foo',
|
|
||||||
something1: true,
|
|
||||||
something2: true,
|
|
||||||
something5: {
|
|
||||||
first: 1,
|
|
||||||
second: 'bar'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"configured with .argv() and separator, .file() and invoked with nested command line options": {
|
|
||||||
topic: function () {
|
|
||||||
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge-with-separator.js'),
|
|
||||||
argv = ['--candy--something', 'foo', '--candy--something5--second', 'bar'],
|
|
||||||
that = this,
|
|
||||||
data = '',
|
|
||||||
child;
|
|
||||||
process.env.candy__bonbon = 'sweet';
|
|
||||||
child = spawn('node', [script].concat(argv));
|
|
||||||
delete process.env.candy__bonbon;
|
|
||||||
child.stdout.on('data', function (d) {
|
|
||||||
data += d;
|
|
||||||
});
|
|
||||||
|
|
||||||
child.on('close', function() {
|
|
||||||
that.callback(null, data);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should merge nested objects ": function (err, data) {
|
|
||||||
console.log(data)
|
|
||||||
assert.deepEqual(JSON.parse(data), {
|
|
||||||
apples: true,
|
|
||||||
candy: {
|
|
||||||
bonbon: 'sweet',
|
|
||||||
something: 'foo',
|
|
||||||
something1: true,
|
|
||||||
something2: true,
|
|
||||||
something5: {
|
|
||||||
first: 1,
|
|
||||||
second: 'bar'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"configured with .file(), .defaults() should deep merge objects": {
|
|
||||||
topic: function () {
|
|
||||||
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-defaults-merge.js'),
|
|
||||||
that = this,
|
|
||||||
data = '',
|
|
||||||
child;
|
|
||||||
|
|
||||||
child = spawn('node', [script]);
|
|
||||||
|
|
||||||
child.stdout.on('data', function (d) {
|
|
||||||
data += d;
|
|
||||||
});
|
|
||||||
|
|
||||||
child.on('close', function() {
|
|
||||||
that.callback(null, data);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should merge nested objects ": function (err, data) {
|
|
||||||
assert.deepEqual(JSON.parse(data), {
|
|
||||||
candy: {
|
|
||||||
something: 'much better something for you',
|
|
||||||
something1: true,
|
|
||||||
something2: true,
|
|
||||||
something18: 'completely unique',
|
|
||||||
something5: {
|
|
||||||
first: 1,
|
|
||||||
second: 99
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
159
test/hierarchy.test.js
Normal file
159
test/hierarchy.test.js
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
* hierarchy-test.js: Basic tests for hierarchical file stores.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var spawn = require('child_process').spawn;
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
|
||||||
|
var configDir = path.join(__dirname, 'fixtures', 'hierarchy');
|
||||||
|
var globalConfig = path.join(configDir, 'global.json');
|
||||||
|
var userConfig = path.join(configDir, 'user.json');
|
||||||
|
|
||||||
|
describe('nconf/hierarchy, When using nconf', () => {
|
||||||
|
it("configured with two file stores, should have the appropriate keys present", () => {
|
||||||
|
nconf.add('user', {type: 'file', file: userConfig});
|
||||||
|
nconf.add('global', {type: 'file', file: globalConfig});
|
||||||
|
nconf.load();
|
||||||
|
|
||||||
|
expect(nconf.get('title')).toEqual('My specific title');
|
||||||
|
expect(nconf.get('color')).toEqual('green');
|
||||||
|
expect(nconf.get('movie')).toEqual('Kill Bill');
|
||||||
|
|
||||||
|
});
|
||||||
|
it("configured with two file stores using `file` should have the appropriate keys present", () => {
|
||||||
|
nconf.file('user', userConfig);
|
||||||
|
nconf.file('global', globalConfig);
|
||||||
|
nconf.load();
|
||||||
|
|
||||||
|
expect(nconf.get('title')).toEqual('My specific title');
|
||||||
|
expect(nconf.get('color')).toEqual('green');
|
||||||
|
expect(nconf.get('movie')).toEqual('Kill Bill');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it("configured with .argv(), .env() and .file() should not persist information passed in to process.env and process.argv to disk",
|
||||||
|
done => {
|
||||||
|
var configFile = path.join(__dirname, 'fixtures', 'load-save.json');
|
||||||
|
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-save.js');
|
||||||
|
var argv = ['--foo', 'foo', '--bar', 'bar'];
|
||||||
|
var data = '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(configFile)
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
|
|
||||||
|
var child = spawn('node', [script].concat(argv));
|
||||||
|
|
||||||
|
child.stdout.on('data', function (d) {
|
||||||
|
data += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('close', function () {
|
||||||
|
fs.readFile(configFile, 'utf8', (err, ondisk) => {
|
||||||
|
expect(data).toEqual('foo');
|
||||||
|
expect(JSON.parse(ondisk)).toEqual({
|
||||||
|
database: {
|
||||||
|
host: '127.0.0.1',
|
||||||
|
port: 5984
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it("configured with .argv(), .file() and invoked with nested command line options, should merge nested objects",
|
||||||
|
done => {
|
||||||
|
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-load-merge.js');
|
||||||
|
var argv = ['--candy:something', 'foo', '--candy:something5:second', 'bar'];
|
||||||
|
var data = '';
|
||||||
|
|
||||||
|
var child = spawn('node', [script].concat(argv));
|
||||||
|
|
||||||
|
child.stdout.on('data', function (d) {
|
||||||
|
data += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('close', function () {
|
||||||
|
expect(JSON.parse(data)).toEqual({
|
||||||
|
apples: true,
|
||||||
|
candy: {
|
||||||
|
something: 'foo',
|
||||||
|
something1: true,
|
||||||
|
something2: true,
|
||||||
|
something5: {
|
||||||
|
first: 1,
|
||||||
|
second: 'bar'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("configured with .argv() and separator, .file() and invoked with nested command line options should merge nested objects", done => {
|
||||||
|
|
||||||
|
var script = path.join(__dirname, 'fixtures',
|
||||||
|
'scripts', 'nconf-hierarchical-load-merge-with-separator.js');
|
||||||
|
var argv = ['--candy--something', 'foo', '--candy--something5--second', 'bar'];
|
||||||
|
var data = '';
|
||||||
|
process.env.candy__bonbon = 'sweet';
|
||||||
|
var child = spawn('node', [script].concat(argv));
|
||||||
|
delete process.env.candy__bonbon;
|
||||||
|
child.stdout.on('data', function (d) {
|
||||||
|
data += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('close', function () {
|
||||||
|
console.log(data)
|
||||||
|
expect(JSON.parse(data)).toEqual({
|
||||||
|
apples: true,
|
||||||
|
candy: {
|
||||||
|
bonbon: 'sweet',
|
||||||
|
something: 'foo',
|
||||||
|
something1: true,
|
||||||
|
something2: true,
|
||||||
|
something5: {
|
||||||
|
first: 1,
|
||||||
|
second: 'bar'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("configured with .file(), .defaults() should deep merge objects should merge nested objects ", done => {
|
||||||
|
var script = path.join(__dirname, 'fixtures', 'scripts', 'nconf-hierarchical-defaults-merge.js');
|
||||||
|
var data = '';
|
||||||
|
var child = spawn('node', [script]);
|
||||||
|
|
||||||
|
child.stdout.on('data', function (d) {
|
||||||
|
data += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('close', function () {
|
||||||
|
expect(JSON.parse(data)).toEqual({
|
||||||
|
candy: {
|
||||||
|
something: 'much better something for you',
|
||||||
|
something1: true,
|
||||||
|
something2: true,
|
||||||
|
something18: 'completely unique',
|
||||||
|
something5: {
|
||||||
|
first: 1,
|
||||||
|
second: 99
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,147 +0,0 @@
|
||||||
/*
|
|
||||||
* file-store-test.js: Tests for the nconf File store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../lib/nconf')
|
|
||||||
|
|
||||||
vows.describe('nconf').addBatch({
|
|
||||||
"When using the nconf": {
|
|
||||||
"should have the correct methods set": function () {
|
|
||||||
assert.isFunction(nconf.key);
|
|
||||||
assert.isFunction(nconf.path);
|
|
||||||
assert.isFunction(nconf.use);
|
|
||||||
assert.isFunction(nconf.any);
|
|
||||||
assert.isFunction(nconf.get);
|
|
||||||
assert.isFunction(nconf.set);
|
|
||||||
assert.isFunction(nconf.clear);
|
|
||||||
assert.isFunction(nconf.load);
|
|
||||||
assert.isFunction(nconf.save);
|
|
||||||
assert.isFunction(nconf.reset);
|
|
||||||
assert.isFunction(nconf.required);
|
|
||||||
},
|
|
||||||
"the use() method": {
|
|
||||||
"should instaniate the correct store": function () {
|
|
||||||
nconf.use('memory');
|
|
||||||
nconf.load();
|
|
||||||
assert.instanceOf(nconf.stores['memory'], nconf.Memory);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"it should": {
|
|
||||||
topic: function () {
|
|
||||||
fs.readFile(path.join(__dirname, '..', 'package.json'), this.callback);
|
|
||||||
},
|
|
||||||
"have the correct version set": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
data = JSON.parse(data.toString());
|
|
||||||
assert.equal(nconf.version, data.version);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the required() method": {
|
|
||||||
"should throw error with missing keys": function() {
|
|
||||||
nconf.set('foo:bar:bazz', 'buzz');
|
|
||||||
assert.throws(nconf.required.bind(nconf, ['missing', 'foo:bar:bazz']), Error);
|
|
||||||
},
|
|
||||||
"should return the provider if all required keys exist": function() {
|
|
||||||
var Provider = nconf.Provider;
|
|
||||||
nconf.set('foo:bar:bazz', 'buzz');
|
|
||||||
assert.isTrue(nconf.required(['foo:bar:bazz']) instanceof Provider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf": {
|
|
||||||
"with the memory store": {
|
|
||||||
"the set() method": {
|
|
||||||
"should respond with true": function () {
|
|
||||||
assert.isTrue(nconf.set('foo:bar:bazz', 'buzz'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the get() method": {
|
|
||||||
"without a callback": {
|
|
||||||
"should respond with the correct value": function () {
|
|
||||||
assert.equal(nconf.get('foo:bar:bazz'), 'buzz');
|
|
||||||
},
|
|
||||||
"should not step inside strings": function () {
|
|
||||||
assert.equal(nconf.get('foo:bar:bazz:0'), undefined);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a callback": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.get('foo:bar:bazz', this.callback);
|
|
||||||
},
|
|
||||||
"should respond with the correct value": function (err, value) {
|
|
||||||
assert.equal(value, 'buzz');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf": {
|
|
||||||
"with the memory store": {
|
|
||||||
"the get() method": {
|
|
||||||
"should respond allow access to the root": function () {
|
|
||||||
assert(nconf.get(null));
|
|
||||||
assert(nconf.get(undefined));
|
|
||||||
assert(nconf.get());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the set() method": {
|
|
||||||
"should respond allow access to the root and complain about non-objects": function () {
|
|
||||||
assert(!nconf.set(null, null));
|
|
||||||
assert(!nconf.set(null, undefined));
|
|
||||||
assert(!nconf.set(null));
|
|
||||||
assert(!nconf.set(null, ''));
|
|
||||||
assert(!nconf.set(null, 1));
|
|
||||||
var original = nconf.get();
|
|
||||||
assert(nconf.set(null, nconf.get()));
|
|
||||||
assert.notEqual(nconf.get(), original);
|
|
||||||
assert.deepEqual(nconf.get(), original)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"with the memory store": {
|
|
||||||
"the clear() method": {
|
|
||||||
"should respond with the true": function () {
|
|
||||||
assert.equal(nconf.get('foo:bar:bazz'), 'buzz');
|
|
||||||
assert.isTrue(nconf.clear('foo:bar:bazz'));
|
|
||||||
assert.isTrue(typeof nconf.get('foo:bar:bazz') === 'undefined');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the load() method": {
|
|
||||||
"without a callback": {
|
|
||||||
"should respond with the merged store": function () {
|
|
||||||
assert.deepEqual(nconf.load(), {
|
|
||||||
title: 'My specific title',
|
|
||||||
color: 'green',
|
|
||||||
movie: 'Kill Bill'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a callback": {
|
|
||||||
topic: function () {
|
|
||||||
nconf.load(this.callback.bind(null, null));
|
|
||||||
},
|
|
||||||
"should respond with the merged store": function (ign, err, store) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(store, {
|
|
||||||
title: 'My specific title',
|
|
||||||
color: 'green',
|
|
||||||
movie: 'Kill Bill'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
108
test/nconf.test.js
Normal file
108
test/nconf.test.js
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
* file-store-test.js: Tests for the nconf File store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
|
||||||
|
describe('nconf, When using the nconf', () => {
|
||||||
|
it("should have the correct methods set", () => {
|
||||||
|
expect(typeof nconf.key).toBe('function');
|
||||||
|
expect(typeof nconf.path).toBe('function');
|
||||||
|
expect(typeof nconf.use).toBe('function');
|
||||||
|
expect(typeof nconf.any).toBe('function');
|
||||||
|
expect(typeof nconf.get).toBe('function');
|
||||||
|
expect(typeof nconf.set).toBe('function');
|
||||||
|
expect(typeof nconf.clear).toBe('function');
|
||||||
|
expect(typeof nconf.load).toBe('function');
|
||||||
|
expect(typeof nconf.save).toBe('function');
|
||||||
|
expect(typeof nconf.reset).toBe('function');
|
||||||
|
expect(typeof nconf.required).toBe('function');
|
||||||
|
});
|
||||||
|
it("the use() method should instaniate the correct store", () => {
|
||||||
|
nconf.use('memory');
|
||||||
|
nconf.load();
|
||||||
|
expect(nconf.stores['memory'] instanceof nconf.Memory).toBe(true);
|
||||||
|
});
|
||||||
|
it("nconf should have the correct version set", done => {
|
||||||
|
fs.readFile(path.join(__dirname, '..', 'package.json'), (err, data) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
data = JSON.parse(data.toString());
|
||||||
|
expect(nconf.version).toEqual(data.version);
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
describe("the required() method", () => {
|
||||||
|
it("should throw error with missing keys", () => {
|
||||||
|
nconf.set('foo:bar:bazz', 'buzz');
|
||||||
|
expect(nconf.required.bind(nconf, ['missing', 'foo:bar:bazz'])).toThrow(Error);
|
||||||
|
});
|
||||||
|
it("should return the provider if all required keys exist", () => {
|
||||||
|
var Provider = nconf.Provider;
|
||||||
|
nconf.set('foo:bar:bazz', 'buzz');
|
||||||
|
expect(nconf.required(['foo:bar:bazz']) instanceof Provider).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("with the memory store", () => {
|
||||||
|
describe("the set() method", () => {
|
||||||
|
it("should respond with true", () => {
|
||||||
|
expect(nconf.set('foo:bar:bazz', 'buzz')).toBeTruthy();
|
||||||
|
});
|
||||||
|
it("should respond allow access to the root and complain about non-objects", () => {
|
||||||
|
expect(nconf.set(null, null)).toBeFalsy();
|
||||||
|
expect(nconf.set(null, undefined)).toBeFalsy();
|
||||||
|
expect(nconf.set(null)).toBeFalsy();
|
||||||
|
expect(nconf.set(null, '')).toBeFalsy();
|
||||||
|
expect(nconf.set(null, 1)).toBeFalsy();
|
||||||
|
var original = nconf.get();
|
||||||
|
expect(nconf.set(null, nconf.get())).toBeTruthy();
|
||||||
|
expect(nconf.get()).not.toBe(original);
|
||||||
|
expect(nconf.get()).toEqual(original)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
describe("the get() method", () => {
|
||||||
|
it("should respond with the correct value without a callback", () => {
|
||||||
|
expect(nconf.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
})
|
||||||
|
it("should not step inside strings without a callback", () => {
|
||||||
|
expect(nconf.get('foo:bar:bazz:0')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
it("should respond with the correct value with a callback", done => {
|
||||||
|
|
||||||
|
nconf.get('foo:bar:bazz', (err, value) => {
|
||||||
|
expect(value).toEqual('buzz');
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it("should respond allow access to the root", () => {
|
||||||
|
expect(nconf.get(null)).toBeTruthy();
|
||||||
|
expect(nconf.get(undefined)).toBeTruthy();
|
||||||
|
expect(nconf.get()).toBeTruthy();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
describe("the clear() method", () => {
|
||||||
|
it("should respond with the true", () => {
|
||||||
|
expect(nconf.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
expect(nconf.clear('foo:bar:bazz')).toBeTruthy();
|
||||||
|
expect(typeof nconf.get('foo:bar:bazz') === 'undefined').toBeTruthy();
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe("the load() method", () => {
|
||||||
|
|
||||||
|
it("should respond with the merged store without a callback", () => {
|
||||||
|
expect(nconf.load()).toEqual({"foo": {"bar": {}}});
|
||||||
|
});
|
||||||
|
it("should respond with the merged store", done => {
|
||||||
|
nconf.load((err, store) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(store).toEqual({"foo": {"bar": {}}});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* provider-save-test.js: Ensures consistency for Provider `save` operations.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var assert = require('assert'),
|
|
||||||
vows = require('vows'),
|
|
||||||
nconf = require('../lib/nconf');
|
|
||||||
|
|
||||||
//
|
|
||||||
// Expose `nconf.Mock`
|
|
||||||
//
|
|
||||||
require('./mocks/mock-store');
|
|
||||||
|
|
||||||
vows.describe('nconf/provider/save').addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"with a Mock store": {
|
|
||||||
topic: function () {
|
|
||||||
return nconf.use('mock');
|
|
||||||
},
|
|
||||||
"the save() method": {
|
|
||||||
topic: function () {
|
|
||||||
var mock = nconf.stores.mock,
|
|
||||||
that = this;
|
|
||||||
|
|
||||||
mock.on('save', function () { that.saved = true });
|
|
||||||
nconf.save(this.callback);
|
|
||||||
},
|
|
||||||
"should actually save before responding": function () {
|
|
||||||
assert.isTrue(this.saved);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
31
test/provider-save.test.js
Normal file
31
test/provider-save.test.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* provider-save-test.js: Ensures consistency for Provider `save` operations.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
|
||||||
|
//
|
||||||
|
// Expose `nconf.Mock`
|
||||||
|
//
|
||||||
|
require('./mocks/mock-store');
|
||||||
|
|
||||||
|
describe('nconf/provider/save', () => {
|
||||||
|
describe("When using nconf an instance of 'nconf.Provider' with a Mock store", () => {
|
||||||
|
var nconfMock = nconf.use('mock');
|
||||||
|
it("the save() method should actually save before responding", done => {
|
||||||
|
var mock = nconf.stores.mock;
|
||||||
|
|
||||||
|
mock.on('save', function () {
|
||||||
|
nconfMock.saved = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
nconf.save(() => {
|
||||||
|
expect(nconfMock.saved).toBeTruthy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
|
@ -1,273 +0,0 @@
|
||||||
/*
|
|
||||||
* provider-test.js: Tests for the nconf Provider object.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var assert = require('assert'),
|
|
||||||
fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
vows = require('vows'),
|
|
||||||
helpers = require('./helpers'),
|
|
||||||
nconf = require('../lib/nconf');
|
|
||||||
|
|
||||||
var fixturesDir = path.join(__dirname, 'fixtures'),
|
|
||||||
mergeFixtures = path.join(fixturesDir, 'merge'),
|
|
||||||
files = [path.join(mergeFixtures, 'file1.json'), path.join(mergeFixtures, 'file2.json')],
|
|
||||||
override = JSON.parse(fs.readFileSync(files[0]), 'utf8');
|
|
||||||
|
|
||||||
function assertProvider(test) {
|
|
||||||
return {
|
|
||||||
topic: new nconf.Provider(),
|
|
||||||
"should use the correct File store": test
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
vows.describe('nconf/provider').addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"calling the use() method with the same store type and different options": {
|
|
||||||
topic: new nconf.Provider().use('file', { file: files[0] }),
|
|
||||||
"should use a new instance of the store type": function (provider) {
|
|
||||||
var old = provider.stores['file'];
|
|
||||||
|
|
||||||
assert.equal(provider.stores.file.file, files[0]);
|
|
||||||
provider.use('file', { file: files[1] });
|
|
||||||
|
|
||||||
assert.notStrictEqual(old, provider.stores.file);
|
|
||||||
assert.equal(provider.stores.file.file, files[1]);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"when 'argv' is true": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'provider-argv.js'),
|
|
||||||
argv: ['--something', 'foobar']
|
|
||||||
}),
|
|
||||||
"when 'env' is true": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'provider-env.js'),
|
|
||||||
env: { SOMETHING: 'foobar' }
|
|
||||||
}),
|
|
||||||
"when 'env' is true and 'parseValues' option is true": {
|
|
||||||
topic: function() {
|
|
||||||
var env = {
|
|
||||||
SOMETHING: 'foobar',
|
|
||||||
SOMEBOOL: 'true',
|
|
||||||
SOMENULL: 'null',
|
|
||||||
SOMEUNDEF: 'undefined',
|
|
||||||
SOMEINT: '3600',
|
|
||||||
SOMEFLOAT: '0.5',
|
|
||||||
SOMEBAD: '5.1a'
|
|
||||||
};
|
|
||||||
var oenv = {};
|
|
||||||
Object.keys(env).forEach(function (key) {
|
|
||||||
if (process.env[key]) oenv[key] = process.env[key];
|
|
||||||
process.env[key] = env[key];
|
|
||||||
});
|
|
||||||
var provider = new nconf.Provider().use('env', {parseValues: true});
|
|
||||||
Object.keys(env).forEach(function (key) {
|
|
||||||
delete process.env[key];
|
|
||||||
if (oenv[key]) process.env[key] = oenv[key];
|
|
||||||
});
|
|
||||||
return provider;
|
|
||||||
},
|
|
||||||
"should respond with parsed values": function (provider) {
|
|
||||||
|
|
||||||
assert.equal(provider.get('SOMETHING'), 'foobar');
|
|
||||||
assert.strictEqual(provider.get('SOMEBOOL'), true);
|
|
||||||
assert.notEqual(provider.get('SOMEBOOL'), 'true');
|
|
||||||
assert.strictEqual(provider.get('SOMENULL'), null);
|
|
||||||
assert.strictEqual(provider.get('SOMEUNDEF'), undefined);
|
|
||||||
assert.strictEqual(provider.get('SOMEINT'), 3600);
|
|
||||||
assert.strictEqual(provider.get('SOMEFLOAT'), .5);
|
|
||||||
assert.strictEqual(provider.get('SOMEBAD'), '5.1a');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the default nconf provider": {
|
|
||||||
"when 'argv' is set to true": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'nconf-argv.js'),
|
|
||||||
argv: ['--something', 'foobar'],
|
|
||||||
env: { SOMETHING: true }
|
|
||||||
}),
|
|
||||||
"when 'env' is set to true": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'nconf-env.js'),
|
|
||||||
env: { SOMETHING: 'foobar' }
|
|
||||||
}),
|
|
||||||
"when 'argv' is set to true and process.argv is modified": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'nconf-change-argv.js'),
|
|
||||||
argv: ['--something', 'badValue', 'evenWorse', 'OHNOEZ', 'foobar']
|
|
||||||
}),
|
|
||||||
"when hierarchical 'argv' get": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'nconf-hierarchical-file-argv.js'),
|
|
||||||
argv: ['--something', 'foobar'],
|
|
||||||
env: { SOMETHING: true }
|
|
||||||
}),
|
|
||||||
"when 'env' is set to true with a nested separator": helpers.assertSystemConf({
|
|
||||||
script: path.join(fixturesDir, 'scripts', 'nconf-nested-env.js'),
|
|
||||||
env: { SOME_THING: 'foobar' }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"the merge() method": {
|
|
||||||
topic: new nconf.Provider().use('file', { file: files[1] }),
|
|
||||||
"should have the result merged in": function (provider) {
|
|
||||||
provider.load();
|
|
||||||
provider.merge(override);
|
|
||||||
helpers.assertMerged(null, provider.stores.file.store);
|
|
||||||
assert.equal(provider.stores.file.store.candy.something, 'file1');
|
|
||||||
},
|
|
||||||
"should merge Objects over null": function (provider) {
|
|
||||||
provider.load();
|
|
||||||
provider.merge(override);
|
|
||||||
assert.equal(provider.stores.file.store.unicorn.exists, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"the load() method": {
|
|
||||||
"when sources are passed in": {
|
|
||||||
topic: new nconf.Provider({
|
|
||||||
sources: {
|
|
||||||
user: {
|
|
||||||
type: 'file',
|
|
||||||
file: files[0]
|
|
||||||
},
|
|
||||||
global: {
|
|
||||||
type: 'file',
|
|
||||||
file: files[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
"should respect the hierarchy ": function (provider) {
|
|
||||||
var merged = provider.load();
|
|
||||||
|
|
||||||
helpers.assertMerged(null, merged);
|
|
||||||
assert.equal(merged.candy.something, 'file1');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"when multiple stores are used": {
|
|
||||||
topic: new nconf.Provider().overrides({foo: {bar: 'baz'}})
|
|
||||||
.add('file1', {type: 'file', file: files[0]})
|
|
||||||
.add('file2', {type: 'file', file: files[1]}),
|
|
||||||
"should respect the hierarchy": function(provider) {
|
|
||||||
var merged = provider.load();
|
|
||||||
|
|
||||||
helpers.assertMerged(null, merged);
|
|
||||||
assert.equal(merged.foo.bar, 'baz');
|
|
||||||
assert.equal(merged.candy.something, 'file1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"the .file() method": {
|
|
||||||
"with a single filepath": assertProvider(function (provider) {
|
|
||||||
provider.file(helpers.fixture('store.json'));
|
|
||||||
assert.isObject(provider.stores.file);
|
|
||||||
}),
|
|
||||||
"with a name and a filepath": assertProvider(function (provider) {
|
|
||||||
provider.file('custom', helpers.fixture('store.json'));
|
|
||||||
assert.isObject(provider.stores.custom);
|
|
||||||
}),
|
|
||||||
"with a single object": assertProvider(function (provider) {
|
|
||||||
provider.file({
|
|
||||||
dir: helpers.fixture(''),
|
|
||||||
file: 'store.json',
|
|
||||||
search: true
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.isObject(provider.stores.file);
|
|
||||||
assert.equal(provider.stores.file.file, helpers.fixture('store.json'));
|
|
||||||
}),
|
|
||||||
"with a name and an object": assertProvider(function (provider) {
|
|
||||||
provider.file('custom', {
|
|
||||||
dir: helpers.fixture(''),
|
|
||||||
file: 'store.json',
|
|
||||||
search: true
|
|
||||||
});
|
|
||||||
|
|
||||||
assert.isObject(provider.stores.custom);
|
|
||||||
assert.equal(provider.stores.custom.file, helpers.fixture('store.json'));
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using nconf": {
|
|
||||||
"an instance of 'nconf.Provider'": {
|
|
||||||
"the any() method": {
|
|
||||||
topic: new nconf.Provider({
|
|
||||||
type: 'literal',
|
|
||||||
store: {
|
|
||||||
key: "getThisValue"
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
"without a callback": {
|
|
||||||
"given an array of keys with one matching": {
|
|
||||||
"should respond with the correct value": function (provider) {
|
|
||||||
assert.equal(provider.any(["notthis", "orthis", "key"]), 'getThisValue');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given an array of keys with no match": {
|
|
||||||
"should respond with null": function (provider) {
|
|
||||||
assert.isNull(provider.any(["notthis", "orthis"]));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given a variable argument list of keys with one matching": {
|
|
||||||
"should respond with the correct value": function (provider) {
|
|
||||||
assert.equal(provider.any("notthis", "orthis", "key"), 'getThisValue');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given no arguments": {
|
|
||||||
"should respond with null": function (provider) {
|
|
||||||
assert.isNull(provider.any());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a callback": {
|
|
||||||
"given an array of keys with one matching": {
|
|
||||||
topic: function(provider) {
|
|
||||||
provider.any(["notthis", "orthis", "key"], this.callback);
|
|
||||||
},
|
|
||||||
"should respond with the correct value": function (err, value) {
|
|
||||||
assert.equal(value, 'getThisValue');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given an array of keys with no match": {
|
|
||||||
topic: function(provider) {
|
|
||||||
provider.any(["notthis", "orthis"], this.callback);
|
|
||||||
},
|
|
||||||
"should respond with an undefined value": function (err, value) {
|
|
||||||
assert.isUndefined(value);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given a variable argument list of keys with one matching": {
|
|
||||||
topic: function(provider) {
|
|
||||||
provider.any("notthis", "orthis", "key", this.callback);
|
|
||||||
},
|
|
||||||
"should respond with the correct value": function (err, value) {
|
|
||||||
assert.equal(value, 'getThisValue');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"given no keys": {
|
|
||||||
topic: function(provider) {
|
|
||||||
provider.any(this.callback);
|
|
||||||
},
|
|
||||||
"should respond with an undefined value": function (err, value) {
|
|
||||||
assert.isUndefined(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
233
test/provider.test.js
Normal file
233
test/provider.test.js
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
/*
|
||||||
|
* provider-test.js: Tests for the nconf Provider object.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var helpers = require('./helpers');
|
||||||
|
var nconf = require('../lib/nconf');
|
||||||
|
|
||||||
|
var fixturesDir = path.join(__dirname, 'fixtures');
|
||||||
|
var mergeFixtures = path.join(fixturesDir, 'merge');
|
||||||
|
var files = [path.join(mergeFixtures, 'file1.json'), path.join(mergeFixtures, 'file2.json')];
|
||||||
|
var override = JSON.parse(fs.readFileSync(files[0]), 'utf8');
|
||||||
|
|
||||||
|
describe('nconf/provider When using nconf', () => {
|
||||||
|
describe("an instance of 'nconf.Provider'", () => {
|
||||||
|
it("calling the use() method with the same store type and different options"
|
||||||
|
+ " should use a new instance of the store type", () => {
|
||||||
|
var provider = new nconf.Provider().use('file', {file: files[0]});
|
||||||
|
var old = provider.stores['file'];
|
||||||
|
|
||||||
|
expect(provider.stores.file.file).toEqual(files[0]);
|
||||||
|
provider.use('file', {file: files[1]});
|
||||||
|
|
||||||
|
expect(old).not.toEqual(provider.stores.file);
|
||||||
|
expect(provider.stores.file.file).toEqual(files[1]);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
it("respond with correct arg when 'argv' is true",
|
||||||
|
helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'provider-argv.js'),
|
||||||
|
argv: ['--something', 'foobar']
|
||||||
|
}));
|
||||||
|
it("respond with correct arg when 'env' is true", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'provider-env.js'),
|
||||||
|
env: {SOMETHING: 'foobar'}
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("respond with correct arg when 'env' is true and 'parseValues' option is true", () => {
|
||||||
|
var env = {
|
||||||
|
SOMETHING: 'foobar',
|
||||||
|
SOMEBOOL: 'true',
|
||||||
|
SOMENULL: 'null',
|
||||||
|
SOMEUNDEF: 'undefined',
|
||||||
|
SOMEINT: '3600',
|
||||||
|
SOMEFLOAT: '0.5',
|
||||||
|
SOMEBAD: '5.1a'
|
||||||
|
};
|
||||||
|
var oenv = {};
|
||||||
|
Object.keys(env).forEach(function (key) {
|
||||||
|
if (process.env[key]) oenv[key] = process.env[key];
|
||||||
|
process.env[key] = env[key];
|
||||||
|
});
|
||||||
|
var provider = new nconf.Provider().use('env', {parseValues: true});
|
||||||
|
Object.keys(env).forEach(function (key) {
|
||||||
|
delete process.env[key];
|
||||||
|
if (oenv[key]) process.env[key] = oenv[key];
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(provider.get('SOMETHING')).toEqual('foobar');
|
||||||
|
expect(provider.get('SOMEBOOL')).toEqual(true);
|
||||||
|
expect(provider.get('SOMEBOOL')).not.toEqual('true');
|
||||||
|
expect(provider.get('SOMENULL')).toEqual(null);
|
||||||
|
expect(provider.get('SOMEUNDEF')).toEqual(undefined);
|
||||||
|
expect(provider.get('SOMEINT')).toEqual(3600);
|
||||||
|
expect(provider.get('SOMEFLOAT')).toEqual(.5);
|
||||||
|
expect(provider.get('SOMEBAD')).toEqual('5.1a');
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the default nconf provider", () => {
|
||||||
|
|
||||||
|
it("respond with correct arg when 'argv' is set to true", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'nconf-argv.js'),
|
||||||
|
argv: ['--something', 'foobar'],
|
||||||
|
env: {SOMETHING: true}
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("respond with correct arg when 'env' is set to true", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'nconf-env.js'),
|
||||||
|
env: {SOMETHING: 'foobar'}
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("respond with correct arg when 'argv' is set to true and process.argv is modified", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'nconf-change-argv.js'),
|
||||||
|
argv: ['--something', 'badValue', 'evenWorse', 'OHNOEZ', 'foobar']
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("respond with correct arg when hierarchical 'argv' get", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'nconf-hierarchical-file-argv.js'),
|
||||||
|
argv: ['--something', 'foobar'],
|
||||||
|
env: {SOMETHING: true}
|
||||||
|
}));
|
||||||
|
|
||||||
|
it("respond with correct arg when 'env' is set to true with a nested separator", helpers.assertSystemConf({
|
||||||
|
script: path.join(fixturesDir, 'scripts', 'nconf-nested-env.js'),
|
||||||
|
env: {SOME_THING: 'foobar'}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("an instance of 'nconf.Provider'", () => {
|
||||||
|
describe("the merge() method", () => {
|
||||||
|
it("should have the result merged in", () => {
|
||||||
|
var provider = new nconf.Provider().use('file', {file: files[1]});
|
||||||
|
provider.load();
|
||||||
|
provider.merge(override);
|
||||||
|
helpers.assertMerged(null, provider.stores.file.store);
|
||||||
|
expect(provider.stores.file.store.candy.something).toEqual('file1');
|
||||||
|
});
|
||||||
|
it("should merge Objects over null", () => {
|
||||||
|
var provider = new nconf.Provider().use('file', {file: files[1]});
|
||||||
|
provider.load();
|
||||||
|
provider.merge(override);
|
||||||
|
expect(provider.stores.file.store.unicorn.exists).toEqual(true);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
describe("the load() method", () => {
|
||||||
|
it("should respect the hierarchy when sources are passed in", () => {
|
||||||
|
var provider = new nconf.Provider({
|
||||||
|
sources: {
|
||||||
|
user: {
|
||||||
|
type: 'file',
|
||||||
|
file: files[0]
|
||||||
|
},
|
||||||
|
global: {
|
||||||
|
type: 'file',
|
||||||
|
file: files[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var merged = provider.load();
|
||||||
|
helpers.assertMerged(null, merged);
|
||||||
|
expect(merged.candy.something).toEqual('file1');
|
||||||
|
})
|
||||||
|
it("should respect the hierarchy when multiple stores are used", () => {
|
||||||
|
var provider = new nconf.Provider().overrides({foo: {bar: 'baz'}})
|
||||||
|
.add('file1', {type: 'file', file: files[0]})
|
||||||
|
.add('file2', {type: 'file', file: files[1]});
|
||||||
|
|
||||||
|
var merged = provider.load();
|
||||||
|
|
||||||
|
helpers.assertMerged(null, merged);
|
||||||
|
expect(merged.foo.bar).toEqual('baz');
|
||||||
|
expect(merged.candy.something).toEqual('file1');
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
describe("the .file() method", () => {
|
||||||
|
it("should use the correct File store with a single filepath", () => {
|
||||||
|
var provider = new nconf.Provider();
|
||||||
|
provider.file(helpers.fixture('store.json'));
|
||||||
|
expect(typeof provider.stores.file).toBe('object');
|
||||||
|
});
|
||||||
|
it("should use the correct File store with a name and a filepath", () => {
|
||||||
|
var provider = new nconf.Provider();
|
||||||
|
provider.file('custom', helpers.fixture('store.json'));
|
||||||
|
expect(typeof provider.stores.custom).toBe('object');
|
||||||
|
});
|
||||||
|
it("should use the correct File store with a single object", () => {
|
||||||
|
var provider = new nconf.Provider();
|
||||||
|
provider.file({
|
||||||
|
dir: helpers.fixture(''),
|
||||||
|
file: 'store.json',
|
||||||
|
search: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(typeof provider.stores.file).toBe('object');
|
||||||
|
expect(provider.stores.file.file).toEqual(helpers.fixture('store.json'));
|
||||||
|
});
|
||||||
|
it("should use the correct File store with a name and an object", () => {
|
||||||
|
var provider = new nconf.Provider();
|
||||||
|
provider.file('custom', {
|
||||||
|
dir: helpers.fixture(''),
|
||||||
|
file: 'store.json',
|
||||||
|
search: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(typeof provider.stores.custom).toBe('object');
|
||||||
|
expect(provider.stores.custom.file).toEqual(helpers.fixture('store.json'));
|
||||||
|
})
|
||||||
|
describe("the any() method", () => {
|
||||||
|
var provider = new nconf.Provider({
|
||||||
|
type: 'literal',
|
||||||
|
store: {
|
||||||
|
key: "getThisValue"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
describe("without a callback", () => {
|
||||||
|
it("should respond with the correct value given an array of keys with one matching", () => {
|
||||||
|
expect(provider.any(["notthis", "orthis", "key"])).toEqual('getThisValue');
|
||||||
|
})
|
||||||
|
it("should respond with null given an array of keys with no match", () => {
|
||||||
|
expect(provider.any(["notthis", "orthis"])).toBe(null);
|
||||||
|
});
|
||||||
|
it("should respond with the correct value given a variable argument list of keys with one matching", () => {
|
||||||
|
expect(provider.any("notthis", "orthis", "key")).toEqual('getThisValue');
|
||||||
|
});
|
||||||
|
it("should respond with null given no arguments", () => {
|
||||||
|
expect(provider.any()).toBe(null);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
describe("with a callback", () => {
|
||||||
|
it("should respond with the correct value given an array of keys with one matching", done => {
|
||||||
|
provider.any(["notthis", "orthis", "key"], (err, value) => {
|
||||||
|
expect(value).toEqual('getThisValue');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("should respond with an undefined value given an array of keys with no match", done => {
|
||||||
|
provider.any(["notthis", "orthis"], (err, value) => {
|
||||||
|
expect(value).toBe(undefined)
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("should respond with the correct value given a variable argument list of keys with one matching", done => {
|
||||||
|
provider.any("notthis", "orthis", "key", (err, value) => {
|
||||||
|
expect(value).toEqual('getThisValue');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should respond with an undefined value given no keys", done => {
|
||||||
|
provider.any((err, value) => {
|
||||||
|
expect(value).toBe(undefined)
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* argv-test.js: Tests for the nconf argv store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
yargs = require('yargs')
|
|
||||||
nconf = require('../../lib/nconf');
|
|
||||||
|
|
||||||
vows.describe('nconf/stores/argv').addBatch({
|
|
||||||
"An instance of nconf.Argv": {
|
|
||||||
topic: new nconf.Argv(),
|
|
||||||
"should have the correct methods defined": function (argv) {
|
|
||||||
assert.isFunction(argv.loadSync);
|
|
||||||
assert.isFunction(argv.loadArgv);
|
|
||||||
assert.deepEqual(argv.options, {});
|
|
||||||
},
|
|
||||||
"can be created with a custom yargs":{
|
|
||||||
topic: function(){
|
|
||||||
var yargsInstance = yargs.alias('v', 'verbose').default('v', 'false');
|
|
||||||
return [yargsInstance, new nconf.Argv(yargsInstance)];
|
|
||||||
},
|
|
||||||
"and can give access to them": function (argv) {
|
|
||||||
var yargsInstance = argv[0];
|
|
||||||
argv = argv[1]
|
|
||||||
assert.equal(argv.options, yargsInstance)
|
|
||||||
},
|
|
||||||
"values are the one from the custom yargv": function (argv) {
|
|
||||||
argv = argv[1]
|
|
||||||
argv.loadSync()
|
|
||||||
assert.equal(argv.get('verbose'), 'false');
|
|
||||||
assert.equal(argv.get('v'), 'false');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"can be created with a nconf yargs":{
|
|
||||||
topic: function(){
|
|
||||||
var options = {verbose: {alias: 'v', default: 'false'}};
|
|
||||||
return new nconf.Argv(options);
|
|
||||||
},
|
|
||||||
"and can give access to them": function (argv) {
|
|
||||||
assert.deepEqual(argv.options, {verbose: {alias: 'v', default: 'false'}})
|
|
||||||
},
|
|
||||||
"values are the one from the custom yargv": function (argv) {
|
|
||||||
argv.loadSync()
|
|
||||||
assert.equal(argv.get('verbose'), 'false');
|
|
||||||
assert.equal(argv.get('v'), 'false');
|
|
||||||
},
|
|
||||||
"values cannot be altered with set when readOnly:true": function (argv) {
|
|
||||||
argv.set('verbose', 'true');
|
|
||||||
assert.equal(argv.get('verbose'), 'false');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"can be created with readOnly set to be false":{
|
|
||||||
topic: function(){
|
|
||||||
var options = {verbose: {alias: 'v', default: 'false'}, readOnly: false};
|
|
||||||
return new nconf.Argv(options);
|
|
||||||
},
|
|
||||||
"readOnly is actually false": function (argv) {
|
|
||||||
assert.equal(argv.readOnly, false);
|
|
||||||
},
|
|
||||||
"values can be changed by calling .set": function (argv) {
|
|
||||||
argv.loadSync()
|
|
||||||
assert.equal(argv.get('verbose'), 'false');
|
|
||||||
argv.set('verbose', 'true');
|
|
||||||
assert.equal(argv.get('verbose'), 'true');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
72
test/stores/argv.test.js
Normal file
72
test/stores/argv.test.js
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* argv-test.js: Tests for the nconf argv store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var yargs = require('yargs');
|
||||||
|
var nconf = require('../../lib/nconf');
|
||||||
|
|
||||||
|
describe('nconf/stores/argv, An instance of nconf.Argv', () => {
|
||||||
|
|
||||||
|
it("should have the correct methods defined", () => {
|
||||||
|
var argv = new nconf.Argv();
|
||||||
|
expect(typeof argv.loadSync).toBe('function');
|
||||||
|
expect(typeof argv.loadArgv).toBe('function');
|
||||||
|
expect(argv.options).toEqual({});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("can be created with a custom yargs", () => {
|
||||||
|
var yargsInstance = yargs.alias('s', 'somearg').default('s', 'false');
|
||||||
|
|
||||||
|
it("and can give access to them", () => {
|
||||||
|
var argv = new nconf.Argv(yargsInstance);
|
||||||
|
expect(argv.options).toBe(yargsInstance);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("values are the one from the custom yargv", () => {
|
||||||
|
var argv = new nconf.Argv(yargsInstance);
|
||||||
|
argv.loadSync();
|
||||||
|
expect(argv.get('somearg')).toBe('false');
|
||||||
|
expect(argv.get('s')).toBe('false');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("can be created with a nconf yargs", () => {
|
||||||
|
var options = {somearg: {alias: 's', default: 'false'}};
|
||||||
|
it("and can give access to them", () => {
|
||||||
|
var argv = new nconf.Argv(options);
|
||||||
|
expect(argv.options).toEqual({somearg: {alias: 's', default: 'false'}});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("values are the one from the custom yargv", () => {
|
||||||
|
var argv = new nconf.Argv(options);
|
||||||
|
argv.loadSync();
|
||||||
|
expect(argv.get('somearg')).toBe('false');
|
||||||
|
expect(argv.get('s')).toBe('false');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("values cannot be altered with set when readOnly:true", () => {
|
||||||
|
var argv = new nconf.Argv(options);
|
||||||
|
argv.loadSync();
|
||||||
|
argv.set('somearg', 'true');
|
||||||
|
expect(argv.get('somearg')).toBe('false');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("can be created with readOnly set to be false", () => {
|
||||||
|
|
||||||
|
it("readOnly is actually false", () => {
|
||||||
|
var argv = new nconf.Argv({readOnly: false});
|
||||||
|
expect(argv.readOnly).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("values can be changed by calling .set", () => {
|
||||||
|
var argv = new nconf.Argv({somearg: {alias: 's', default: 'false'}, readOnly: false});
|
||||||
|
argv.loadSync();
|
||||||
|
expect(argv.get('somearg')).toBe('false');
|
||||||
|
argv.set('somearg', 'true');
|
||||||
|
expect(argv.get('somearg')).toBe('true');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* env-test.js: Tests for the nconf env store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../../lib/nconf');
|
|
||||||
|
|
||||||
process.env.TES = 'TING';
|
|
||||||
|
|
||||||
vows.describe('nconf/stores/env').addBatch({
|
|
||||||
"An instance of nconf.Env": {
|
|
||||||
topic: new nconf.Env(),
|
|
||||||
"should have the correct methods defined": function (env) {
|
|
||||||
assert.isFunction(env.loadSync);
|
|
||||||
assert.isFunction(env.loadEnv);
|
|
||||||
assert.isArray(env.whitelist);
|
|
||||||
assert.lengthOf(env.whitelist, 0);
|
|
||||||
assert.equal(env.separator, '');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"An instance of nconf.Env with readOnly option set to false": {
|
|
||||||
topic: new nconf.Env({readOnly: false}),
|
|
||||||
"should have it's readOnly property set to false": function (env) {
|
|
||||||
assert.isFunction(env.loadSync);
|
|
||||||
assert.isFunction(env.loadEnv);
|
|
||||||
assert.isArray(env.whitelist);
|
|
||||||
assert.lengthOf(env.whitelist, 0);
|
|
||||||
assert.ok(!env.readOnly);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
28
test/stores/env.test.js
Normal file
28
test/stores/env.test.js
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* env-test.js: Tests for the nconf env store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var nconf = require('../../lib/nconf');
|
||||||
|
|
||||||
|
describe('nconf/stores/env, An instance of nconf.Env', () => {
|
||||||
|
it("should have the correct methods defined", () => {
|
||||||
|
var env = new nconf.Env();
|
||||||
|
expect(typeof env.loadSync).toBe('function');
|
||||||
|
expect(typeof env.loadEnv).toBe('function');
|
||||||
|
expect(env.whitelist instanceof Array).toBeTruthy();
|
||||||
|
expect(env.whitelist.length).toEqual(0);
|
||||||
|
expect(env.separator).toEqual('');
|
||||||
|
});
|
||||||
|
it("should have the correct methods defined and with readOnly false", () => {
|
||||||
|
var env = new nconf.Env({readOnly: false});
|
||||||
|
expect(typeof env.loadSync).toBe('function');
|
||||||
|
expect(typeof env.loadEnv).toBe('function');
|
||||||
|
expect(env.whitelist instanceof Array).toBeTruthy();
|
||||||
|
expect(env.whitelist.length).toEqual(0);
|
||||||
|
expect(env.separator).toEqual('');
|
||||||
|
expect(env.readOnly).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,310 +0,0 @@
|
||||||
/*
|
|
||||||
* file-store-test.js: Tests for the nconf File store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var fs = require('fs'),
|
|
||||||
path = require('path'),
|
|
||||||
vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../../lib/nconf'),
|
|
||||||
yamlFormat = require('nconf-yaml'),
|
|
||||||
data = require('../fixtures/data').data,
|
|
||||||
store;
|
|
||||||
|
|
||||||
vows.describe('nconf/stores/file').addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
"with a valid JSON file": {
|
|
||||||
topic: function () {
|
|
||||||
var filePath = path.join(__dirname, '..', 'fixtures', 'store.json');
|
|
||||||
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
||||||
this.store = store = new nconf.File({ file: filePath });
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
"the load() method": {
|
|
||||||
topic: function () {
|
|
||||||
this.store.load(this.callback);
|
|
||||||
},
|
|
||||||
"should load the data correctly": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(data, this.store.store);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a malformed JSON file": {
|
|
||||||
topic: function () {
|
|
||||||
var filePath = path.join(__dirname, '..', 'fixtures', 'malformed.json');
|
|
||||||
this.store = new nconf.File({ file: filePath });
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
"the load() method with a malformed JSON config file": {
|
|
||||||
topic: function () {
|
|
||||||
this.store.load(this.callback.bind(null, null));
|
|
||||||
},
|
|
||||||
"should respond with an error and indicate file name": function (_, err) {
|
|
||||||
assert.isTrue(!!err);
|
|
||||||
assert.match(err, /malformed\.json/);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a valid UTF8 JSON file that contains a BOM": {
|
|
||||||
topic: function () {
|
|
||||||
var filePath = path.join(__dirname, '..', 'fixtures', 'bom.json');
|
|
||||||
this.store = store = new nconf.File({ file: filePath });
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
"the load() method": {
|
|
||||||
topic: function () {
|
|
||||||
this.store.load(this.callback);
|
|
||||||
},
|
|
||||||
"should load the data correctly": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(data, this.store.store);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the loadSync() method": {
|
|
||||||
topic: function () {
|
|
||||||
var data = this.store.loadSync();
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
"should load the data correctly": function (result) {
|
|
||||||
assert.deepEqual(result, this.store.store);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"with a valid UTF8 JSON file that contains no BOM": {
|
|
||||||
topic: function () {
|
|
||||||
var filePath = path.join(__dirname, '..', 'fixtures', 'no-bom.json');
|
|
||||||
this.store = store = new nconf.File({ file: filePath });
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
"the load() method": {
|
|
||||||
topic: function () {
|
|
||||||
this.store.load(this.callback);
|
|
||||||
},
|
|
||||||
"should load the data correctly": function (err, data) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(data, this.store.store);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the loadSync() method": {
|
|
||||||
topic: function () {
|
|
||||||
var data = this.store.loadSync();
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
"should load the data correctly": function (result) {
|
|
||||||
assert.deepEqual(result, this.store.store);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
topic: function () {
|
|
||||||
var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'),
|
|
||||||
tmpStore = new nconf.File({ file: tmpPath });
|
|
||||||
return tmpStore;
|
|
||||||
},
|
|
||||||
"the save() method": {
|
|
||||||
topic: function (tmpStore) {
|
|
||||||
var that = this;
|
|
||||||
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
tmpStore.set(key, data[key]);
|
|
||||||
});
|
|
||||||
|
|
||||||
tmpStore.save(function () {
|
|
||||||
fs.readFile(tmpStore.file, function (err, d) {
|
|
||||||
fs.unlinkSync(tmpStore.file);
|
|
||||||
|
|
||||||
return err
|
|
||||||
? that.callback(err)
|
|
||||||
: that.callback(err, JSON.parse(d.toString()));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should save the data correctly": function (err, read) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(read, data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the saveToFile() method": {
|
|
||||||
topic: function (tmpStore) {
|
|
||||||
var that = this,
|
|
||||||
pathFile = '/tmp/nconf-save-toFile.json';
|
|
||||||
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
tmpStore.set(key, data[key]);
|
|
||||||
});
|
|
||||||
|
|
||||||
tmpStore.saveToFile(pathFile, function () {
|
|
||||||
fs.readFile(pathFile, function (err, d) {
|
|
||||||
fs.unlinkSync(pathFile);
|
|
||||||
|
|
||||||
return err
|
|
||||||
? that.callback(err)
|
|
||||||
: that.callback(err, JSON.parse(d.toString()));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should save the data correctly": function (err, read) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(read, data);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the saveToFile() method with custom format": {
|
|
||||||
topic: function (tmpStore) {
|
|
||||||
var that = this,
|
|
||||||
pathFile = '/tmp/nconf-save-toFile.yaml';
|
|
||||||
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
tmpStore.set(key, data[key]);
|
|
||||||
});
|
|
||||||
|
|
||||||
tmpStore.saveToFile(pathFile, yamlFormat, function () {
|
|
||||||
fs.readFile(pathFile, function (err, d) {
|
|
||||||
fs.unlinkSync(pathFile);
|
|
||||||
return err
|
|
||||||
? that.callback(err)
|
|
||||||
: that.callback(err, yamlFormat.parse(d.toString()));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should save the data correctly": function (err, read) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(read, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
topic: function () {
|
|
||||||
var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json'),
|
|
||||||
tmpStore = new nconf.File({ file: tmpPath });
|
|
||||||
return tmpStore;
|
|
||||||
},
|
|
||||||
"the saveSync() method": {
|
|
||||||
topic: function (tmpStore) {
|
|
||||||
var that = this;
|
|
||||||
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
tmpStore.set(key, data[key]);
|
|
||||||
});
|
|
||||||
|
|
||||||
var saved = tmpStore.saveSync();
|
|
||||||
|
|
||||||
fs.readFile(tmpStore.file, function (err, d) {
|
|
||||||
fs.unlinkSync(tmpStore.file);
|
|
||||||
|
|
||||||
return err
|
|
||||||
? that.callback(err)
|
|
||||||
: that.callback(err, JSON.parse(d.toString()), saved);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"should save the data correctly": function (err, read, saved) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(read, data);
|
|
||||||
assert.deepEqual(read, saved);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
"the set() method": {
|
|
||||||
"should respond with true": function () {
|
|
||||||
assert.isTrue(store.set('foo:bar:bazz', 'buzz'));
|
|
||||||
assert.isTrue(store.set('falsy:number', 0));
|
|
||||||
assert.isTrue(store.set('falsy:string', ''));
|
|
||||||
assert.isTrue(store.set('falsy:boolean', false));
|
|
||||||
assert.isTrue(store.set('falsy:object', null));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the get() method": {
|
|
||||||
"should respond with the correct value": function () {
|
|
||||||
assert.equal(store.get('foo:bar:bazz'), 'buzz');
|
|
||||||
assert.equal(store.get('falsy:number'), 0);
|
|
||||||
assert.equal(store.get('falsy:string'), '');
|
|
||||||
assert.equal(store.get('falsy:boolean'), false);
|
|
||||||
assert.equal(store.get('falsy:object'), null);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the clear() method": {
|
|
||||||
"should respond with the true": function () {
|
|
||||||
assert.equal(store.get('foo:bar:bazz'), 'buzz');
|
|
||||||
assert.isTrue(store.clear('foo:bar:bazz'));
|
|
||||||
assert.isTrue(typeof store.get('foo:bar:bazz') === 'undefined');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
"the search() method": {
|
|
||||||
"when the target file exists higher in the directory tree": {
|
|
||||||
topic: function () {
|
|
||||||
var searchBase = this.searchBase = process.env.HOME;
|
|
||||||
var filePath = this.filePath = path.join(searchBase, '.nconf');
|
|
||||||
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
||||||
return new (nconf.File)({
|
|
||||||
file: '.nconf'
|
|
||||||
})
|
|
||||||
},
|
|
||||||
"should update the file appropriately": function (store) {
|
|
||||||
store.search(this.searchBase);
|
|
||||||
assert.equal(store.file, this.filePath);
|
|
||||||
fs.unlinkSync(this.filePath);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"when the target file doesn't exist higher in the directory tree": {
|
|
||||||
topic: function () {
|
|
||||||
var filePath = this.filePath = path.join(__dirname, '..', 'fixtures', 'search-store.json');
|
|
||||||
return new (nconf.File)({
|
|
||||||
dir: path.dirname(filePath),
|
|
||||||
file: 'search-store.json'
|
|
||||||
})
|
|
||||||
},
|
|
||||||
"should update the file appropriately": function (store) {
|
|
||||||
store.search();
|
|
||||||
assert.equal(store.file, this.filePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).addBatch({
|
|
||||||
"When using the nconf file store": {
|
|
||||||
topic: function () {
|
|
||||||
var secureStore = new nconf.File({
|
|
||||||
file: path.join(__dirname, '..', 'fixtures', 'secure.json'),
|
|
||||||
secure: 'super-secretzzz'
|
|
||||||
});
|
|
||||||
|
|
||||||
secureStore.store = data;
|
|
||||||
return secureStore;
|
|
||||||
},
|
|
||||||
"the stringify() method should encrypt properly": function (store) {
|
|
||||||
var contents = JSON.parse(store.stringify());
|
|
||||||
Object.keys(data).forEach(function (key) {
|
|
||||||
assert.isObject(contents[key]);
|
|
||||||
assert.isString(contents[key].value);
|
|
||||||
assert.equal(contents[key].alg, 'aes-256-ctr');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"the parse() method should decrypt properly": function (store) {
|
|
||||||
var contents = store.stringify();
|
|
||||||
var parsed = store.parse(contents);
|
|
||||||
assert.deepEqual(parsed, data);
|
|
||||||
},
|
|
||||||
"the load() method should decrypt properly": function (store) {
|
|
||||||
store.load(function (err, loaded) {
|
|
||||||
assert.isNull(err);
|
|
||||||
assert.deepEqual(loaded, data);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
"the loadSync() method should decrypt properly": function (store) {
|
|
||||||
var loaded = store.loadSync()
|
|
||||||
assert.deepEqual(loaded, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
||||||
|
|
239
test/stores/file-store.test.js
Normal file
239
test/stores/file-store.test.js
Normal file
|
@ -0,0 +1,239 @@
|
||||||
|
/*
|
||||||
|
* file-store-test.js: Tests for the nconf File store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var nconf = require('../../lib/nconf');
|
||||||
|
var yamlFormat = require('nconf-yaml');
|
||||||
|
var data = require('../fixtures/data').data;
|
||||||
|
|
||||||
|
// FIXME TO RENAME
|
||||||
|
describe('nconf/stores/file', () => {
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
describe("with a valid JSON file", () => {
|
||||||
|
var filePath = path.join(__dirname, '..', 'fixtures', 'store.json');
|
||||||
|
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
||||||
|
|
||||||
|
it("the load() method should load the data correctly", done => {
|
||||||
|
var store = new nconf.File({file: filePath});
|
||||||
|
store.load((err, data) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(data).toEqual(store.store);
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("with a malformed JSON file", () => {
|
||||||
|
var filePath = path.join(__dirname, '..', 'fixtures', 'malformed.json');
|
||||||
|
|
||||||
|
it("the load() method with a malformed JSON config file, should respond with an error and indicate file name",
|
||||||
|
done => {
|
||||||
|
var store = new nconf.File({file: filePath});
|
||||||
|
//FIXME this.store.load(this.callback.bind(null, null));
|
||||||
|
store.load((err) => {
|
||||||
|
expect(err).toBeTruthy();
|
||||||
|
expect(err.message).toMatch(/malformed\.json/);
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("with a valid UTF8 JSON file that contains a BOM", () => {
|
||||||
|
var filePath = path.join(__dirname, '..', 'fixtures', 'bom.json');
|
||||||
|
var store = new nconf.File({file: filePath});
|
||||||
|
|
||||||
|
it("the load() method should load the data correctly", done => {
|
||||||
|
store.load((err, data) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(data).toEqual(store.store);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the loadSync() method should load the data correctly", () => {
|
||||||
|
var data = store.loadSync();
|
||||||
|
expect(data).toEqual(store.store);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("with a valid UTF8 JSON file that contains no BOM", () => {
|
||||||
|
var filePath = path.join(__dirname, '..', 'fixtures', 'no-bom.json');
|
||||||
|
var store = new nconf.File({file: filePath});
|
||||||
|
|
||||||
|
it("the load() method should load the data correctly", done => {
|
||||||
|
store.load((err, data) => {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(data).toEqual(store.store);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the loadSync() method should load the data correctly", () => {
|
||||||
|
var data = store.loadSync();
|
||||||
|
expect(data).toEqual(store.store);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json');
|
||||||
|
|
||||||
|
it("the save() method should save the data correctly", done => {
|
||||||
|
var tmpStore = new nconf.File({file: tmpPath});
|
||||||
|
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
tmpStore.set(key, data[key]);
|
||||||
|
});
|
||||||
|
|
||||||
|
tmpStore.save(function () {
|
||||||
|
fs.readFile(tmpStore.file, function (err, d) {
|
||||||
|
fs.unlinkSync(tmpStore.file);
|
||||||
|
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(JSON.parse(d.toString())).toEqual(data);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the saveToFile() method should save the data correctly", done => {
|
||||||
|
var tmpStore = new nconf.File({file: tmpPath});
|
||||||
|
var pathFile = '/tmp/nconf-save-toFile.json';
|
||||||
|
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
tmpStore.set(key, data[key]);
|
||||||
|
});
|
||||||
|
|
||||||
|
tmpStore.saveToFile(pathFile, function () {
|
||||||
|
fs.readFile(pathFile, function (err, d) {
|
||||||
|
fs.unlinkSync(pathFile);
|
||||||
|
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(JSON.parse(d.toString())).toEqual(data);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
it("the saveToFile() method with custom format should save the data correctly", done => {
|
||||||
|
var tmpStore = new nconf.File({file: tmpPath});
|
||||||
|
var pathFile = '/tmp/nconf-save-toFile.yaml';
|
||||||
|
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
tmpStore.set(key, data[key]);
|
||||||
|
});
|
||||||
|
|
||||||
|
tmpStore.saveToFile(pathFile, yamlFormat, function () {
|
||||||
|
fs.readFile(pathFile, function (err, d) {
|
||||||
|
fs.unlinkSync(pathFile);
|
||||||
|
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(yamlFormat.parse(d.toString())).toEqual(data);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json');
|
||||||
|
it("the saveSync() method should save the data correctly", done => {
|
||||||
|
var tmpStore = new nconf.File({file: tmpPath});
|
||||||
|
Object.keys(data).forEach(function (key) {
|
||||||
|
tmpStore.set(key, data[key]);
|
||||||
|
});
|
||||||
|
|
||||||
|
var saved = tmpStore.saveSync();
|
||||||
|
|
||||||
|
fs.readFile(tmpStore.file, function (err, d) {
|
||||||
|
fs.unlinkSync(tmpStore.file);
|
||||||
|
|
||||||
|
expect(err).toBe(null);
|
||||||
|
var read = JSON.parse(d.toString());
|
||||||
|
expect(read).toEqual(data);
|
||||||
|
expect(read).toEqual(saved);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
var tmpPath = path.join(__dirname, '..', 'fixtures', 'tmp.json');
|
||||||
|
var store = new nconf.File({file: tmpPath});
|
||||||
|
|
||||||
|
it("the set() method should respond with true", () => {
|
||||||
|
expect(store.set('foo:bar:bazz', 'buzz')).toBeTruthy();
|
||||||
|
expect(store.set('falsy:number', 0)).toBeTruthy();
|
||||||
|
expect(store.set('falsy:string', '')).toBeTruthy();
|
||||||
|
expect(store.set('falsy:boolean', false)).toBeTruthy();
|
||||||
|
expect(store.set('falsy:object', null)).toBeTruthy();
|
||||||
|
});
|
||||||
|
it("the get() method should respond with the correct value", () => {
|
||||||
|
expect(store.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
expect(store.get('falsy:number')).toEqual(0);
|
||||||
|
expect(store.get('falsy:string')).toEqual('');
|
||||||
|
expect(store.get('falsy:boolean')).toEqual(false);
|
||||||
|
expect(store.get('falsy:object')).toEqual(null);
|
||||||
|
});
|
||||||
|
it("the clear() method should respond with the true", () => {
|
||||||
|
expect(store.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
expect(store.clear('foo:bar:bazz')).toBeTruthy();
|
||||||
|
expect(typeof store.get('foo:bar:bazz') === 'undefined').toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
|
||||||
|
it("the search() method when the target file exists higher in the directory tree should update the file appropriately", () => {
|
||||||
|
var searchBase = process.env.HOME;
|
||||||
|
var filePath = path.join(searchBase, '.nconf');
|
||||||
|
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
||||||
|
var store = new nconf.File({
|
||||||
|
file: '.nconf'
|
||||||
|
});
|
||||||
|
store.search(store.searchBase);
|
||||||
|
expect(store.file).toEqual(filePath);
|
||||||
|
fs.unlinkSync(filePath);
|
||||||
|
});
|
||||||
|
it("the search() method when the target file doesn't exist higher in the directory tree should update the file appropriately", () => {
|
||||||
|
var filePath = path.join(__dirname, '..', 'fixtures', 'search-store.json');
|
||||||
|
var store = new nconf.File({
|
||||||
|
dir: path.dirname(filePath),
|
||||||
|
file: 'search-store.json'
|
||||||
|
});
|
||||||
|
store.search();
|
||||||
|
expect(store.file).toEqual(filePath);
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
describe("When using the nconf file store", () => {
|
||||||
|
var secureStore = new nconf.File({
|
||||||
|
file: path.join(__dirname, '..', 'fixtures', 'secure.json'),
|
||||||
|
secure: 'super-secretzzz'
|
||||||
|
});
|
||||||
|
|
||||||
|
secureStore.store = data;
|
||||||
|
|
||||||
|
it("the stringify() method should encrypt properly", () => {
|
||||||
|
var contents = JSON.parse(secureStore.stringify());
|
||||||
|
Object.keys(data).forEach(key => {
|
||||||
|
expect(typeof contents[key]).toBe('object');
|
||||||
|
expect(typeof contents[key].value).toBe('string');
|
||||||
|
expect(contents[key].alg).toEqual('aes-256-ctr');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the parse() method should decrypt properly", () => {
|
||||||
|
var contents = secureStore.stringify();
|
||||||
|
var parsed = secureStore.parse(contents);
|
||||||
|
expect(parsed).toEqual(data);
|
||||||
|
});
|
||||||
|
it("the load() method should decrypt properly", () => {
|
||||||
|
secureStore.load(function (err, loaded) {
|
||||||
|
expect(err).toBe(null);
|
||||||
|
expect(loaded).toEqual(data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("the loadSync() method should decrypt properly", () => {
|
||||||
|
var loaded = secureStore.loadSync()
|
||||||
|
expect(loaded).toEqual(data);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* literal-test.js: Tests for the nconf literal store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../../lib/nconf');
|
|
||||||
|
|
||||||
vows.describe('nconf/stores/literal').addBatch({
|
|
||||||
"An instance of nconf.Literal": {
|
|
||||||
topic: new nconf.Literal({
|
|
||||||
foo: 'bar',
|
|
||||||
one: 2
|
|
||||||
}),
|
|
||||||
"should have the correct methods defined": function (literal) {
|
|
||||||
assert.equal(literal.type, 'literal');
|
|
||||||
assert.isFunction(literal.get);
|
|
||||||
assert.isFunction(literal.set);
|
|
||||||
assert.isFunction(literal.merge);
|
|
||||||
assert.isFunction(literal.loadSync);
|
|
||||||
},
|
|
||||||
"should have the correct values in the store": function (literal) {
|
|
||||||
assert.equal(literal.store.foo, 'bar');
|
|
||||||
assert.equal(literal.store.one, 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
25
test/stores/literal.test.js
Normal file
25
test/stores/literal.test.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* literal-test.js: Tests for the nconf literal store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var nconf = require('../../lib/nconf');
|
||||||
|
|
||||||
|
describe('nconf/stores/literal, An instance of nconf.Literal', () => {
|
||||||
|
var envOptions = {foo: 'bar', one: 2};
|
||||||
|
it("should have the correct methods defined", () => {
|
||||||
|
var literal = new nconf.Literal(envOptions);
|
||||||
|
expect(literal.type).toEqual('literal');
|
||||||
|
expect(typeof literal.get).toBe('function');
|
||||||
|
expect(typeof literal.set).toBe('function');
|
||||||
|
expect(typeof literal.merge).toBe('function');
|
||||||
|
expect(typeof literal.loadSync).toBe('function');
|
||||||
|
});
|
||||||
|
it("should have the correct values in the store", () => {
|
||||||
|
var literal = new nconf.Literal(envOptions);
|
||||||
|
expect(literal.store.foo).toEqual('bar');
|
||||||
|
expect(literal.store.one).toEqual(2);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,125 +0,0 @@
|
||||||
/*
|
|
||||||
* memory-store-test.js: Tests for the nconf Memory store.
|
|
||||||
*
|
|
||||||
* (C) 2011, Charlie Robbins and the Contributors.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
var vows = require('vows'),
|
|
||||||
assert = require('assert'),
|
|
||||||
nconf = require('../../lib/nconf'),
|
|
||||||
merge = require('../fixtures/data').merge;
|
|
||||||
|
|
||||||
vows.describe('nconf/stores/memory').addBatch({
|
|
||||||
"When using the nconf memory store": {
|
|
||||||
topic: new nconf.Memory(),
|
|
||||||
"the set() method": {
|
|
||||||
"should respond with true": function (store) {
|
|
||||||
assert.isTrue(store.set('foo:bar:bazz', 'buzz'));
|
|
||||||
assert.isTrue(store.set('falsy:number', 0));
|
|
||||||
assert.isTrue(store.set('falsy:string:empty', ''));
|
|
||||||
assert.isTrue(store.set('falsy:string:value', 'value'));
|
|
||||||
assert.isTrue(store.set('falsy:boolean', false));
|
|
||||||
assert.isTrue(store.set('falsy:object', null));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the get() method": {
|
|
||||||
"should respond with the correct value": function (store) {
|
|
||||||
assert.equal(store.get('foo:bar:bazz'), 'buzz');
|
|
||||||
assert.equal(store.get('falsy:number'), 0);
|
|
||||||
assert.equal(store.get('falsy:string:empty'), '');
|
|
||||||
assert.equal(store.get('falsy:string:value'), 'value');
|
|
||||||
assert.equal(store.get('falsy:boolean'), false);
|
|
||||||
assert.equal(store.get('falsy:object'), null);
|
|
||||||
},
|
|
||||||
"should not fail when retrieving non-existent keys": {
|
|
||||||
"at the root level": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('this:key:does:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
},
|
|
||||||
"within numbers": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('falsy:number:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
},
|
|
||||||
"within booleans": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('falsy:boolean:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
},
|
|
||||||
"within objects": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('falsy:object:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
},
|
|
||||||
"within empty strings": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('falsy:string:empty:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
},
|
|
||||||
"within non-empty strings": function (store) {
|
|
||||||
assert.doesNotThrow(function() {
|
|
||||||
assert.equal(store.get('falsy:string:value:not:exist'), undefined);
|
|
||||||
}, TypeError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the clear() method": {
|
|
||||||
"should respond with the true": function (store) {
|
|
||||||
assert.equal(store.get('foo:bar:bazz'), 'buzz');
|
|
||||||
assert.isTrue(store.clear('foo:bar:bazz'));
|
|
||||||
assert.isTrue(typeof store.get('foo:bar:bazz') === 'undefined');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"the merge() method": {
|
|
||||||
"when overriding an existing literal value": function (store) {
|
|
||||||
store.set('merge:literal', 'string-value');
|
|
||||||
store.merge('merge:literal', merge);
|
|
||||||
assert.deepEqual(store.get('merge:literal'), merge);
|
|
||||||
},
|
|
||||||
"when overriding an existing Array value": function (store) {
|
|
||||||
store.set('merge:array', [1,2,3,4]);
|
|
||||||
store.merge('merge:array', merge);
|
|
||||||
assert.deepEqual(store.get('merge:literal'), merge);
|
|
||||||
},
|
|
||||||
"when merging into an existing Object value": function (store) {
|
|
||||||
store.set('merge:object', {
|
|
||||||
prop1: 2,
|
|
||||||
prop2: 'prop2',
|
|
||||||
prop3: {
|
|
||||||
bazz: 'bazz'
|
|
||||||
},
|
|
||||||
prop4: ['foo', 'bar']
|
|
||||||
});
|
|
||||||
store.merge('merge:object', merge);
|
|
||||||
|
|
||||||
assert.equal(store.get('merge:object:prop1'), 1);
|
|
||||||
assert.equal(store.get('merge:object:prop2').length, 3);
|
|
||||||
assert.deepEqual(store.get('merge:object:prop3'), {
|
|
||||||
foo: 'bar',
|
|
||||||
bar: 'foo',
|
|
||||||
bazz: 'bazz'
|
|
||||||
});
|
|
||||||
assert.equal(store.get('merge:object:prop4').length, 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"When using the nconf memory store with different logical separator": {
|
|
||||||
topic: new nconf.Memory({logicalSeparator: '||' }),
|
|
||||||
"when storing with : (colon)": {
|
|
||||||
"should store the config atomicly": function (store) {
|
|
||||||
store.set('foo:bar:bazz', 'buzz');
|
|
||||||
assert.isTrue(typeof store.get('foo:bar') === 'undefined');
|
|
||||||
assert.equal(store.get('foo:bar:bazz'), 'buzz');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"when storing with separator": {
|
|
||||||
"should be able to read the object": function (store) {
|
|
||||||
store.set('foo||bar||bazz', 'buzz');
|
|
||||||
assert.equal(store.get('foo||bar').bazz, 'buzz');
|
|
||||||
assert.equal(store.get('foo').bar.bazz, 'buzz');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).export(module);
|
|
114
test/stores/memory-store.test.js
Normal file
114
test/stores/memory-store.test.js
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* memory-store-test.js: Tests for the nconf Memory store.
|
||||||
|
*
|
||||||
|
* (C) 2011, Charlie Robbins and the Contributors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
var nconf = require('../../lib/nconf');
|
||||||
|
var merge = require('../fixtures/data').merge;
|
||||||
|
|
||||||
|
describe('nconf/stores/memory', () => {
|
||||||
|
describe("When using the nconf memory store", () => {
|
||||||
|
var store = new nconf.Memory();
|
||||||
|
it("the set() method should respond with true", () => {
|
||||||
|
expect(store.set('foo:bar:bazz', 'buzz')).toBeTruthy();
|
||||||
|
expect(store.set('falsy:number', 0)).toBeTruthy();
|
||||||
|
expect(store.set('falsy:string:empty', '')).toBeTruthy();
|
||||||
|
expect(store.set('falsy:string:value', 'value')).toBeTruthy();
|
||||||
|
expect(store.set('falsy:boolean', false)).toBeTruthy();
|
||||||
|
expect(store.set('falsy:object', null)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("the get() method should respond with the correct value", () => {
|
||||||
|
expect(store.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
expect(store.get('falsy:number')).toEqual(0);
|
||||||
|
expect(store.get('falsy:string:empty')).toEqual('');
|
||||||
|
expect(store.get('falsy:string:value')).toEqual('value');
|
||||||
|
expect(store.get('falsy:boolean')).toEqual(false);
|
||||||
|
expect(store.get('falsy:object')).toEqual(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the get() method should not fail when retrieving non-existent keys", () => {
|
||||||
|
it("at the root level", () => {
|
||||||
|
expect(store.get('this:key:does:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("within numbers", () => {
|
||||||
|
expect(store.get('falsy:number:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("within booleans", () => {
|
||||||
|
expect(store.get('falsy:boolean:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("within objects", () => {
|
||||||
|
expect(store.get('falsy:object:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("within empty strings", () => {
|
||||||
|
expect(store.get('falsy:string:empty:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("within non-empty strings", () => {
|
||||||
|
expect(store.get('falsy:string:value:not:exist')).toEqual(undefined);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("the clear() method, should respond with the true", () => {
|
||||||
|
expect(store.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
expect(store.clear('foo:bar:bazz')).toBeTruthy();
|
||||||
|
expect(typeof store.get('foo:bar:bazz') === 'undefined').toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("the merge() method", () => {
|
||||||
|
it("when overriding an existing literal value", () => {
|
||||||
|
store.set('merge:literal', 'string-value');
|
||||||
|
store.merge('merge:literal', merge);
|
||||||
|
expect(store.get('merge:literal')).toEqual(merge);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("when overriding an existing Array value", () => {
|
||||||
|
store.set('merge:array', [1, 2, 3, 4]);
|
||||||
|
store.merge('merge:array', merge);
|
||||||
|
expect(store.get('merge:literal')).toEqual(merge);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("when merging into an existing Object value", () => {
|
||||||
|
store.set('merge:object', {
|
||||||
|
prop1: 2,
|
||||||
|
prop2: 'prop2',
|
||||||
|
prop3: {
|
||||||
|
bazz: 'bazz'
|
||||||
|
},
|
||||||
|
prop4: ['foo', 'bar']
|
||||||
|
});
|
||||||
|
store.merge('merge:object', merge);
|
||||||
|
|
||||||
|
expect(store.get('merge:object:prop1')).toEqual(1);
|
||||||
|
expect(store.get('merge:object:prop2').length).toEqual(3);
|
||||||
|
expect(store.get('merge:object:prop3')).toEqual({
|
||||||
|
foo: 'bar',
|
||||||
|
bar: 'foo',
|
||||||
|
bazz: 'bazz'
|
||||||
|
});
|
||||||
|
expect(store.get('merge:object:prop4').length).toEqual(2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("When using the nconf memory store with different logical separator", () => {
|
||||||
|
var store = new nconf.Memory({logicalSeparator: '||'});
|
||||||
|
|
||||||
|
it("when storing with : (colon), should store the config atomicly", () => {
|
||||||
|
store.set('foo:bar:bazz', 'buzz');
|
||||||
|
expect(typeof store.get('foo:bar') === 'undefined').toBeTruthy();
|
||||||
|
expect(store.get('foo:bar:bazz')).toEqual('buzz');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("when storing with separator, should be able to read the object", () => {
|
||||||
|
store.set('foo||bar||bazz', 'buzz');
|
||||||
|
expect(store.get('foo||bar').bazz).toEqual('buzz');
|
||||||
|
expect(store.get('foo').bar.bazz).toEqual('buzz');
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue