Skip to content
This repository was archived by the owner on Feb 8, 2024. It is now read-only.

Commit ae871e7

Browse files
committed
test(createrest-express): Add real tests with supertest
1 parent 22b9f74 commit ae871e7

2 files changed

Lines changed: 214 additions & 7 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"rules": {
3+
"import/no-extraneous-dependencies": "off",
4+
"no-magic-numbers": "off"
5+
}
6+
}
Lines changed: 208 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,213 @@
11
import test from 'ava'
2+
import express from 'express'
3+
import supertest from 'supertest'
4+
import sinon from 'sinon'
25
import { createRest } from 'createrest'
36
import { createExpressMiddleware } from '../lib'
47

5-
test.todo('Write real async tests')
68

7-
// test('Fake test', t => {
8-
// createRestExpress(createRest(r => {
9-
// r.get(() => {})
10-
// }))
11-
// t.pass()
12-
// })
9+
let port = 4000
10+
11+
function createRawServer(routesFn) {
12+
const app = express()
13+
app.use(createExpressMiddleware(createRest(routesFn)))
14+
return app.listen(port++)
15+
}
16+
17+
const newSpy = () => ({
18+
get: sinon.stub().callsFake((req, res) => res.send({})),
19+
post: sinon.stub().callsFake((req, res) => res.send({})),
20+
patch: sinon.stub().callsFake((req, res) => res.send({})),
21+
put: sinon.stub().callsFake((req, res) => res.send({})),
22+
delete: sinon.stub().callsFake((req, res) => res.send({})),
23+
before: sinon.stub().callsFake((req, res, next) => next()),
24+
before2: sinon.stub().callsFake((req, res, next) => next()),
25+
before3: sinon.stub().callsFake((req, res, next) => next()),
26+
before4: sinon.stub().callsFake((req, res, next) => next()),
27+
after: sinon.stub().callsFake((req, res, next) => next()),
28+
after2: sinon.stub().callsFake((req, res, next) => next()),
29+
after3: sinon.stub().callsFake((req, res, next) => next()),
30+
after4: sinon.stub().callsFake((req, res, next) => next()),
31+
})
32+
33+
34+
test('/ get post put patch delete', async (t) => {
35+
t.plan(5)
36+
37+
const spy = newSpy()
38+
const routes = (root) => {
39+
root.get('/', spy.get)
40+
root.post('/', spy.post)
41+
root.patch('/', spy.patch)
42+
root.put('/', spy.put)
43+
root.delete('/', spy.delete)
44+
}
45+
const server = createRawServer(routes)
46+
47+
await supertest(server).get('/')
48+
t.true(spy.get.calledOnce)
49+
50+
await supertest(server).post('/')
51+
t.true(spy.post.calledOnce)
52+
53+
await supertest(server).patch('/')
54+
t.true(spy.patch.calledOnce)
55+
56+
await supertest(server).put('/')
57+
t.true(spy.put.calledOnce)
58+
59+
await supertest(server).delete('/')
60+
t.true(spy.delete.calledOnce)
61+
})
62+
63+
64+
test('deep path in simple handlers throws', async (t) => {
65+
t.throws(() => {
66+
createRest((root) => {
67+
root.get('/so/deep/path', () => { })
68+
})
69+
})
70+
})
71+
72+
test('throws when passed not routes', async (t) => {
73+
t.throws(() => {
74+
createExpressMiddleware(() => { })
75+
}, TypeError)
76+
77+
t.throws(() => {
78+
createExpressMiddleware({})
79+
}, TypeError)
80+
})
81+
82+
83+
test('deep scopes works', async (t) => {
84+
t.plan(5)
85+
86+
const spy = newSpy()
87+
const routes = (root) => {
88+
root.scope('so', (so) => {
89+
so.scope('deep', (deep) => {
90+
deep.scope('path', (path) => {
91+
path.scope('for-you', (forYou) => {
92+
forYou.get('yea', spy.get)
93+
forYou.post('yea', spy.post)
94+
forYou.patch('yea', spy.patch)
95+
forYou.put('yea', spy.put)
96+
forYou.delete('yea', spy.delete)
97+
})
98+
})
99+
})
100+
})
101+
}
102+
const server = createRawServer(routes)
103+
104+
await supertest(server).get('/so/deep/path/for-you/yea')
105+
t.true(spy.get.calledOnce)
106+
107+
await supertest(server).post('/so/deep/path/for-you/yea')
108+
t.true(spy.post.calledOnce)
109+
110+
await supertest(server).patch('/so/deep/path/for-you/yea')
111+
t.true(spy.patch.calledOnce)
112+
113+
await supertest(server).put('/so/deep/path/for-you/yea')
114+
t.true(spy.put.calledOnce)
115+
116+
await supertest(server).delete('/so/deep/path/for-you/yea')
117+
t.true(spy.delete.calledOnce)
118+
119+
server.close()
120+
})
121+
122+
test('before|after handler on root level', async (t) => {
123+
t.plan(4)
124+
const spy = newSpy()
125+
const routes = (root) => {
126+
root.beforeEach(spy.before)
127+
root.afterEach(spy.after)
128+
root.get('/', spy.get)
129+
}
130+
const server = createRawServer(routes)
131+
132+
await supertest(server).get('/')
133+
134+
t.true(spy.get.calledOnce)
135+
t.true(spy.before.calledBefore(spy.get))
136+
t.true(spy.before.calledBefore(spy.after))
137+
t.true(spy.get.calledBefore(spy.after))
138+
139+
server.close()
140+
})
141+
142+
143+
test('before|after for deep handlers', async (t) => {
144+
t.plan(4)
145+
const spy = newSpy()
146+
const routes = (root) => {
147+
root.beforeEach(spy.before)
148+
root.afterEach(spy.after)
149+
root.scope('foo', (foo) => {
150+
foo.scope('bar', (bar) => {
151+
bar.scope('baz', (baz) => {
152+
baz.get('/', spy.get)
153+
})
154+
})
155+
})
156+
}
157+
const server = createRawServer(routes)
158+
159+
await supertest(server).get('/foo/bar/baz')
160+
161+
t.true(spy.get.calledOnce)
162+
t.true(spy.before.calledBefore(spy.get))
163+
t.true(spy.before.calledBefore(spy.after))
164+
t.true(spy.get.calledBefore(spy.after))
165+
166+
server.close()
167+
})
168+
169+
170+
test('deep before|after for deep handlers', async (t) => {
171+
const spy = newSpy()
172+
const get = sinon.stub().callsFake((req, res, next) => next())
173+
174+
const routes = (root) => {
175+
root.beforeEach(spy.before)
176+
root.afterEach(spy.after)
177+
178+
root.scope('foo', (foo) => {
179+
foo.beforeEach(spy.before2)
180+
foo.afterEach(spy.after2)
181+
182+
foo.scope('bar', (bar) => {
183+
bar.beforeEach(spy.before3)
184+
bar.afterEach(spy.after3)
185+
186+
bar.scope('baz', (baz) => {
187+
baz.beforeEach(spy.before4)
188+
baz.afterEach(spy.after4)
189+
190+
baz.get('/', get)
191+
})
192+
})
193+
})
194+
}
195+
const server = createRawServer(routes)
196+
197+
await supertest(server).get('/foo/bar/baz')
198+
199+
t.true(spy.before.calledBefore(spy.before2))
200+
t.true(spy.before2.calledBefore(spy.before3))
201+
t.true(spy.before3.calledBefore(spy.before4))
202+
203+
t.true(spy.before4.calledBefore(get))
204+
t.true(get.calledOnce)
205+
t.true(spy.after4.calledAfter(get))
206+
207+
t.true(spy.after3.calledAfter(spy.after4))
208+
t.true(spy.after2.calledAfter(spy.after3))
209+
t.true(spy.after.calledAfter(spy.after2))
210+
211+
server.close()
212+
})
213+

0 commit comments

Comments
 (0)