227 lines
6.5 KiB
JavaScript
227 lines
6.5 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const path = require('path');
|
||
|
const chai = require('chai');
|
||
|
const fs = require('fs-extra');
|
||
|
const expect = chai.expect;
|
||
|
const assert = chai.assert;
|
||
|
//chai.use(require('./helpers/file'));
|
||
|
|
||
|
const tmpDir = "files/tmp/";
|
||
|
const tmpPath = function (relativePath) {
|
||
|
return (tmpDir+relativePath).split(/\//).join(path.sep);
|
||
|
};
|
||
|
|
||
|
if (!fs.existsSync(path)) {
|
||
|
fs.mkdirsSync(tmpDir);
|
||
|
}
|
||
|
|
||
|
const fixture = function(relativePath) {
|
||
|
return ('files/fixtures/'+relativePath).split(/\//).join(path.sep);
|
||
|
};
|
||
|
|
||
|
// Class Under Test
|
||
|
const ConfigFile = require('../index').ConfigFile;
|
||
|
|
||
|
describe("ConfigFile", function() {
|
||
|
|
||
|
describe("#read()", function () {
|
||
|
|
||
|
describe("with a non-existing file", function() {
|
||
|
const nonExistingFile = fixture('non-existing-config.js');
|
||
|
const configFile = new ConfigFile(nonExistingFile);
|
||
|
|
||
|
beforeEach(function(done) {
|
||
|
if (fs.existsSync(nonExistingFile)) {
|
||
|
fs.unlink(fixture('non-existing-config.js'), done);
|
||
|
} else {
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it("it throws an error if file not found", function() {
|
||
|
const read = function() {
|
||
|
configFile.read();
|
||
|
};
|
||
|
|
||
|
expect(read).to.throw(/non-existing-config\.js/);
|
||
|
});
|
||
|
|
||
|
describe("when createIfNotExists() is used before", function() {
|
||
|
beforeEach(function() {
|
||
|
configFile.createIfNotExists();
|
||
|
});
|
||
|
|
||
|
it("returns a empty config", function() {
|
||
|
const config = configFile.read();
|
||
|
expect(config).to.exist.and.to.be.a('object').and.to.be.empty;
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with a requirejs.config() call with a define() in the file", function() {
|
||
|
const configFile = new ConfigFile(fixture('config-with-define.js'));
|
||
|
|
||
|
it("returns all the properties in the config", function() {
|
||
|
const config = configFile.read();
|
||
|
|
||
|
expect(config).to.include.keys('paths');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
|
||
|
describe("with a normal requirejs.config() call in the file", function() {
|
||
|
const configFile = new ConfigFile(fixture('normal-config.js'));
|
||
|
|
||
|
it("returns the config as an object", function() {
|
||
|
const config = configFile.read();
|
||
|
expect(config).to.exist.and.to.be.an('object');
|
||
|
});
|
||
|
|
||
|
it("returns all the properties in the config", function() {
|
||
|
const config = configFile.read();
|
||
|
|
||
|
expect(config).to.be.an('object').and.to.include.keys('paths');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with a var require definition", function() {
|
||
|
const configFile = new ConfigFile(fixture('var-config.js'));
|
||
|
|
||
|
it("returns the properties from config", function() {
|
||
|
const config = configFile.read();
|
||
|
expect(config).to.include.keys('paths');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with an parse error config", function() {
|
||
|
const configFile = new ConfigFile(fixture('parse-error-config.js'));
|
||
|
|
||
|
it("shows an error", function () {
|
||
|
const read = function() {
|
||
|
configFile.read();
|
||
|
};
|
||
|
|
||
|
expect(read).to.throw(/syntax error/);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with an empty config", function() {
|
||
|
const configFile = new ConfigFile(fixture('empty-config.js'));
|
||
|
|
||
|
it("reads the config file and returns an empty object without notice", function() {
|
||
|
const config = configFile.read();
|
||
|
|
||
|
expect(config).to.exist.and.to.be.a('object').and.to.be.empty;
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("with an alternative fs implementation", function() {
|
||
|
|
||
|
const volumeDir = 'app';
|
||
|
const fileName = 'in-memory-config.js';
|
||
|
const filePath = `${volumeDir}/${fileName}`;
|
||
|
|
||
|
const unionfs = require('unionfs');
|
||
|
const memfs = require('memfs');
|
||
|
var memFiles = { };
|
||
|
var contents = fs.readFileSync(fixture('normal-config.js'), 'utf8');
|
||
|
memFiles[fileName] = contents;
|
||
|
var vol = memfs.Volume.fromJSON(memFiles, volumeDir);
|
||
|
var ufs = unionfs.ufs.use(vol);
|
||
|
|
||
|
const configFile = new ConfigFile(filePath, ufs);
|
||
|
|
||
|
it("returns the config as an object", function() {
|
||
|
const config = configFile.read();
|
||
|
expect(config).to.exist.and.to.be.a('object').and.not.to.be.empty;
|
||
|
});
|
||
|
|
||
|
it("returns all the properties in the config", function() {
|
||
|
const config = configFile.read();
|
||
|
expect(config).to.be.an('object').and.to.include.keys('paths');
|
||
|
});
|
||
|
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("#write()", function() {
|
||
|
const testModify = function(configName, modify, done) {
|
||
|
const configFilePath = tmpPath(configName);
|
||
|
fs.copy(fixture(configName), configFilePath, function (err) {
|
||
|
expect(err).to.not.exist;
|
||
|
|
||
|
const configFile = new ConfigFile(configFilePath);
|
||
|
|
||
|
const config = configFile.read();
|
||
|
|
||
|
modify(config);
|
||
|
|
||
|
configFile.write();
|
||
|
|
||
|
const expectedContents = fs.readFileSync(fixture('modified-'+configName)).toString();
|
||
|
const actualContents = fs.readFileSync(configFilePath).toString();
|
||
|
|
||
|
assert.equal(actualContents, expectedContents);
|
||
|
done();
|
||
|
});
|
||
|
};
|
||
|
|
||
|
it('writes the file with the modified config for a normal config', function (done) {
|
||
|
testModify(
|
||
|
'normal-config.js',
|
||
|
function (config) {
|
||
|
config.paths['monster'] = '/path/to/monster';
|
||
|
},
|
||
|
done
|
||
|
);
|
||
|
});
|
||
|
|
||
|
it('writes the file with the modified config for a var config', function (done) {
|
||
|
testModify(
|
||
|
'var-config.js',
|
||
|
function (config) {
|
||
|
config.paths['lodash'] = '/path/to/lodash.min';
|
||
|
},
|
||
|
done
|
||
|
);
|
||
|
});
|
||
|
|
||
|
it("writes an empty read config with a requirejs.config call", function(done) {
|
||
|
testModify(
|
||
|
'empty-config.js',
|
||
|
function (config) {
|
||
|
return config.baseUrl = './js-build/lib';
|
||
|
},
|
||
|
done
|
||
|
);
|
||
|
});
|
||
|
|
||
|
describe('with a non existing file which is createIfNotExists() before', function () {
|
||
|
const nonExistingFile = fixture('non-existing-config.js');
|
||
|
const configFile = new ConfigFile(nonExistingFile);
|
||
|
|
||
|
beforeEach(function(done) {
|
||
|
if (fs.existsSync(nonExistingFile)) {
|
||
|
fs.unlink(fixture('non-existing-config.js'), done);
|
||
|
} else {
|
||
|
done();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
it("writes the file", function() {
|
||
|
configFile.createIfNotExists();
|
||
|
configFile.write();
|
||
|
});
|
||
|
|
||
|
it("writes the file and creates directories", function() {
|
||
|
const nonExistingFile = tmpPath('in/directory/non-existing-config.js');
|
||
|
const configFile = new ConfigFile(nonExistingFile);
|
||
|
|
||
|
configFile.createIfNotExists();
|
||
|
configFile.write();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|