Somehing went wrong + (Error <%= error %>) +
+ It means the resource you're trying to access is unavailable right now.+ We're terribly sorry that you encountered this error.
+ Back to home + <%- include('footer'); %> +
+ + +
++ + +
++ + +
++ + +
+` + block + '' + data.slice(match.index + match[0].length);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ }
+
+
+ const html = converter.makeHtml(data);
+
+
+ cb(null, html);
+ });
+ }
+ };
+};
+
diff --git a/src/server.js b/src/server.js
index db33f45..3a9e0ef 100644
--- a/src/server.js
+++ b/src/server.js
@@ -1,9 +1,4 @@
-const config = require('../config.json');
+const config = require('./config')();
const app = require('./app')(config);
-const port = config.nodePort|3000;
-
-app.listen(config.nodePort|3000, () => {
- console.log(`gitblog.md server listening on port ${port}`);
-});
-
+app.start();
\ No newline at end of file
diff --git a/test/app.test.js b/test/app.test.js
index 6f24b00..c694be9 100644
--- a/test/app.test.js
+++ b/test/app.test.js
@@ -1,14 +1,326 @@
/* jshint -W117 */
const request = require('supertest');
-const config = require('./config.test.json');
+const fs = require('fs');
+const path = require('path');
+const utils = require('./test_utils');
+
+const dataDir = 'test_data';
+const testIndex = 'testindex.ejs';
+const testError = 'testerror.ejs';
+const testTemplate = 'testtemplate.ejs';
+
+const config = require('../src/config')();
+
+config['test'] = true;
+config['data_dir'] = dataDir;
+config['home']['index'] = testIndex;
+config['home']['error'] = testError;
+config['article']['template'] = testTemplate;
+config['home']['hidden'].push('.test');
+config['rss']['endpoint'] = '/rsstest';
+config['rss']['length'] = 2;
+config['webhook']['endpoint'] = '/webhooktest';
+
const app = require('../src/app')(config);
-describe('Test root path', () => {
- test('GET / 200', done => {
- request(app).get('/').then(response => {
- expect(response.statusCode).toBe(200);
- done();
- });
- });
+beforeEach((done, fail) => {
+ utils.deleteFolderSync(dataDir);
+ fs.mkdirSync(dataDir);
+ app.reload(done, fail);
});
+afterAll(() => {
+ if (fs.existsSync(dataDir)) {
+ utils.deleteFolderSync(dataDir);
+ }
+});
+
+describe('Test root path', () => {
+ test('404 no index no error', (done) => {
+ request(app).get('/').then((response) => {
+ expect(response.statusCode).toBe(404);
+ done();
+ });
+ });
+ test('404 no index but error page', (done) => {
+ fs.writeFileSync(path.join(dataDir, testError), 'error <%= error %> at <%= path %>');
+ request(app).get('/').then((response) => {
+ expect(response.statusCode).toBe(404);
+ expect(response.text).toBe('error 404 at /');
+ done();
+ });
+ });
+ test('200 no articles', (done) => {
+ fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= articles.length %>');
+ request(app).get('/').then((response) => {
+ expect(response.statusCode).toBe(200);
+ expect(response.text).toBe('articles 0');
+ done();
+ });
+ });
+ test('200 2 articles', (done, fail) => {
+ utils.createEmptyDirs([
+ path.join(dataDir, '2019', '05', '05'),
+ path.join(dataDir, '2018', '05', '05')
+ ]);
+ utils.createEmptyFiles([
+ path.join(dataDir, '2019', '05', '05', 'index.md'),
+ path.join(dataDir, '2018', '05', '05', 'index.md')
+ ]);
+ fs.writeFileSync(path.join(dataDir, testIndex), 'articles <%= articles.length %>');
+ app.reload(() => {
+ request(app).get('/').then((response) => {
+ expect(response.statusCode).toBe(200);
+ expect(response.text).toBe('articles 2');
+ done();
+ });
+ }, fail);
+ });
+});
+
+describe('Test RSS feed', () => {
+ test('404 rss deactivated', (done) => {
+ config['modules']['rss'] = false;
+ request(app).get('/rsstest').then((response) => {
+ expect(response.statusCode).toBe(404);
+ config['modules']['rss'] = true;
+ done();
+ });
+ });
+ test('200 empty rss', (done) => {
+ request(app).get('/rsstest').then((response) => {
+ expect(response.statusCode).toBe(200);
+ expect(response.text.length).toBeGreaterThan(0);
+ expect(response.text.split('print("hello")\n\nprint("hello")\n');
+ config['modules']['prism'] = true;
+ done();
+ });
+});
+
+test('prism correct', (done) => {
+ fs.writeFileSync(file, '```python\nprint("hello")\n```');
+ renderer.render(file, (err, html) => {
+ expect(err).toBeNull();
+ expect(html).not.toBe('print("hello")\n');
+ expect(html.indexOf('')).toBe(0);
+ done();
+ });
+});
+
+test('prism invalid lang', (done) => {
+ fs.writeFileSync(file, '```pythdon\nprint("hello")\n```');
+ renderer.render(file, (err, html) => {
+ expect(err).toBeNull();
+ expect(html).not.toBe('print("hello")\n
');
+ expect(html.indexOf('')).toBe(0);
+ done();
+ });
+});
+
+test('prism mutliple code blocks', (done) => {
+ fs.writeFileSync(file, '```python\n\n```\n\n```python\n\n```');
+ renderer.render(file, (err, html) => {
+ expect(err).toBeNull();
+ expect(html).toBe('
\n
');
+ done();
+ });
+});
\ No newline at end of file
diff --git a/test/test_utils.js b/test/test_utils.js
new file mode 100644
index 0000000..6b509c5
--- /dev/null
+++ b/test/test_utils.js
@@ -0,0 +1,20 @@
+const fs = require('fs');
+const path = require('path');
+
+const deleteFolderSync = (dir) => {
+ if (!fs.existsSync(dir))
+ return;
+ fs.readdirSync(dir, {withFileTypes: true}).forEach((item) => {
+ if (item.isDirectory())
+ deleteFolderSync(path.join(dir, item.name));
+ else
+ fs.unlinkSync(path.join(dir, item.name));
+ });
+ fs.rmdirSync(dir);
+};
+
+module.exports = {
+ deleteFolderSync: deleteFolderSync,
+ createEmptyDirs: (list) => list.forEach((path) => fs.mkdirSync(path, {recursive: true})),
+ createEmptyFiles: (list) => list.forEach((file) => fs.writeFileSync(file, '')),
+};
\ No newline at end of file