Skip to content

Commit

Permalink
Add option to singular routes
Browse files Browse the repository at this point in the history
  • Loading branch information
typicode committed Dec 25, 2018
1 parent 49f5583 commit dde5636
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 10 deletions.
59 changes: 59 additions & 0 deletions __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)
})
})
})
2 changes: 1 addition & 1 deletion src/server/router/index.js
Expand Up @@ -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
}

Expand Down
32 changes: 23 additions & 9 deletions src/server/router/singular.js
Expand Up @@ -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)

Expand All @@ -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)}`)
Expand All @@ -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()
}

Expand Down

0 comments on commit dde5636

Please sign in to comment.