From 8a9b9cdcfe9d0336495079c25d7cb76e0e317090 Mon Sep 17 00:00:00 2001 From: Klemek Date: Tue, 6 Apr 2021 09:58:51 +0200 Subject: [PATCH] /stats?all=true --- package.json | 2 +- src/app.js | 22 +++++- src/hit_counter.js | 4 +- test/app.test.js | 167 +++++++++++++++++++++++++++++---------------- 4 files changed, 133 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 9bb1ef0..6bd014f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gitblog.md", - "version": "1.3.2", + "version": "1.3.3", "description": "A static blog using Markdown pulled from your git repository.", "main": "src/server.js", "dependencies": { diff --git a/src/app.js b/src/app.js index 70eb174..54afc6e 100644 --- a/src/app.js +++ b/src/app.js @@ -201,9 +201,25 @@ module.exports = (config) => { }); app.get('/stats', (req, res) => { if (config['modules']['hit_counter']) { - hc.read('/', (data) => { - res.json(data); - }); + if (req.query['all']) { + const keys = Object.keys(articles).filter(key => !articles[key].draft); + keys.unshift('/'); + const read = (i, outputData) => { + if (i >= keys.length) { + res.json(outputData); + } else { + hc.read(keys[i], (data) => { + outputData.push(data); + read(i + 1, outputData); + }); + } + }; + read(0, []); + } else { + hc.read('/', (data) => { + res.json(data); + }); + } } else { showError(req, res, 404); } diff --git a/src/hit_counter.js b/src/hit_counter.js index 1b3cb4c..86d974b 100644 --- a/src/hit_counter.js +++ b/src/hit_counter.js @@ -42,13 +42,15 @@ module.exports = (config, onConnect, onError) => { const read = (path, cb) => { if (!client.connected) { cb({ + path: path, hits: 0, total_visitors: 0, - current_visitors: 0, + current_visitors: cleanVisitors(path), }); } else { client.hgetall(path, (_, value) => { cb({ + path: path, hits: value ? parseInt(value.h) || 0 : 0, total_visitors: value ? parseInt(value.v) || 0 : 0, current_visitors: cleanVisitors(path), diff --git a/test/app.test.js b/test/app.test.js index ce5fd78..557dc3f 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -197,26 +197,6 @@ describe('Test root path', () => { }); }, fail); }); - test('404 index no stats', (done) => { - request(app).get('/stats') - .then((response) => { - expect(response.statusCode).toBe(404); - done(); - }); - }); - test('200 index stats', (done) => { - config['modules']['hit_counter'] = true; - request(app).get('/stats') - .then((response) => { - expect(response.statusCode).toBe(200); - expect(response.body).toEqual({ - hits: 0, - total_visitors: 0, - current_visitors: 0, - }); - done(); - }); - }); }); describe('Test RSS feed', () => { @@ -455,45 +435,8 @@ describe('Test articles rendering', () => { }); }, fail); }); - - test('404 article no stats', (done) => { - utils.createEmptyDirs([ path.join(dataDir, '2019', '05', '05') ]); - utils.createEmptyFiles([ - path.join(dataDir, '2019', '05', '05', 'index.md'), - path.join(dataDir, testTemplate), - ]); - app.reload(() => { - request(app).get('/2019/05/05/hello/stats') - .then((response) => { - expect(response.statusCode).toBe(404); - done(); - }); - }); - }); - - test('200 index stats', (done) => { - config['modules']['hit_counter'] = true; - utils.createEmptyDirs([ path.join(dataDir, '2019', '05', '05') ]); - utils.createEmptyFiles([ - path.join(dataDir, '2019', '05', '05', 'index.md'), - path.join(dataDir, testTemplate), - ]); - app.reload(() => { - request(app).get('/2019/05/05/anything/stats') - .then((response) => { - expect(response.statusCode).toBe(200); - expect(response.body).toEqual({ - hits: 0, - total_visitors: 0, - current_visitors: 0, - }); - done(); - }); - }); - }); }); - describe('Test static files', () => { test('404 invalid file no error page', (done) => { request(app).get('/somefile.txt') @@ -574,3 +517,113 @@ describe('Test other requests', () => { }); }); }); + + +describe('Test stats', () => { + test('404 index no stats', (done) => { + request(app).get('/stats') + .then((response) => { + expect(response.statusCode).toBe(404); + done(); + }); + }); + test('200 index stats', (done) => { + config['modules']['hit_counter'] = true; + request(app).get('/stats') + .then((response) => { + expect(response.statusCode).toBe(200); + expect(response.body).toEqual({ + path: '/', + hits: 0, + total_visitors: 0, + current_visitors: 0, + }); + done(); + }); + }); + test('200 index stats all no article', (done) => { + config['modules']['hit_counter'] = true; + app.reload(() => { + request(app).get('/stats?all=true') + .then((response) => { + expect(response.statusCode).toBe(200); + expect(response.body).toEqual([ + { + path: '/', + hits: 0, + total_visitors: 0, + current_visitors: 0, + }, + ]); + done(); + }); + }); + }); + test('200 index stats all 2 article 1 drafted', (done) => { + config['modules']['hit_counter'] = true; + utils.createEmptyDirs([ + path.join(dataDir, '2019', '05', '05'), + path.join(dataDir, '2019', '04', '05'), + ]); + utils.createEmptyFiles([ + path.join(dataDir, '2019', '05', '05', 'index.md'), + path.join(dataDir, '2019', '04', '05', 'draft.md'), + ]); + app.reload(() => { + request(app).get('/stats?all=true') + .then((response) => { + expect(response.statusCode).toBe(200); + expect(response.body).toEqual([ + { + path: '/', + hits: 0, + total_visitors: 0, + current_visitors: 0, + }, + { + path: '2019/05/05', + hits: 0, + total_visitors: 0, + current_visitors: 0, + }, + ]); + done(); + }); + }); + }); + test('404 article no stats', (done) => { + utils.createEmptyDirs([ path.join(dataDir, '2019', '05', '05') ]); + utils.createEmptyFiles([ + path.join(dataDir, '2019', '05', '05', 'index.md'), + path.join(dataDir, testTemplate), + ]); + app.reload(() => { + request(app).get('/2019/05/05/hello/stats') + .then((response) => { + expect(response.statusCode).toBe(404); + done(); + }); + }); + }); + test('200 article stats', (done) => { + config['modules']['hit_counter'] = true; + utils.createEmptyDirs([ path.join(dataDir, '2019', '05', '05') ]); + utils.createEmptyFiles([ + path.join(dataDir, '2019', '05', '05', 'index.md'), + path.join(dataDir, testTemplate), + ]); + app.reload(() => { + request(app).get('/2019/05/05/anything/stats') + .then((response) => { + expect(response.statusCode).toBe(200); + expect(response.body).toEqual({ + path: '2019/05/05', + hits: 0, + total_visitors: 0, + current_visitors: 0, + }); + done(); + }); + }); + }); +});