From 399d379ff5ab6b2412250d38b60175887781f310 Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Thu, 20 Aug 2015 12:34:26 -0400 Subject: [PATCH] More tests for config creation. --- lib/scaffold/create.js | 109 +++++++++++++++++++++------- test/scaffold/create.integration.js | 74 ++++++++++++++++++- 2 files changed, 153 insertions(+), 30 deletions(-) diff --git a/lib/scaffold/create.js b/lib/scaffold/create.js index 1e0b7dcc..18703f4a 100644 --- a/lib/scaffold/create.js +++ b/lib/scaffold/create.js @@ -1,6 +1,9 @@ 'use strict'; var bitcore = require('bitcore'); +var $ = bitcore.util.preconditions; +var _ = bitcore.deps._; +var path = require('path'); var version = require('../../package.json').version; var mkdirp = require('mkdirp'); var fs = require('fs'); @@ -23,48 +26,98 @@ var BASE_PACKAGE = { var BASE_BITCOIN_CONFIG = 'whitelist=127.0.0.1\n' + 'txindex=1\n'; -function create(baseDirectory, dirname, name, done) { - - if (!baseDirectory) { - baseDirectory = process.cwd; - } - - var directory = baseDirectory + '/' + dirname; - - mkdirp(directory, function(err) { +/** + * Will create a directory and bitcoin.conf file for Bitcoin. + * @param {String} dataDir - The absolute path + * @param {Function} done - The callback function called when finished + */ +function createBitcoinDirectory(datadir, done) { + mkdirp(datadir, function(err) { + if (err) { + throw err; + } + + try { + fs.writeFileSync(datadir + '/bitcoin.conf', BASE_BITCOIN_CONFIG); + } catch(e) { + done(e); + } + done(); + }); +} + +/** + * Will create a base Bitcore Node configuration directory and files. + * @param {String} configDir - The absolute path + * @param {String} name - The name of the node + * @param {Function} done - The callback function called when finished + */ +function createConfigDirectory(configDir, name, isGlobal, done) { + mkdirp(configDir, function(err) { if (err) { throw err; } - // setup the configuration files var config = BASE_CONFIG; config.name = name; var configJSON = JSON.stringify(config, null, 2); var packageJSON = JSON.stringify(BASE_PACKAGE, null, 2); try { - fs.writeFileSync(directory + '/bitcore-node.json', configJSON); - fs.writeFileSync(directory + '/package.json', packageJSON); + fs.writeFileSync(configDir + '/bitcore-node.json', configJSON); + if (!isGlobal) { + fs.writeFileSync(configDir + '/package.json', packageJSON); + } } catch(e) { done(e); } - - // setup the bitcoin data directory - mkdirp(directory + '/data', function(err) { - if (err) { - throw err; - } - - try { - fs.writeFileSync(directory + '/data/bitcoin.conf', BASE_BITCOIN_CONFIG); - } catch(e) { - done(e); - } - - done(); - - }); + done(); }); +} + +/** + * @param {Object} options + * @param {String} options.cwd - The current working directory + * @param {String} options.dirname - The name of the bitcore node configuration directory + * @param {String} options.name - The name of the bitcore node + * @param {String} options.datadir - The path to the bitcoin datadir + * @param {Function} done - A callback function called when finished + */ +function create(options, done) { + /* jshint maxstatements:20 */ + + $.checkArgument(_.isObject(options)); + $.checkArgument(_.isFunction(done)); + $.checkArgument(_.isString(options.cwd)); + $.checkArgument(_.isString(options.dirname)); + $.checkArgument(_.isString(options.name)); + $.checkArgument(_.isBoolean(options.isGlobal)); + $.checkArgument(_.isString(options.datadir)); + + var cwd = options.cwd; + var dirname = options.dirname; + var name = options.name; + var datadir = options.datadir; + var isGlobal = options.isGlobal; + + if (!cwd) { + cwd = process.cwd; + } + + var absConfigDir = path.resolve(cwd, dirname); + var absDataDir = path.resolve(absConfigDir, datadir); + + if (!fs.existsSync(absConfigDir)) { + createConfigDirectory(absConfigDir, name, isGlobal, function() { + if (!fs.existsSync(absDataDir)) { + createBitcoinDirectory(absDataDir, done); + } else { + done(); + } + }); + } else { + done(new Error('Directory "' + absConfigDir+ '" already exists.')); + } } diff --git a/test/scaffold/create.integration.js b/test/scaffold/create.integration.js index 202fd9a7..f14a254e 100644 --- a/test/scaffold/create.integration.js +++ b/test/scaffold/create.integration.js @@ -17,7 +17,12 @@ describe('#create', function() { if (err) { throw err; } - done(); + mkdirp(testDir + '/.bitcoin', function(err) { + if (err) { + throw err; + } + done(); + }); }); }); @@ -33,7 +38,13 @@ describe('#create', function() { it('will create scaffold files', function() { - create(testDir, 'mynode', 'My Node 1', function(err) { + create({ + cwd: testDir, + dirname: 'mynode', + name: 'My Node 1', + isGlobal: false, + datadir: './data' + }, function(err) { if (err) { throw err; } @@ -59,4 +70,63 @@ describe('#create', function() { }); + it('will error if directory already exists', function() { + + create({ + cwd: testDir, + dirname: 'mynode', + name: 'My Node 2', + isGlobal: false, + datadir: './data' + }, function(err) { + should.exist(err); + err.message.should.match(/^Directory/); + }); + + }); + + it('will not create bitcoin.conf if it already exists', function() { + + create({ + cwd: testDir, + dirname: 'mynode2', + name: 'My Node 2', + isGlobal: false, + datadir: '../.bitcoin' + }, function(err) { + if (err) { + throw err; + } + + var bitcoinConfig = testDir + '/.bitcoin/bitcoin.conf'; + should.equal(fs.existsSync(bitcoinConfig), false); + + }); + + }); + + it('will not create a package.json if globally installed', function() { + + create({ + cwd: testDir, + dirname: 'mynode3', + name: 'My Node 3', + isGlobal: true, + datadir: '../.bitcoin' + }, function(err) { + if (err) { + throw err; + } + + if (err) { + throw err; + } + + var packagePath = testDir + '/mynode3/package.json'; + should.equal(fs.existsSync(packagePath), false); + + }); + + }); + });