UNPKG

5.76 kBJavaScriptView Raw
1const test = require('ava')
2const _ = require('lodash')
3const errors = require('../src/errors')
4const { setup } = require('./_helpers')
5
6test('return absolute links', async (t) => {
7 const { host, server } = await setup({}, { absolute: true })
8 const { result } = await server.inject('/')
9
10 t.truthy(_.some(result._links, link => _.startsWith(link.href, host)))
11})
12
13test('return relative links', async (t) => {
14 const { host, server } = await setup({}, { absolute: false })
15 const { result } = await server.inject('/')
16
17 t.falsy(_.some(result._links, link => _.startsWith(link.href, host)))
18})
19
20test('throw error if plugin specific options invalid', async (t) => {
21 await t.throws(setup({}, { foo: true }), /Error/)
22})
23
24test('request without query parameters', async (t) => {
25 const { server } = await setup()
26 const { result } = await server.inject('/')
27
28 t.is(result.result.length, 9)
29 t.is(result.total, 9)
30 t.is(result.per_page, 100)
31 t.is(result.page, 1)
32 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last'].sort())
33})
34
35test('request without query parameters | custom param names', async (t) => {
36 const { server } = await setup(null, {
37 absolute: false,
38 paramNames: {
39 perPage: 'pageSize',
40 page: 'currentPage',
41 total: 'totalCount'
42 }
43 })
44
45 const { result } = await server.inject('/')
46
47 t.is(result.result.length, 9)
48 t.is(result.totalCount, 9)
49 t.is(result.pageSize, 100)
50 t.is(result.currentPage, 1)
51 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last'].sort())
52})
53
54test('request with custom "per_page" query parameter | first page', async (t) => {
55 const { server } = await setup(null, {
56 absolute: false,
57 paramNames: {
58 perPage: 'pageSize',
59 page: 'currentPage',
60 total: 'totalCount'
61 }
62 })
63
64 const { result } = await server.inject('/?pageSize=3')
65
66 t.is(result.result.length, 3)
67 t.is(result.totalCount, 9)
68 t.is(result.pageSize, 3)
69 t.is(result.currentPage, 1)
70 t.deepEqual(_.map(result.result, _.partial(_.get, _, '_id')), ['1', '2', '3'])
71 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last', 'next'].sort())
72})
73
74test('request with "per_page" query parameter | first page', async (t) => {
75 const { server } = await setup()
76 const { result } = await server.inject('/?per_page=3')
77
78 t.is(result.result.length, 3)
79 t.is(result.total, 9)
80 t.is(result.per_page, 3)
81 t.is(result.page, 1)
82 t.deepEqual(_.map(result.result, _.partial(_.get, _, '_id')), ['1', '2', '3'])
83 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last', 'next'].sort())
84})
85
86test('request with "page" query parameter | -1', async (t) => {
87 const { server } = await setup()
88 const { result } = await server.inject('/?page=-1')
89
90 t.is(result.statusCode, 400)
91 t.is(result.message, errors.invalidQuery)
92})
93
94test('request with "per_page" query parameter | -1', async (t) => {
95 const { server } = await setup()
96 const { result } = await server.inject('/?per_page=-1')
97
98 t.is(result.statusCode, 400)
99 t.is(result.message, errors.invalidQuery)
100})
101
102test('request with "per_page" query parameter | 1000', async (t) => {
103 const { server } = await setup()
104 const { result } = await server.inject('/?per_page=1000')
105
106 t.is(result.statusCode, 400)
107 t.is(result.message, errors.invalidQuery)
108})
109
110test('request with both query parameters | last page', async (t) => {
111 const { server } = await setup()
112 const { result } = await server.inject('/?page=3&per_page=3')
113
114 t.is(result.result.length, 3)
115 t.is(result.total, 9)
116 t.is(result.per_page, 3)
117 t.is(result.page, 3)
118 t.deepEqual(_.map(result.result, _.partial(_.get, _, '_id')), ['7', '8', '9'])
119 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last', 'prev'].sort())
120})
121
122test('request with both query parameters | not available', async (t) => {
123 const { server } = await setup()
124 const { result } = await server.inject('/?page=4&per_page=3')
125
126 t.is(result.result.length, 0)
127 t.is(result.total, 9)
128 t.is(result.per_page, 3)
129 t.is(result.page, 4)
130 t.deepEqual(_.keys(result._links).sort(), ['self', 'first', 'last'].sort())
131})
132
133test('route have no defined ID', async (t) => {
134 const { server } = await setup()
135 const { result } = await server.inject('/page?page=4&per_page=3')
136
137 t.is(result.statusCode, 400)
138 t.is(result.message, errors.missingId)
139})
140
141test('append all passed query parameters', async (t) => {
142 const { server } = await setup()
143 const { result } = await server.inject('/?page=4&per_page=3&fields=foo')
144
145 t.is(result._links.self.href, `/?page=4&per_page=3&fields=foo`)
146 t.is(result._links.first.href, `/?per_page=3&fields=foo`)
147})
148
149test('append all passed query parameters | custom param names', async (t) => {
150 const { server } = await setup(null, {
151 absolute: false,
152 paramNames: {
153 perPage: 'pageSize',
154 page: 'currentPage',
155 total: 'totalCount'
156 }
157 })
158
159 const { result } = await server.inject('/?currentPage=4&pageSize=3&fields=foo')
160
161 t.is(result._links.self.href, '/?currentPage=4&pageSize=3&fields=foo')
162 t.is(result._links.first.href, '/?pageSize=3&fields=foo')
163})
164
165test('exposed query schema', async (t) => {
166 const { server } = await setup()
167
168 t.deepEqual(_.keys(server.plugins.bissle.scheme).sort(), ['page', 'per_page', 'pluginOptions'])
169 t.truthy(server.plugins.bissle.scheme.page.isJoi)
170})
171
172test('exposed query schema | custom param names', async (t) => {
173 const { server } = await setup(null, {
174 absolute: false,
175 paramNames: {
176 perPage: 'pageSize',
177 page: 'currentPage',
178 total: 'totalCount'
179 }
180 })
181
182 t.deepEqual(_.keys(server.plugins.bissle.scheme).sort(), ['currentPage', 'pageSize', 'pluginOptions'])
183 t.truthy(server.plugins.bissle.scheme.currentPage.isJoi)
184})