1 |
|
2 | const extend = require('extend');
|
3 | const loadware = require('loadware');
|
4 | const join = require('server/src/join');
|
5 | const { get, error } = require('server/router');
|
6 | const RouterError = require('./errors');
|
7 |
|
8 | const run = require('server/test/run');
|
9 |
|
10 | const createCtx = ({ url = '/', path = '/', method = 'GET' } = {}) => extend({
|
11 | req: { url, path, method },
|
12 | res: { send: () => {} },
|
13 | options: {}
|
14 | });
|
15 |
|
16 |
|
17 | const router = require('.');
|
18 |
|
19 |
|
20 | describe('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 |
|
47 | describe('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 |
|
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 |
|
89 | describe('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 | });
|