From dde5636bdb47f0fa84be85827072732677aab7a7 Mon Sep 17 00:00:00 2001 From: typicode Date: Tue, 25 Dec 2018 23:47:35 +0100 Subject: [PATCH] Add option to singular routes --- __tests__/server/singular-fake.js | 59 +++++++++++++++++++++++++++++++ src/server/router/index.js | 2 +- src/server/router/singular.js | 32 ++++++++++++----- 3 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 __tests__/server/singular-fake.js diff --git a/__tests__/server/singular-fake.js b/__tests__/server/singular-fake.js new file mode 100644 index 000000000..2212a4215 --- /dev/null +++ b/__tests__/server/singular-fake.js @@ -0,0 +1,59 @@ +const assert = require('assert') +const request = require('supertest') +const jsonServer = require('../../src/server') + +describe('Fake server', () => { + let server + let router + let db + + beforeEach(() => { + db = {} + + db.user = { + name: 'foo', + email: 'foo@example.com' + } + + server = jsonServer.create() + router = jsonServer.router(db, { _isFake: true }) + server.use(jsonServer.defaults()) + server.use(router) + }) + + describe('POST /:resource', () => { + test('should not create resource', async () => { + const user = { name: 'bar' } + await request(server) + .post('/user') + .send(user) + .expect(user) + .expect(201) + assert.notDeepStrictEqual(db.user, user) + }) + }) + + describe('PUT /:resource', () => { + test('should not update resource', async () => { + const user = { name: 'bar' } + await request(server) + .put('/user') + .send(user) + .expect(user) + .expect(200) + assert.notDeepStrictEqual(db.user, user) + }) + }) + + describe('PATCH /:resource', () => { + test('should not update resource', async () => { + const user = { name: 'bar' } + await request(server) + .patch('/user') + .send(user) + .expect({ name: 'bar', email: 'foo@example.com' }) + .expect(200) + assert.notDeepStrictEqual(db.user, user) + }) + }) +}) diff --git a/src/server/router/index.js b/src/server/router/index.js index 579ac4dae..c432271f2 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -53,7 +53,7 @@ module.exports = (db, opts = { foreignKeySuffix: 'Id', _isFake: false }) => { // Create routes db.forEach((value, key) => { if (_.isPlainObject(value)) { - router.use(`/${key}`, singular(db, key)) + router.use(`/${key}`, singular(db, key, opts)) return } diff --git a/src/server/router/singular.js b/src/server/router/singular.js index 408ce50e2..9657dd25c 100644 --- a/src/server/router/singular.js +++ b/src/server/router/singular.js @@ -3,7 +3,7 @@ const write = require('./write') const getFullURL = require('./get-full-url') const delay = require('./delay') -module.exports = (db, name) => { +module.exports = (db, name, opts) => { const router = express.Router() router.use(delay) @@ -13,8 +13,12 @@ module.exports = (db, name) => { } function create(req, res, next) { - db.set(name, req.body).value() - res.locals.data = db.get(name).value() + if (opts._isFake) { + res.locals.data = req.body + } else { + db.set(name, req.body).value() + res.locals.data = db.get(name).value() + } res.setHeader('Access-Control-Expose-Headers', 'Location') res.location(`${getFullURL(req)}`) @@ -24,15 +28,25 @@ module.exports = (db, name) => { } function update(req, res, next) { - if (req.method === 'PUT') { - db.set(name, req.body).value() + if (opts._isFake) { + if (req.method === 'PUT') { + res.locals.data = req.body + } else { + const resource = db.get(name).value() + res.locals.data = { ...resource, ...req.body } + } } else { - db.get(name) - .assign(req.body) - .value() + if (req.method === 'PUT') { + db.set(name, req.body).value() + } else { + db.get(name) + .assign(req.body) + .value() + } + + res.locals.data = db.get(name).value() } - res.locals.data = db.get(name).value() next() }