'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
// The doctool currently uses js-yaml from the tool/eslint/ tree.
try {
require('../../tools/eslint/node_modules/js-yaml');
} catch (e) {
return common.skip('missing js-yaml (eslint not present)');
}
const processIncludes = require('../../tools/doc/preprocess.js');
const html = require('../../tools/doc/html.js');
// Test data is a list of objects with two properties.
// The file property is the file path.
// The html property is some html which will be generated by the doctool.
// This html will be stripped of all whitespace because we don't currently
// have an html parser.
const testData = [
{
file: path.join(common.fixturesDir, 'sample_document.md'),
html: '
- fish
fish
Redfish
' +
'- Bluefish
'
},
{
file: path.join(common.fixturesDir, 'order_of_end_tags_5873.md'),
html: 'ClassMethod: Buffer.from(array) ' +
'#
'
},
{
file: path.join(common.fixturesDir, 'doc_with_yaml.md'),
html: 'Sample Markdown with YAML info' +
'#
' +
'Foobar#
' +
'Added in: v1.0.0
' +
'Describe Foobar
in more detail here.
' +
'Foobar II#
' +
' ' +
'Describe Foobar II
in more detail here.' +
'fg(1)
' +
'Deprecated thingy#' +
'
' +
'Added in: v1.0.0' +
'Deprecated since: v2.0.0
Describe ' +
'Deprecated thingy
in more detail here.' +
'fg(1p)' +
'
' +
'Something#
' +
' ' +
'Describe Something
in more detail here. ' +
'
'
},
{
file: path.join(common.fixturesDir, 'doc_with_includes.md'),
html: '' +
'Look here!
' +
'' +
'' +
'foobar#
' +
'I exist and am being linked to.
' +
''
},
{
file: path.join(common.fixturesDir, 'sample_document.md'),
html: '- fish
fish
Redfish
' +
'- Bluefish
',
analyticsId: 'UA-67020396-1'
},
];
const spaces = /\s/g;
testData.forEach((item) => {
// Normalize expected data by stripping whitespace
const expected = item.html.replace(spaces, '');
const includeAnalytics = typeof item.analyticsId !== 'undefined';
fs.readFile(item.file, 'utf8', common.mustCall((err, input) => {
assert.ifError(err);
processIncludes(item.file, input, common.mustCall((err, preprocessed) => {
assert.ifError(err);
html(
{
input: preprocessed,
filename: 'foo',
template: path.resolve(__dirname, '../../doc/template.html'),
nodeVersion: process.version,
analytics: item.analyticsId,
},
common.mustCall((err, output) => {
assert.ifError(err);
const actual = output.replace(spaces, '');
// Assert that the input stripped of all whitespace contains the
// expected list
assert(actual.includes(expected));
// Testing the insertion of Google Analytics script when
// an analytics id is provided. Should not be present by default
if (includeAnalytics) {
assert(actual.includes('google-analytics.com'),
'Google Analytics script was not present');
} else {
assert.strictEqual(actual.includes('google-analytics.com'), false,
'Google Analytics script was present');
}
}));
}));
}));
});