@argdown/cli
Version:
A command line interface for exporting Argdown files to html, dot or json.
482 lines (479 loc) • 18.5 kB
text/typescript
const chai = require("chai");
chai.use(require("chai-fs"));
import { expect } from "chai";
import { describe, it } from "mocha";
import * as path from "path";
import rimraf from "rimraf";
const fs = require("fs");
const rimrafPromise = function(path: string) {
return new Promise<void>((resolve, reject) => {
rimraf(path, {}, function(err) {
if (err) {
reject(err);
}
resolve();
});
});
};
interface IExecCallback {
(error: Error | null, stdout: any, stderr: any): void;
}
const execPromise = (cmd: string, callback: IExecCallback) => {
return new Promise<void>((resolve, reject) => {
require("child_process").exec(
cmd,
(error: Error | null, stdout: any, stderr: any) => {
if (error !== null) {
reject(error);
}
callback(error, stdout, stderr);
resolve();
}
);
});
};
describe("argdown-cli", function() {
this.timeout(20000);
it("can create dot output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f dot " + filePath + " --stdout";
const cb: IExecCallback = (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
};
return execPromise(cmd, cb);
});
it("can create graphml output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f graphml " + filePath + " --stdout";
const cb: IExecCallback = (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
};
return execPromise(cmd, cb);
});
it("can create html output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = "node " + filePathToCli + " html " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create web-component output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " web-component " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create json output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = "node " + filePathToCli + " json " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create markdown output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = "node " + filePathToCli + " markdown " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create png output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f png " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create jpg output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f jpg " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can create webp output", () => {
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f webp " + filePath + " --stdout";
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can load config and run process", () => {
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
let filePathToConfig = path.resolve(__dirname, "./argdown.config.js");
const cmd =
"node " + filePathToCli + " --stdout --config " + filePathToConfig;
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal("");
expect(stdout).to.not.equal(null);
});
});
it("can run custom process defined in config.processes", () => {
let svgFolder = path.resolve(__dirname, "./svg/");
let filePathToSvg = path.resolve(__dirname, "./svg/test-suffix.svg");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
let filePathToConfig = path.resolve(
__dirname,
"./custom-process.argdown.config.js"
);
const cmd =
"node " + filePathToCli + " run test --config " + filePathToConfig;
return rimrafPromise(svgFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToSvg).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(svgFolder);
});
});
it("can load plugin from config and run process defined in config.processes", () => {
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
let filePathToConfig = path.resolve(
__dirname,
"./add-plugin.argdown.config.js"
);
const cmd =
"node " + filePathToCli + " run test --config " + filePathToConfig;
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.equal("Hallo World!\n");
});
});
it("can create html file", () => {
let htmlFolder = path.resolve(__dirname, "./html/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToHtml = path.resolve(__dirname, "./html/test.html");
let filePathToCss = path.resolve(__dirname, "./html/argdown.css");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " html " + filePath + " " + htmlFolder;
return rimrafPromise(htmlFolder)
.then(() => {
return execPromise(cmd, function(error, _stdout, stderr) {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToHtml).to.be.a).file();
(<any>expect(filePathToCss).to.be.a).file();
});
})
.then(()=>{
// Let's do it a second time to check if the copy css plugin swallows the eexist error
return execPromise(cmd, function(error, _stdout, stderr) {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToHtml).to.be.a).file();
(<any>expect(filePathToCss).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(htmlFolder);
});
});
it("can create web-component file", () => {
let htmlFolder = path.resolve(__dirname, "./html/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToWebComponentHtml = path.resolve(
__dirname,
"./html/test.component.html"
);
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " web-component " + filePath + " " + htmlFolder;
return rimrafPromise(htmlFolder)
.then(() => {
return execPromise(cmd, function(error, _stdout, stderr) {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToWebComponentHtml).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(htmlFolder);
});
});
it("can create dot file from map", () => {
let dotFolder = path.resolve(__dirname, "./dot/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToDot = path.resolve(__dirname, "./dot/test.dot");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f dot " + filePath + " " + dotFolder;
return rimrafPromise(dotFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToDot).to.be.a).file();
if (error !== null) {
console.log("exec error: " + error);
}
});
})
.then(() => {
return rimrafPromise(dotFolder);
});
});
it("can create graphml file from map", () => {
let dotFolder = path.resolve(__dirname, "./graphml/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToDot = path.resolve(__dirname, "./graphml/test.graphml");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f graphml " + filePath + " " + dotFolder;
return rimrafPromise(dotFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToDot).to.be.a).file();
if (error !== null) {
console.log("exec error: " + error);
}
});
})
.then(() => {
return rimrafPromise(dotFolder);
});
});
it("can create svg file from map", () => {
let svgFolder = path.resolve(__dirname, "./svg/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToSvg = path.resolve(__dirname, "./svg/test.svg");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f svg " + filePath + " " + svgFolder;
return rimrafPromise(svgFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToSvg).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(svgFolder);
});
});
it("can create pdf file from map", () => {
let pdfFolder = path.resolve(__dirname, "./pdf/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToPdf = path.resolve(__dirname, "./pdf/test.pdf");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = "node " + filePathToCli + " map " + filePath + " " + pdfFolder;
return rimrafPromise(pdfFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToPdf).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(pdfFolder);
});
});
it("can create json file", () => {
let jsonFolder = path.resolve(__dirname, "./json");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToJson = path.resolve(__dirname, "./json/test.json");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " json " + filePath + " " + jsonFolder;
return rimrafPromise(jsonFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToJson).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(jsonFolder);
});
});
it("can create png file from map", () => {
let imagesFolder = path.resolve(__dirname, "./images/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToPng = path.resolve(__dirname, "./images/test.png");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f png " + filePath + " " + imagesFolder;
return rimrafPromise(imagesFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToPng).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(imagesFolder);
});
});
it("can create jpg file from map", () => {
let imagesFolder = path.resolve(__dirname, "./images/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToJpg = path.resolve(__dirname, "./images/test.jpg");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f jpg " + filePath + " " + imagesFolder;
return rimrafPromise(imagesFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToJpg).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(imagesFolder);
});
});
it("can create webp file from map", () => {
let imagesFolder = path.resolve(__dirname, "./images/");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToWebp = path.resolve(__dirname, "./images/test.webp");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " map -f webp " + filePath + " " + imagesFolder;
return rimrafPromise(imagesFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToWebp).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(imagesFolder);
});
});
it("can create html file from markdown", () => {
let htmlFolder = path.resolve(__dirname, "./html");
let filePath = path.resolve(__dirname, "./test.argdown");
let filePathToHtml = path.resolve(__dirname, "./html/test.html");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + " markdown " + filePath + " " + htmlFolder;
return rimrafPromise(htmlFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToHtml).to.be.a).file();
});
})
.then(() => {
return rimrafPromise(filePathToHtml);
});
});
it("can include files", () => {
let globPath = path.resolve(__dirname, "./include-test.argdown");
let expectedResult = fs.readFileSync(
path.resolve(__dirname, "./include-test-expected-result.txt"),
"utf8"
);
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = `node ${filePathToCli} --silent compile ${globPath} --stdout`;
return execPromise(cmd, (error, stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
expect(stdout).to.not.equal(null);
expect(
stdout.replace(
/File \'.+\' already included./g,
"File already included."
)
).to.equal(
expectedResult.replace(
/File \'.+\' already included./g,
"File already included."
)
);
});
});
it("can load glob input", () => {
let jsonFolder = path.resolve(__dirname, "./json");
let globPath = path.resolve(__dirname, "./*.argdown");
let filePathToJson1 = path.resolve(__dirname, "./json/test.json");
let filePathToJson2 = path.resolve(__dirname, "./json/include-test.json");
let filePathToJson3 = path.resolve(__dirname, "./json/_partial1.json");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd =
"node " + filePathToCli + ' json "' + globPath + '" ' + jsonFolder;
return rimrafPromise(jsonFolder)
.then(() => {
return execPromise(cmd, (error, _stdout, stderr) => {
expect(error).to.equal(null);
expect(stderr).to.equal("");
(<any>expect(filePathToJson1).to.be.a).file();
(<any>expect(filePathToJson2).to.be.a).file();
(<any>expect(filePathToJson3).to.not.be.a).path();
});
})
.then(() => {
return rimrafPromise(jsonFolder);
});
});
it("can throw parser error", async () => {
let invalidArgdownPath = path.resolve(__dirname, "./invalid-argdown.txt");
let filePathToCli = path.resolve(__dirname, "../dist//cli.js");
const cmd = `node ${filePathToCli} --logParserErrors=false "${invalidArgdownPath}"`;
await execPromise(cmd, (error, _stdout, stderr) => {
console.log(stderr);
expect(error).to.not.equal(null);
expect((<any>error).code).to.equal(1);
// expect(stderr).to.not.equal("");
}).catch(() => {});
});
});