meta dependecy tests

v1.18.x
Barış Soner Uşaklı 8 years ago
parent 01e2263c01
commit 6049c46f15

@ -11,57 +11,71 @@ var pkg = require('../../package.json');
module.exports = function (Meta) { module.exports = function (Meta) {
Meta.dependencies = {}; Meta.dependencies = {};
var depsMissing = false;
var depsOutdated = false;
Meta.dependencies.check = function (callback) { Meta.dependencies.check = function (callback) {
var modules = Object.keys(pkg.dependencies); var modules = Object.keys(pkg.dependencies);
var depsOutdated = false;
var depsMissing = false;
winston.verbose('Checking dependencies for outdated modules'); winston.verbose('Checking dependencies for outdated modules');
async.each(modules, function (module, next) { async.each(modules, Meta.dependencies.checkModule, function (err) {
fs.readFile(path.join(__dirname, '../../node_modules/', module, 'package.json'), { if (err) {
return callback(err);
}
if (depsMissing) {
callback(new Error('dependencies-missing'));
} else if (depsOutdated) {
callback(global.env !== 'development' ? new Error('dependencies-out-of-date') : null);
} else {
callback(null);
}
});
};
Meta.dependencies.checkModule = function (moduleName, callback) {
fs.readFile(path.join(__dirname, '../../node_modules/', moduleName, 'package.json'), {
encoding: 'utf-8', encoding: 'utf-8',
}, function (err, pkgData) { }, function (err, pkgData) {
if (err) { if (err) {
// If a bundled plugin/theme is not present, skip the dep check (#3384) // If a bundled plugin/theme is not present, skip the dep check (#3384)
if (err.code === 'ENOENT' && (module === 'nodebb-rewards-essentials' || module.startsWith('nodebb-plugin') || module.startsWith('nodebb-theme'))) { if (err.code === 'ENOENT' && (moduleName === 'nodebb-rewards-essentials' || moduleName.startsWith('nodebb-plugin') || moduleName.startsWith('nodebb-theme'))) {
winston.warn('[meta/dependencies] Bundled plugin ' + module + ' not found, skipping dependency check.'); winston.warn('[meta/dependencies] Bundled plugin ' + moduleName + ' not found, skipping dependency check.');
return next(); return callback(null, true);
} }
return next(err); return callback(err);
} }
pkgData = Meta.dependencies.parseModuleData(moduleName, pkgData);
var satisfies = Meta.dependencies.doesSatisfy(pkgData, pkg.dependencies[moduleName]);
callback(null, satisfies);
});
};
Meta.dependencies.parseModuleData = function (moduleName, pkgData) {
try { try {
pkgData = JSON.parse(pkgData); pkgData = JSON.parse(pkgData);
} catch (e) { } catch (e) {
process.stdout.write('[' + 'missing'.red + '] ' + module.bold + ' is a required dependency but could not be found\n'); winston.warn('[' + 'missing'.red + '] ' + moduleName.bold + ' is a required dependency but could not be found\n');
depsMissing = true; depsMissing = true;
return next(); return null;
} }
return pkgData;
};
var ok = !semver.validRange(pkg.dependencies[module]) || semver.satisfies(pkgData.version, pkg.dependencies[module]); Meta.dependencies.doesSatisfy = function (moduleData, packageJSONVersion) {
if (!moduleData) {
if (ok || (pkgData._resolved && pkgData._resolved.indexOf('//github.com') !== -1)) { return false;
next();
} else {
process.stdout.write('[' + 'outdated'.yellow + '] ' + module.bold + ' installed v' + pkgData.version + ', package.json requires ' + pkg.dependencies[module] + '\n');
depsOutdated = true;
next();
}
});
}, function (err) {
if (err) {
return callback(err);
} }
var versionOk = !semver.validRange(packageJSONVersion) || semver.satisfies(moduleData.version, packageJSONVersion);
if (depsMissing) { var githubRepo = moduleData._resolved && moduleData._resolved.indexOf('//github.com') !== -1;
callback(new Error('dependencies-missing')); var satisfies = versionOk || githubRepo;
} else if (depsOutdated) { if (!satisfies) {
callback(global.env !== 'development' ? new Error('dependencies-out-of-date') : null); winston.warn('[' + 'outdated'.yellow + '] ' + moduleData.name.bold + ' installed v' + moduleData.version + ', package.json requires ' + packageJSONVersion + '\n');
} else { depsOutdated = true;
callback(null);
} }
}); return satisfies;
}; };
}; };

@ -211,6 +211,56 @@ describe('meta', function () {
}); });
}); });
describe('dependencies', function () {
it('should return ENOENT if module is not found', function (done) {
meta.dependencies.checkModule('some-module-that-does-not-exist', function (err) {
assert.equal(err.code, 'ENOENT');
done();
});
});
it('should not error if module is a nodebb-plugin-*', function (done) {
meta.dependencies.checkModule('nodebb-plugin-somePlugin', function (err) {
assert.ifError(err);
done();
});
});
it('should not error if module is nodebb-theme-*', function (done) {
meta.dependencies.checkModule('nodebb-theme-someTheme', function (err) {
assert.ifError(err);
done();
});
});
it('should parse json package data', function (done) {
var pkgData = meta.dependencies.parseModuleData('nodebb-plugin-test', '{"a": 1}');
assert.equal(pkgData.a, 1);
done();
});
it('should return null data with invalid json', function (done) {
var pkgData = meta.dependencies.parseModuleData('nodebb-plugin-test', 'asdasd');
assert.strictEqual(pkgData, null);
done();
});
it('should return false if moduleData is falsy', function (done) {
assert(!meta.dependencies.doesSatisfy(null, '1.0.0'));
done();
});
it('should return false if moduleData doesnt not satisfy package.json', function (done) {
assert(!meta.dependencies.doesSatisfy({ name: 'nodebb-plugin-test', version: '0.9.0' }, '1.0.0'));
done();
});
it('should return true if _resolved is from github', function (done) {
assert(meta.dependencies.doesSatisfy({ name: 'nodebb-plugin-test', _resolved: 'https://github.com/some/repo', version: '0.9.0' }, '1.0.0'));
done();
});
});
after(function (done) { after(function (done) {
db.emptydb(done); db.emptydb(done);

Loading…
Cancel
Save