documentation/__tests__/bin-readme.js
Tom MacWright 4fd776b16a
feat: Auto-detect readme filename
BREAKING CHANGE: the --readme-file option now has a smart default value
2018-05-21 20:44:59 -07:00

149 lines
4.1 KiB
JavaScript

const path = require('path');
const os = require('os');
const exec = require('child_process').exec;
const tmp = require('tmp');
const fs = require('fs-extra');
function documentation(args, options, parseJSON) {
return new Promise((resolve, reject) => {
if (!options.cwd) {
options.cwd = __dirname;
}
options.maxBuffer = 1024 * 1024;
args.unshift(
'node ' + path.join(__dirname, '..', 'bin', 'documentation.js')
);
exec(args.join(' '), options, (err, res) => {
resolve(res);
});
});
}
describe('readme autodetection of different filenames', function() {
const fixtures = path.join(__dirname, 'fixture/readme');
const sourceFile = path.join(fixtures, 'index.js');
let d;
let removeCallback;
beforeEach(() => {
const dirEntry = tmp.dirSync({ unsafeCleanup: true });
d = dirEntry.name;
fs.copySync(
path.join(fixtures, 'README.input.md'),
path.join(d, 'readme.markdown')
);
fs.copySync(path.join(fixtures, 'index.js'), path.join(d, 'index.js'));
});
test('updates readme.markdown', async function() {
await documentation(['readme index.js -s API'], { cwd: d });
const outputPath = path.join(d, 'readme.markdown');
expect(fs.readFileSync(outputPath, 'utf-8')).toMatchSnapshot();
});
});
describe('readme command', function() {
const fixtures = path.join(__dirname, 'fixture/readme');
const sourceFile = path.join(fixtures, 'index.js');
let d;
let removeCallback;
beforeEach(() => {
const dirEntry = tmp.dirSync({ unsafeCleanup: true });
d = dirEntry.name;
fs.copySync(
path.join(fixtures, 'README.input.md'),
path.join(d, 'README.md')
);
fs.copySync(path.join(fixtures, 'index.js'), path.join(d, 'index.js'));
});
// run tests after setting up temp dir
test('--diff-only: changes needed', async function() {
const before = fs.readFileSync(path.join(d, 'README.md'), 'utf-8');
try {
await documentation(['readme index.js --diff-only -s API'], {
cwd: d
});
} catch (err) {
const after = fs.readFileSync(path.join(d, 'README.md'), 'utf-8');
expect(err).toBeTruthy();
expect(err.code).not.toBe(0);
expect(after).toEqual(before);
}
});
test('updates README.md', async function() {
await documentation(['readme index.js -s API'], { cwd: d });
const outputPath = path.join(d, 'README.md');
expect(fs.readFileSync(outputPath, 'utf-8')).toMatchSnapshot();
});
test('--readme-file', async function() {
fs.copySync(
path.join(fixtures, 'README.input.md'),
path.join(d, 'other.md')
);
await documentation(['readme index.js -s API --readme-file other.md'], {
cwd: d
});
const actual = fs.readFileSync(path.join(d, 'other.md'), 'utf8');
expect(actual).toMatchSnapshot();
});
test('--diff-only: changes NOT needed', function() {
fs.copySync(
path.join(fixtures, 'README.output.md'),
path.join(d, 'uptodate.md')
);
return documentation(
['readme index.js --diff-only -s API --readme-file uptodate.md'],
{ cwd: d }
).then(stdout => {
// t.match(stdout, 'is up to date.');
});
});
test('-s: not found', async function() {
fs.copySync(
path.join(fixtures, 'README.output.md'),
path.join(d, 'uptodate.md')
);
try {
await documentation(
['readme index.js --diff-only -s NOTFOUND --readme-file uptodate.md'],
{ cwd: d }
);
} catch (err) {
expect(err).toBeTruthy();
}
});
test('requires -s option', async function() {
try {
await documentation(['readme index.js'], { cwd: d });
} catch (err) {
expect(err).toBeTruthy();
expect(err.code !== 0).toBeTruthy();
expect(err.stderr.match(/Missing required argument/)).toBeTruthy();
}
});
const badFixturePath = path.join(__dirname, 'fixture/bad/syntax.input');
test('errors on invalid syntax', async function() {
try {
await documentation(
['readme ' + badFixturePath + ' -s API --parseExtension input'],
{ cwd: d }
);
} catch (err) {
expect(err).toBeTruthy();
expect(err.code !== 0).toBeTruthy();
}
});
});