Skip to content

Commit c7c64e6

Browse files
committed
Merge pull request #8 from js-data/add-tests
Added tests for queryParser, mount and Router
2 parents 2c426e7 + 5ead3ea commit c7c64e6

File tree

4 files changed

+479
-2
lines changed

4 files changed

+479
-2
lines changed

test/Router.test.js

Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
import {JSDataExpress, queryParser} from './_setup'
2+
import {Container, utils} from 'js-data'
3+
4+
import express from 'express'
5+
import request from 'supertest'
6+
import sinon from 'sinon'
7+
import {assert} from 'chai'
8+
9+
describe('Router', function () {
10+
it('should be a function', function () {
11+
assert.equal(typeof JSDataExpress.Router, 'function')
12+
})
13+
14+
it('should handle GET /:resource', function (done) {
15+
const app = express()
16+
const store = new Container()
17+
const UserMapper = store.defineMapper('user')
18+
const users = [{ id: 'abc' }, { id: '123' }]
19+
const stub = sinon.stub(UserMapper, 'findAll', function () {
20+
return utils.resolve(users)
21+
})
22+
23+
const jsdataOpts = {
24+
with: {
25+
foo: 'bar'
26+
}
27+
}
28+
const params = { abc: '123' }
29+
const query = Object.assign({}, params, jsdataOpts)
30+
31+
app.use('/', queryParser)
32+
JSDataExpress.mount(app, store)
33+
34+
request(app)
35+
.get('/user')
36+
.query(query)
37+
.end(function (err, response) {
38+
if (err) {
39+
return done(err)
40+
}
41+
assert.equal(stub.calledOnce, true)
42+
assert.deepEqual(stub.firstCall.args[0], params)
43+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
44+
assert.deepEqual(response.body, users)
45+
done()
46+
})
47+
})
48+
49+
it('should handle GET /:resource/:id', function (done) {
50+
const app = express()
51+
const store = new Container()
52+
const UserMapper = store.defineMapper('user')
53+
54+
const jsdataOpts = {
55+
with: {
56+
foo: 'bar'
57+
}
58+
}
59+
60+
const stub = sinon.stub(UserMapper, 'find', function (id) {
61+
return utils.resolve({ id })
62+
})
63+
64+
app.use('/', queryParser)
65+
JSDataExpress.mount(app, store)
66+
67+
request(app)
68+
.get('/user/abcd')
69+
.query(jsdataOpts)
70+
.end(function (err, response) {
71+
if (err) {
72+
return done(err)
73+
}
74+
assert.equal(stub.calledOnce, true)
75+
assert.equal(stub.firstCall.args[0], 'abcd')
76+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
77+
assert.deepEqual(response.body, { id: 'abcd' })
78+
done()
79+
})
80+
})
81+
82+
it('should handle POST /:resource with a single resource', function (done) {
83+
const app = express()
84+
const store = new Container()
85+
const UserMapper = store.defineMapper('user')
86+
87+
const jsdataOpts = {
88+
with: {
89+
foo: 'bar'
90+
}
91+
}
92+
93+
const user = { id: 'abcd' }
94+
const stub = sinon.stub(UserMapper, 'create', function (user) {
95+
return utils.resolve(user)
96+
})
97+
98+
app.use('/', queryParser)
99+
JSDataExpress.mount(app, store)
100+
101+
request(app)
102+
.post('/user')
103+
.query(jsdataOpts)
104+
.send(user)
105+
.end(function (err, response) {
106+
if (err) {
107+
return done(err)
108+
}
109+
assert.equal(stub.calledOnce, true)
110+
assert.deepEqual(stub.firstCall.args[0], user)
111+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
112+
assert.deepEqual(response.body, user)
113+
done()
114+
})
115+
})
116+
117+
it('should handle POST /:resource with an array of resources', function (done) {
118+
const app = express()
119+
const store = new Container()
120+
const UserMapper = store.defineMapper('user')
121+
122+
const jsdataOpts = {
123+
with: {
124+
foo: 'bar'
125+
}
126+
}
127+
128+
const users = [{ id: 'abcd' }, {id: '1234'}]
129+
const stub = sinon.stub(UserMapper, 'createMany', function (users) {
130+
return utils.resolve(users)
131+
})
132+
133+
app.use('/', queryParser)
134+
JSDataExpress.mount(app, store)
135+
136+
request(app)
137+
.post('/user')
138+
.query(jsdataOpts)
139+
.send(users)
140+
.end(function (err, response) {
141+
if (err) {
142+
return done(err)
143+
}
144+
assert.equal(stub.calledOnce, true)
145+
assert.deepEqual(stub.firstCall.args[0], users)
146+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
147+
assert.deepEqual(response.body, users)
148+
done()
149+
})
150+
})
151+
152+
it('should handle PUT /:resource with a single resource', function (done) {
153+
const app = express()
154+
const store = new Container()
155+
const UserMapper = store.defineMapper('user')
156+
157+
const jsdataOpts = {
158+
with: {
159+
foo: 'bar'
160+
}
161+
}
162+
const params = { abc: '123' }
163+
const query = Object.assign({}, params, jsdataOpts)
164+
165+
const user = { id: 'abcd' }
166+
const stub = sinon.stub(UserMapper, 'updateAll', function (user) {
167+
return utils.resolve(user)
168+
})
169+
170+
app.use('/', queryParser)
171+
172+
JSDataExpress.mount(app, store)
173+
174+
request(app)
175+
.put('/user')
176+
.query(query)
177+
.send(user)
178+
.end(function (err, response) {
179+
if (err) {
180+
return done(err)
181+
}
182+
assert.equal(stub.calledOnce, true)
183+
assert.deepEqual(stub.firstCall.args[0], user)
184+
assert.deepEqual(stub.firstCall.args[1], params)
185+
assert.deepEqual(stub.firstCall.args[2], jsdataOpts)
186+
assert.deepEqual(response.body, user)
187+
done()
188+
})
189+
})
190+
191+
it('should handle PUT /:resource with an array of resources', function (done) {
192+
const app = express()
193+
const store = new Container()
194+
const UserMapper = store.defineMapper('user')
195+
196+
app.use('/', queryParser)
197+
const jsdataOpts = {
198+
with: {
199+
foo: 'bar'
200+
}
201+
}
202+
203+
const users = [{ id: 'abc' }, { id: '123' }]
204+
const stub = sinon.stub(UserMapper, 'updateMany', function (users) {
205+
return utils.resolve(users)
206+
})
207+
208+
JSDataExpress.mount(app, store)
209+
210+
request(app)
211+
.put('/user')
212+
.query(jsdataOpts)
213+
.send(users)
214+
.end(function (err, response) {
215+
if (err) {
216+
return done(err)
217+
}
218+
assert.equal(stub.calledOnce, true)
219+
assert.deepEqual(stub.firstCall.args[0], users)
220+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
221+
assert.deepEqual(response.body, users)
222+
done()
223+
})
224+
})
225+
226+
it('should handle PUT /:resource/:id', function (done) {
227+
const app = express()
228+
const store = new Container()
229+
const UserMapper = store.defineMapper('user')
230+
231+
app.use('/', queryParser)
232+
const jsdataOpts = {
233+
with: {
234+
foo: 'bar'
235+
}
236+
}
237+
238+
const user = { id: 'abcd' }
239+
const stub = sinon.stub(UserMapper, 'update', function (id) {
240+
return utils.resolve(user)
241+
})
242+
243+
JSDataExpress.mount(app, store)
244+
245+
request(app)
246+
.put('/user/abcd')
247+
.query(jsdataOpts)
248+
.send(user)
249+
.end(function (err, response) {
250+
if (err) {
251+
return done(err)
252+
}
253+
assert.equal(stub.calledOnce, true)
254+
assert.deepEqual(stub.firstCall.args[0], 'abcd')
255+
assert.deepEqual(stub.firstCall.args[1], user)
256+
assert.deepEqual(stub.firstCall.args[2], jsdataOpts)
257+
assert.deepEqual(response.body, user)
258+
done()
259+
})
260+
})
261+
262+
it('should handle DELETE /:resource', function (done) {
263+
const app = express()
264+
const store = new Container()
265+
const UserMapper = store.defineMapper('user')
266+
267+
app.use('/', queryParser)
268+
const jsdataOpts = {
269+
with: {
270+
foo: 'bar'
271+
}
272+
}
273+
const params = {
274+
abc: '123'
275+
}
276+
const query = Object.assign({}, params, jsdataOpts)
277+
278+
const user = { id: 'abcd' }
279+
const stub = sinon.stub(UserMapper, 'destroyAll', function (id) {
280+
return utils.resolve(user)
281+
})
282+
283+
JSDataExpress.mount(app, store)
284+
285+
request(app)
286+
.delete('/user')
287+
.query(query)
288+
.send(user)
289+
.end(function (err, response) {
290+
if (err) {
291+
return done(err)
292+
}
293+
assert.equal(stub.calledOnce, true)
294+
assert.deepEqual(stub.firstCall.args[0], params)
295+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
296+
assert.deepEqual(response.body, user)
297+
done()
298+
})
299+
})
300+
301+
it('should handle DELETE /:resource/:id', function (done) {
302+
const app = express()
303+
const store = new Container()
304+
const UserMapper = store.defineMapper('user')
305+
306+
app.use('/', queryParser)
307+
const jsdataOpts = {
308+
with: {
309+
foo: 'bar'
310+
}
311+
}
312+
313+
const user = { id: 'abcd' }
314+
const stub = sinon.stub(UserMapper, 'destroy', function (id) {
315+
return utils.resolve(user)
316+
})
317+
318+
JSDataExpress.mount(app, store)
319+
320+
request(app)
321+
.delete('/user/abcd')
322+
.query(jsdataOpts)
323+
.send(user)
324+
.end(function (err, response) {
325+
if (err) {
326+
return done(err)
327+
}
328+
assert.equal(stub.calledOnce, true)
329+
assert.deepEqual(stub.firstCall.args[0], 'abcd')
330+
assert.deepEqual(stub.firstCall.args[1], jsdataOpts)
331+
assert.deepEqual(response.body, user)
332+
done()
333+
})
334+
})
335+
336+
it('should mount a Router to each mapper within a container', function (done) {
337+
const app = express()
338+
const store = new Container()
339+
const UserMapper = store.defineMapper('user')
340+
const TodoMapper = store.defineMapper('todo')
341+
const userStub = sinon.stub(UserMapper, 'findAll', function () {
342+
return utils.resolve({})
343+
})
344+
const todoStub = sinon.stub(TodoMapper, 'findAll', function () {
345+
return utils.resolve({})
346+
})
347+
JSDataExpress.mount(app, store)
348+
349+
request(app)
350+
.get('/user')
351+
.end(function (err, response) {
352+
if (err) {
353+
return done(err)
354+
}
355+
assert.equal(userStub.calledOnce, true)
356+
357+
request(app)
358+
.get('/todo')
359+
.end(function (err, response) {
360+
if (err) {
361+
return done(err)
362+
}
363+
assert.equal(todoStub.calledOnce, true)
364+
done()
365+
})
366+
})
367+
})
368+
})

test/_setup.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import * as JSDataExpress from '../src/index'
22
import * as JSData from 'js-data'
3+
import {queryParser} from '../src/queryParser'
34
import {assert} from 'chai'
45
import sinon from 'sinon'
56

67
export {
78
JSDataExpress,
89
JSData,
10+
queryParser,
911
assert,
1012
sinon
1113
}

test/mount.test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,9 @@ describe('mount', function () {
8585
done()
8686
})
8787
})
88+
89+
it('returns an error when the store is not an instance of Container', function () {
90+
const app = express()
91+
assert.throws(() => JSDataExpress.mount(app, {}, '/api'), Error)
92+
})
8893
})

0 commit comments

Comments
 (0)