UNPKG

4.84 kBJavaScriptView Raw
1// Unit - test the router on its own
2const extend = require('extend');
3const loadware = require('loadware');
4const join = require('server/src/join');
5const { get, error } = require('server/router');
6const RouterError = require('./errors');
7
8const run = require('server/test/run');
9
10const createCtx = ({ url = '/', path = '/', method = 'GET' } = {}) => extend({
11 req: { url, path, method },
12 res: { send: () => {} },
13 options: {}
14});
15
16
17const router = require('.');
18
19
20describe('server/router definition', () => {
21 it('loads the main router', () => {
22 expect(router).toEqual(require('server').router);
23 expect(router).toBe(require('server/router'));
24 });
25
26 it('has the right methods defined', () => {
27 expect(router.get ).toEqual(jasmine.any(Function));
28 expect(router.get ).toEqual(jasmine.any(Function));
29 expect(router.post ).toEqual(jasmine.any(Function));
30 expect(router.put ).toEqual(jasmine.any(Function));
31 expect(router.del ).toEqual(jasmine.any(Function));
32 expect(router.sub ).toEqual(jasmine.any(Function));
33 expect(router.error).toEqual(jasmine.any(Function));
34 });
35
36 it('can load all the methods manually', () => {
37 expect(require('server/router/get' )).toEqual(jasmine.any(Function));
38 expect(require('server/router/get' )).toEqual(jasmine.any(Function));
39 expect(require('server/router/post' )).toEqual(jasmine.any(Function));
40 expect(require('server/router/put' )).toEqual(jasmine.any(Function));
41 expect(require('server/router/del' )).toEqual(jasmine.any(Function));
42 expect(require('server/router/sub' )).toEqual(jasmine.any(Function));
43 expect(require('server/router/error')).toEqual(jasmine.any(Function));
44 });
45});
46
47describe('server/router works', () => {
48 it('works', async () => {
49 const mid = [
50 () => new Promise((resolve) => resolve()),
51 get('/aaa', () => { throw new Error(); }),
52 get('/', () => 'Hello 世界'),
53 get('/sth', () => { throw new Error(); }),
54 get('/', () => { throw new Error(); })
55 ];
56
57 const ctx = createCtx();
58 await join(mid)(ctx);
59 expect(ctx.req.solved).toBe(true);
60 });
61
62 it('works even when wrapped with join() and loadware()', async () => {
63 const middles = [
64 () => new Promise((resolve) => resolve()),
65 get('/aaa', () => { throw new Error(); }),
66 join(loadware(get('/', () => 'Hello 世界'))),
67 get('/sth', () => { throw new Error(); }),
68 get('/', () => { throw new Error(); })
69 ];
70
71 // Returns the promise to be handled async
72 const ctx = createCtx();
73 await join(middles)(ctx);
74 expect(ctx.req.solved).toBe(true);
75 });
76
77
78 it('works with parameters', async () => {
79 const ctx = createCtx({ path: '/test/francisco/presencia/bla' });
80 await get('/test/:name/:lastname/bla')(ctx);
81 expect(ctx.req.solved).toBe(true);
82 expect(ctx.req.params.name).toBe('francisco');
83 expect(ctx.req.params.lastname).toBe('presencia');
84 });
85});
86
87
88
89describe('Error routes', () => {
90 it('can catch errors', async () => {
91 const generate = () => { throw new Error('Should be caught'); };
92 const handle = error(() => 'Error 世界');
93
94 const res = await run([generate, handle]).get('/');
95 expect(res.body).toBe('Error 世界');
96 });
97
98 it('can catch errors with full path', async () => {
99 const generate = ctx => { throw new RouterError('router'); };
100 const handle = error('/server/test/router', ctx => {
101 return ctx.error.code;
102 });
103 const res = await run([generate, handle]).get('/');
104 expect(res.body).toBe('/server/test/router');
105 });
106
107 it('can catch errors with partial path', async () => {
108 const generate = ctx => { throw new RouterError('router'); };
109 const handle = error('/server/test', ctx => {
110 return ctx.error.code;
111 });
112 const res = await run([generate, handle]).get('/');
113 expect(res.body).toBe('/server/test/router');
114 });
115
116 const errors = {
117 'test:pre:1': new Error('Hi there 1'),
118 'test:pre:a': new Error('Hi there a'),
119 'test:pre:b': new Error('Hi there b'),
120 'test:pre:build': opts => new Error(`Hi there ${opts.name}`)
121 };
122
123 it('can generate errors', async () => {
124 const generate = ctx => {
125 throw new RouterError('router');
126 };
127 const handle = error('/server/test/router', ctx => {
128 return ctx.error.code;
129 });
130
131 const res = await run({ errors }, [generate, handle]).get('/');
132 expect(res.body).toBe('/server/test/router');
133 });
134
135 it('can generate errors with options', async () => {
136 const generate = ctx => {
137 throw new RouterError('simplerouter', { text: 'ABC' });
138 };
139 const handle = error('/server/test/simplerouter', ctx => {
140 return ctx.error.message;
141 });
142
143 const res = await run({ errors }, [generate, handle]).get('/');
144 expect(res.body).toBe(`Simple message: ABC`);
145 });
146});