From 8429e0f22a6e7699d8dc62ec2c9818cb14ee36e5 Mon Sep 17 00:00:00 2001 From: Stephen Hess Date: Mon, 15 May 2017 18:05:29 -0400 Subject: [PATCH] added response data sorting middleware --- middleware/sortResponseData.js | 19 +++++ test/unit/middleware/sortResponseData.js | 88 ++++++++++++++++++++++++ test/unit/run.js | 1 + 3 files changed, 108 insertions(+) create mode 100644 middleware/sortResponseData.js create mode 100644 test/unit/middleware/sortResponseData.js diff --git a/middleware/sortResponseData.js b/middleware/sortResponseData.js new file mode 100644 index 00000000..78bb1808 --- /dev/null +++ b/middleware/sortResponseData.js @@ -0,0 +1,19 @@ +const _ = require('lodash'); + +function setup(comparator) { + function middleware(req, res, next) { + // do nothing if there's nothing to do + if (_.isEmpty(_.get(res, 'data', []))) { + return next(); + } + + res.data = res.data.sort(comparator); + + next(); + } + + return middleware; + +} + +module.exports = setup; diff --git a/test/unit/middleware/sortResponseData.js b/test/unit/middleware/sortResponseData.js new file mode 100644 index 00000000..3eabfae7 --- /dev/null +++ b/test/unit/middleware/sortResponseData.js @@ -0,0 +1,88 @@ +const sortResponseData = require('../../../middleware/sortResponseData'); + +module.exports.tests = {}; + +module.exports.tests.doIt = (test, common) => { + test('undefined res should return without interacting with comparator', (t) => { + const comparator = () => { + throw Error('should not have been called'); + }; + + const sort = sortResponseData(comparator); + + sort(undefined, undefined, () => { + t.end(); + }); + + }); + + test('undefined res.data should return without interacting with comparator', (t) => { + const comparator = () => { + throw Error('should not have been called'); + }; + + const sort = sortResponseData(comparator); + + const res = {}; + + sort(undefined, res, () => { + t.deepEquals(res, {}); + t.end(); + }); + + }); + + test('empty res.data should not cause problems', (t) => { + const comparator = () => { + throw Error('should not have been called'); + }; + + const sort = sortResponseData(comparator); + + const res = { + data: [] + }; + + sort(undefined, res, () => { + t.deepEquals(res.data, [], 'res.data should still be empty'); + t.end(); + }); + + }); + + test('comparator should be consulted for sorting res.data when defined', (t) => { + const comparator = (a, b) => { + return a.key > b.key; + }; + + const sort = sortResponseData(comparator); + + const res = { + data: [ + { key: 3 }, + { key: 2 }, + { key: 1 }, + ] + }; + + sort(undefined, res, () => { + t.deepEquals(res.data.shift(), { key: 1 }); + t.deepEquals(res.data.shift(), { key: 2 }); + t.deepEquals(res.data.shift(), { key: 3 }); + t.end(); + }); + + }); + +}; + +module.exports.all = (tape, common) => { + + function test(name, testFunction) { + return tape(`[middleware] sortResponseData: ${name}`, testFunction); + } + + for( var testCase in module.exports.tests ){ + module.exports.tests[testCase](test, common); + } +}; diff --git a/test/unit/run.js b/test/unit/run.js index 639672f6..b672e451 100644 --- a/test/unit/run.js +++ b/test/unit/run.js @@ -40,6 +40,7 @@ var tests = [ require('./middleware/parseBBox'), require('./middleware/sendJSON'), require('./middleware/normalizeParentIds'), + require('./middleware/sortResponseData'), require('./middleware/trimByGranularity'), require('./middleware/trimByGranularityStructured'), require('./middleware/requestLanguage'),