From f5fd222ae3ff970914a70f980e593b0d239004ad Mon Sep 17 00:00:00 2001 From: Ryan Zec Date: Mon, 6 Nov 2017 07:10:55 -0500 Subject: [PATCH] added support for _delay in query string to delay response of request on per request basis (#673) * added support for passing _delay as query parameter to delay response by X milliseconds * added tests / fixed linting error --- src/server/router/delay.js | 11 ++++++ src/server/router/nested.js | 2 ++ src/server/router/plural.js | 2 ++ src/server/router/singular.js | 2 ++ test/server/plural.js | 66 +++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 src/server/router/delay.js diff --git a/src/server/router/delay.js b/src/server/router/delay.js new file mode 100644 index 0000000..2daabba --- /dev/null +++ b/src/server/router/delay.js @@ -0,0 +1,11 @@ +const pause = require('connect-pause') + +module.exports = function delay(req, res, next) { + // NOTE: for some reason unknown to me, if the default is 0, the tests seems to add 2 seconds + // NOTE: to each test, a default value of 1 does not seem to be effected by that issue + const _delay = !isNaN(parseFloat(req.query._delay)) + ? parseFloat(req.query._delay) + : 1 + delete req.query._delay + pause(_delay)(req, res, next) +} diff --git a/src/server/router/nested.js b/src/server/router/nested.js index ca5a72d..17defea 100644 --- a/src/server/router/nested.js +++ b/src/server/router/nested.js @@ -1,8 +1,10 @@ const express = require('express') const pluralize = require('pluralize') +const delay = require('./delay') module.exports = opts => { const router = express.Router() + router.use(delay) // Rewrite URL (/:resource/:id/:nested -> /:nested) and request query function get(req, res, next) { diff --git a/src/server/router/plural.js b/src/server/router/plural.js index 37e329b..77208c4 100644 --- a/src/server/router/plural.js +++ b/src/server/router/plural.js @@ -4,10 +4,12 @@ const pluralize = require('pluralize') const write = require('./write') const getFullURL = require('./get-full-url') const utils = require('../utils') +const delay = require('./delay') module.exports = (db, name, opts) => { // Create router const router = express.Router() + router.use(delay) // Embed function used in GET /name and GET /name/id function embed(resource, e) { diff --git a/src/server/router/singular.js b/src/server/router/singular.js index 45b8420..0e8490e 100644 --- a/src/server/router/singular.js +++ b/src/server/router/singular.js @@ -1,9 +1,11 @@ const express = require('express') const write = require('./write') const getFullURL = require('./get-full-url') +const delay = require('./delay') module.exports = (db, name) => { const router = express.Router() + router.use(delay) function show(req, res, next) { res.locals.data = db.get(name).value() diff --git a/test/server/plural.js b/test/server/plural.js index 90f8c3b..7fde366 100644 --- a/test/server/plural.js +++ b/test/server/plural.js @@ -501,6 +501,18 @@ describe('Server', () => { }) }) + describe('GET /:resource>_delay=', () => { + it('should delay response', done => { + const start = new Date() + request(server) + .get('/posts?_delay=1100') + .expect(200, function(err) { + const end = new Date() + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) + }) + }) + }) + describe('POST /:resource', () => { it('should respond with json, create a resource and increment id', async () => { await request(server) @@ -546,6 +558,19 @@ describe('Server', () => { .expect(201)) }) + describe('POST /:resource?_delay=', () => { + it('should delay response', done => { + const start = new Date() + request(server) + .post('/posts?_delay=1100') + .send({ body: 'foo', booleanValue: true, integerValue: 1 }) + .expect(201, function(err) { + const end = new Date() + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) + }) + }) + }) + describe('PUT /:resource/:id', () => { it('should respond with json and replace resource', async () => { const post = { id: 1, booleanValue: true, integerValue: 1 } @@ -573,6 +598,20 @@ describe('Server', () => { .expect(404)) }) + describe('PUT /:resource:id?_delay=', () => { + it('should delay response', done => { + const start = new Date() + request(server) + .put('/posts/1?_delay=1100') + .set('Accept', 'application/json') + .send({ id: 1, booleanValue: true, integerValue: 1 }) + .expect(200, function(err) { + const end = new Date() + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) + }) + }) + }) + describe('PATCH /:resource/:id', () => { it('should respond with json and update resource', async () => { const partial = { body: 'bar' } @@ -597,6 +636,20 @@ describe('Server', () => { .expect(404)) }) + describe('PATCH /:resource:id?_delay=', () => { + it('should delay response', done => { + const start = new Date() + request(server) + .patch('/posts/1?_delay=1100') + .send({ body: 'bar' }) + .send({ id: 1, booleanValue: true, integerValue: 1 }) + .expect(200, function(err) { + const end = new Date() + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) + }) + }) + }) + describe('DELETE /:resource/:id', () => { it('should respond with empty data, destroy resource and dependent resources', async () => { await request(server) @@ -615,6 +668,19 @@ describe('Server', () => { .expect(404)) }) + describe('DELETE /:resource:id?_delay=', () => { + it('should delay response', done => { + const start = new Date() + request(server) + .del('/posts/1?_delay=1100') + .send({ id: 1, booleanValue: true, integerValue: 1 }) + .expect(200, function(err) { + const end = new Date() + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) + }) + }) + }) + describe('Static routes', () => { describe('GET /', () => { it('should respond with html', () =>