@pkgjs/support
Version:
Package support information (see: https://github.com/nodejs/package-maintenance/pull/220)
79 lines (69 loc) • 2.33 kB
JavaScript
const { before, suite, test, run } = require('mocha');
const path = require('path');
const util = require('util');
const fs = require('fs-extra');
const Ajv = require('ajv');
const support = require('..');
const childProcess = require('child_process');
const assert = require('assert')
// Delay so we can load in the example files
;(async () => {
const examplesDir = path.join(__dirname, '..', 'examples');
const examples = await fs.readdir(examplesDir);
suite('package support schema', async () => {
let ajv;
before(() => {
ajv = new Ajv();
});
test('has a valid json schema', () => {
ajv.compile(support.schema);
const validates = ajv.validateSchema(support.schema);
if (!validates) {
console.error(util.inspect(ajv.errors, false, null, true));
throw new Error('Schema validation failed');
}
});
examples.forEach((file) => {
test(`validate examples: ${file}`, async () => {
const json = await fs.readJSON(path.join(examplesDir, file));
try {
support.validate(json);
} catch (e) {
console.error(util.inspect(e, false, null, true));
throw e;
}
});
});
});
const cliTestsDir = path.join(__dirname, 'cli');
const cliTests = await fs.readdir(cliTestsDir);
suite('cli tests', async () => {
const supportCommand = path.normalize('../../../bin/support');
cliTests.forEach((testDir) => {
test(`cli test: ${testDir}`, (done) => {
const cwd = path.join(__dirname, 'cli', testDir);
const rawCommand = fs.readFileSync(path.join(cwd, 'command')).toString();
const command = rawCommand.replace(/\$\{cwd\}/g, cwd);
const expected = safeReadFile(path.join(cwd, 'expected'));
const expectedErr = safeReadFile(path.join(cwd, 'expected-errors'));
childProcess.exec(`${supportCommand} ${command}`, { cwd: cwd }, (err, stdout, stderr) => {
assert.strictEqual(stdout, expected);
assert.strictEqual(stderr, expectedErr);
done(err);
});
});
});
});
run();
})();
function safeReadFile (filePath) {
try {
return String(fs.readFileSync(filePath));
} catch (error) {
if (error.code === 'ENOENT') {
return '';
}
throw error;
}
}
;