refactor(markdown) es2018-ify

This commit is contained in:
coderaiser 2018-10-19 14:44:08 +03:00
parent b8e354b56c
commit f38d6221c6
5 changed files with 153 additions and 167 deletions

View file

@ -2,63 +2,69 @@
const DIR_ROOT = __dirname + '/../';
const fs = require('fs');
const {
callbackify,
promisify,
} = require('util');
const pullout = require('pullout');
const pullout = promisify(require('pullout'));
const ponse = require('ponse');
const markdown = require('markdown-it')();
const readFile = promisify(fs.readFile);
const root = require('./root');
module.exports = (name, request, callback) => {
check(name, request, callback);
module.exports = callbackify(async (name, request) => {
check(name, request);
const method = request.method;
const query = ponse.getQuery(request);
const {method} = request;
switch(method) {
case 'GET':
name = name.replace('/markdown', '');
if (query === 'relative')
name = DIR_ROOT + name;
else
name = root(name);
fs.readFile(name, 'utf8', (error, data) => {
if (error)
return callback(error);
parse(data, callback);
});
break;
return onGET(request, name);
case 'PUT':
pullout(request, 'string', (error, data) => {
if (error)
return callback(error);
parse(data, callback);
});
break;
return onPUT(request);
}
};
});
function parse(data, callback) {
function parseName(query, name) {
const shortName = name.replace('/markdown', '');
if (query === 'relative')
return DIR_ROOT + shortName;
return root(shortName);
}
async function onGET(request, name) {
const query = ponse.getQuery(request);
const fileName = parseName(query, name);
const data = await readFile(fileName, 'utf8');
return parse(data);
}
async function onPUT(request) {
const data = await pullout(request, 'string');
return parse(data);
}
const parse = promisify((data, callback) => {
process.nextTick(() => {
const md = markdown.render(data);
callback(null, md);
});
}
});
function check(name, request, callback) {
function check(name, request) {
if (typeof name !== 'string')
throw Error('name should be string!');
if (!request)
throw Error('request could not be empty!');
if (typeof callback !== 'function')
throw Error('callback should be function!');
}

113
server/markdown.spec.js Normal file
View file

@ -0,0 +1,113 @@
'use strict';
const fs = require('fs');
const path = require('path');
const test = require('tape');
const {promisify} = require('es6-promisify');
const pullout = require('pullout');
const request = require('request');
const tryToCatch = require('try-to-catch');
const markdown = require('./markdown');
const before = require('../test/before');
const {connect} = before;
const _pullout = promisify(pullout);
const _markdown = promisify(markdown);
const fixtureDir = path.join(__dirname, 'fixture', 'markdown');
const get = promisify((url, fn) => {
fn(null, request(url));
});
test('cloudcmd: markdown: error', async (t) => {
const {port, done} = await connect();
const [error, data] = await tryToCatch(get, `http://localhost:${port}/api/v1/markdown/not-found`)
const result = await _pullout(data, 'string');
await done();
t.notOk(error, 'should not be error');
t.ok(/ENOENT/.test(result), 'should not found');
t.end();
});
test('cloudcmd: markdown: relative: error', async (t) => {
const {port, done} = await connect();
const [e, data] = await tryToCatch(get, `http://localhost:${port}/api/v1/markdown/not-found?relative`)
const result = await _pullout(data, 'string');
await done();
t.ok(/ENOENT/.test(result), 'should not found');
t.end();
});
test('cloudcmd: markdown: relative', async (t) => {
const {port, done} = await connect();
const data = await get(`http://localhost:${port}/api/v1/markdown/HELP.md?relative`)
const result = await _pullout(data, 'string');
await done();
t.notOk(/ENOENT/.test(result), 'should not return error');
t.end();
});
test('cloudcmd: markdown: put', async (t) => {
const md = path.join(fixtureDir, 'markdown.md');
const html = path.join(fixtureDir, 'markdown.html');
const mdStream = fs.createReadStream(md);
const htmlFile = fs.readFileSync(html, 'utf8');
const {port, done} = await connect();
const url = `http://localhost:${port}/api/v1/markdown`;
const putStream = mdStream
.pipe(request.put(url));
const [error, result] = await tryToCatch(_pullout, putStream, 'string');
await done();
t.notOk(error, 'shoud not be error');
t.equal(result, htmlFile, 'should render markdown input to html');
t.end();
});
test('cloudcmd: markdown: put: error', (t) => {
const md = path.join(fixtureDir, 'markdown-not-exist.md');
const name = 'hello';
const mdStream = fs.createReadStream(md);
mdStream.url = 'http://hello.world';
mdStream.method = 'PUT';
_markdown(name, mdStream)
.then((result) => {
t.fail(`should fail but: ${result}`);
t.end();
})
.catch((error) => {
t.ok(error.message.includes('ENOENT: no such file or directory'), 'should emit error');
t.end();
});
});
test('cloudcmd: markdown: no name', async (t) => {
const [e] = await tryToCatch(_markdown);
t.equal(e.message, 'name should be string!', 'should throw when no name');
t.end();
});
test('cloudcmd: markdown: no request', async (t) => {
const [e] = await tryToCatch(_markdown, 'hello');
t.equal(e.message, 'request could not be empty!', 'should throw when no request');
t.end();
});

View file

@ -1,133 +0,0 @@
'use strict';
const fs = require('fs');
const path = require('path');
const test = require('tape');
const {promisify} = require('es6-promisify');
const pullout = require('pullout');
const request = require('request');
const markdown = require('../../server/markdown');
const before = require('../before');
const warp = (fn, ...a) => (...b) => fn(...b, ...a);
const _pullout = promisify(pullout);
const _markdown = promisify(markdown);
const get = promisify((url, fn) => {
fn(null, request(url));
});
test('cloudcmd: markdown: error', (t) => {
before((port, after) => {
get(`http://localhost:${port}/api/v1/markdown/not-found`)
.then(warp(_pullout, 'string'))
.then((result) => {
t.ok(/ENOENT/.test(result), 'should not found');
t.end();
after();
})
.catch((error) => {
console.log(error);
});
});
});
test('cloudcmd: markdown: relative: error', (t) => {
before((port, after) => {
get(`http://localhost:${port}/api/v1/markdown/not-found?relative`)
.then(warp(_pullout, 'string'))
.then((result) => {
t.ok(/ENOENT/.test(result), 'should not found');
t.end();
after();
})
.catch((error) => {
console.log(error);
});
});
});
test('cloudcmd: markdown: relative', (t) => {
before((port, after) => {
get(`http://localhost:${port}/api/v1/markdown/HELP.md?relative`)
.then(warp(_pullout, 'string'))
.then((result) => {
t.notOk(/ENOENT/.test(result), 'should not return error');
t.end();
after();
})
.catch((error) => {
console.log(error);
});
});
});
test('cloudcmd: markdown: put', (t) => {
const dir = path.join(__dirname, 'fixture');
const md = path.join(dir, 'markdown.md');
const html = path.join(dir, 'markdown.html');
const mdStream = fs.createReadStream(md);
const htmlFile = fs.readFileSync(html, 'utf8');
before((port, after) => {
const url = `http://localhost:${port}/api/v1/markdown`;
const putStream = mdStream
.pipe(request.put(url));
_pullout(putStream, 'string')
.then((result) => {
t.equal(result, htmlFile, 'should render markdown input to html');
t.end();
after();
})
.catch((error) => {
t.fail(error.message);
t.end();
});
});
});
test('cloudcmd: markdown: put: error', (t) => {
const dir = path.join(__dirname, 'fixture');
const md = path.join(dir, 'markdown-not-exist.md');
const name = 'hello';
const mdStream = fs.createReadStream(md);
mdStream.url = 'http://hello.world';
mdStream.method = 'PUT';
_markdown(name, mdStream)
.then((result) => {
t.fail(`should fail but: ${result}`);
t.end();
})
.catch((error) => {
t.ok(error.message.includes('ENOENT: no such file or directory'), 'should emit error');
t.end();
});
});
test('cloudcmd: markdown: no name', (t) => {
t.throws(markdown, /name should be string!/, 'should throw when no name');
t.end();
});
test('cloudcmd: markdown: no request', (t) => {
const fn = () => markdown('hello');
t.throws(fn, /request could not be empty!/, 'should throw when no request');
t.end();
});
test('cloudcmd: markdown: no function', (t) => {
const fn = () => markdown('hello', {});
t.throws(fn, /callback should be function!/, 'should throw when no callback');
t.end();
});