@defra/forms-engine-plugin 3.0.9 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.server/server/plugins/engine/plugin.js +3 -2
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.d.ts +2 -2
- package/.server/server/plugins/engine/routes/index.js +10 -8
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/routes/questions.d.ts +4 -4
- package/.server/server/plugins/engine/routes/questions.js +10 -10
- package/.server/server/plugins/engine/routes/questions.js.map +1 -1
- package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -1
- package/.server/server/plugins/engine/routes/repeaters/item-delete.js +31 -27
- package/.server/server/plugins/engine/routes/repeaters/item-delete.js.map +1 -1
- package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -1
- package/.server/server/plugins/engine/routes/repeaters/summary.js +31 -27
- package/.server/server/plugins/engine/routes/repeaters/summary.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +3 -3
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/routes/types.d.ts +1 -1
- package/.server/server/routes/types.js.map +1 -1
- package/package.json +1 -1
- package/src/server/plugins/engine/helpers.test.ts +2 -1
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +2 -1
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +8 -4
- package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +2 -1
- package/src/server/plugins/engine/plugin.ts +10 -4
- package/src/server/plugins/engine/routes/index.test.ts +316 -0
- package/src/server/plugins/engine/routes/index.ts +11 -6
- package/src/server/plugins/engine/routes/questions.test.ts +126 -15
- package/src/server/plugins/engine/routes/questions.ts +71 -57
- package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +83 -0
- package/src/server/plugins/engine/routes/repeaters/item-delete.ts +39 -33
- package/src/server/plugins/engine/routes/repeaters/summary.test.ts +75 -0
- package/src/server/plugins/engine/routes/repeaters/summary.ts +28 -22
- package/src/server/plugins/engine/types.ts +6 -7
- package/src/server/routes/types.ts +4 -1
|
@@ -40,8 +40,14 @@ jest.mock('~/src/server/plugins/engine/routes/index')
|
|
|
40
40
|
|
|
41
41
|
describe('makeGetHandler', () => {
|
|
42
42
|
const hMock: FormResponseToolkit = {
|
|
43
|
-
redirect: jest.fn()
|
|
44
|
-
|
|
43
|
+
redirect: jest.fn().mockReturnValue({
|
|
44
|
+
takeover: jest.fn().mockReturnValue({
|
|
45
|
+
statusCode: 302,
|
|
46
|
+
headers: { location: '/redirect-url' }
|
|
47
|
+
})
|
|
48
|
+
}),
|
|
49
|
+
view: jest.fn(),
|
|
50
|
+
continue: Symbol('continue')
|
|
45
51
|
}
|
|
46
52
|
|
|
47
53
|
beforeEach(() => {
|
|
@@ -84,8 +90,9 @@ describe('makeGetHandler', () => {
|
|
|
84
90
|
|
|
85
91
|
jest
|
|
86
92
|
.mocked(redirectOrMakeHandler)
|
|
87
|
-
.mockImplementation(
|
|
88
|
-
|
|
93
|
+
.mockImplementation(
|
|
94
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
|
|
95
|
+
Promise.resolve(fn(pageMock, contextMock))
|
|
89
96
|
)
|
|
90
97
|
|
|
91
98
|
await makeGetHandler()(requestMock, hMock)
|
|
@@ -126,8 +133,9 @@ describe('makeGetHandler', () => {
|
|
|
126
133
|
|
|
127
134
|
jest
|
|
128
135
|
.mocked(redirectOrMakeHandler)
|
|
129
|
-
.mockImplementation(
|
|
130
|
-
|
|
136
|
+
.mockImplementation(
|
|
137
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
|
|
138
|
+
Promise.resolve(fn(pageMock, contextMock))
|
|
131
139
|
)
|
|
132
140
|
|
|
133
141
|
await makeGetHandler()(requestMock, hMock)
|
|
@@ -164,7 +172,12 @@ describe('makeGetHandler', () => {
|
|
|
164
172
|
jest
|
|
165
173
|
.mocked(redirectOrMakeHandler)
|
|
166
174
|
.mockImplementation(
|
|
167
|
-
async (
|
|
175
|
+
async (
|
|
176
|
+
_req: AnyFormRequest,
|
|
177
|
+
_h: FormResponseToolkit,
|
|
178
|
+
_onRequest,
|
|
179
|
+
fn
|
|
180
|
+
) => {
|
|
168
181
|
try {
|
|
169
182
|
await fn(pageMock, contextMock)
|
|
170
183
|
} catch (err) {
|
|
@@ -179,12 +192,57 @@ describe('makeGetHandler', () => {
|
|
|
179
192
|
|
|
180
193
|
expect(error).toEqual(Boom.notFound('No model found for /some-path'))
|
|
181
194
|
})
|
|
195
|
+
|
|
196
|
+
it('should pass onRequest callback to redirectOrMakeHandler', async () => {
|
|
197
|
+
const onRequestCallback = jest.fn().mockResolvedValue(undefined)
|
|
198
|
+
const modelMock = {
|
|
199
|
+
basePath: 'some-base-path',
|
|
200
|
+
def: { name: 'Hello world' }
|
|
201
|
+
} as FormModel
|
|
202
|
+
|
|
203
|
+
const pageMock = createMockPageController(
|
|
204
|
+
modelMock,
|
|
205
|
+
(
|
|
206
|
+
_request: FormRequest,
|
|
207
|
+
_context: FormContext,
|
|
208
|
+
_h: FormResponseToolkit
|
|
209
|
+
) => {
|
|
210
|
+
return Promise.resolve({} as unknown as ResponseObject)
|
|
211
|
+
}
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
const contextMock = { data: {}, model: {} } as unknown as FormContext
|
|
215
|
+
|
|
216
|
+
const requestMock = {
|
|
217
|
+
params: { path: 'some-path' },
|
|
218
|
+
app: { model: modelMock }
|
|
219
|
+
} as FormRequest
|
|
220
|
+
|
|
221
|
+
jest
|
|
222
|
+
.mocked(redirectOrMakeHandler)
|
|
223
|
+
.mockImplementation(
|
|
224
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, onRequest, fn) => {
|
|
225
|
+
expect(onRequest).toBe(onRequestCallback)
|
|
226
|
+
return Promise.resolve(fn(pageMock, contextMock))
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
await makeGetHandler(undefined, onRequestCallback)(requestMock, hMock)
|
|
231
|
+
|
|
232
|
+
expect(redirectOrMakeHandler).toHaveBeenCalledWith(
|
|
233
|
+
requestMock,
|
|
234
|
+
hMock,
|
|
235
|
+
onRequestCallback,
|
|
236
|
+
expect.any(Function)
|
|
237
|
+
)
|
|
238
|
+
})
|
|
182
239
|
})
|
|
183
240
|
|
|
184
241
|
describe('makePostHandler', () => {
|
|
185
242
|
const hMock: FormResponseToolkit = {
|
|
186
243
|
redirect: jest.fn(),
|
|
187
|
-
view: jest.fn()
|
|
244
|
+
view: jest.fn(),
|
|
245
|
+
continue: Symbol('continue')
|
|
188
246
|
}
|
|
189
247
|
|
|
190
248
|
beforeEach(() => {
|
|
@@ -230,8 +288,9 @@ describe('makePostHandler', () => {
|
|
|
230
288
|
|
|
231
289
|
jest
|
|
232
290
|
.mocked(redirectOrMakeHandler)
|
|
233
|
-
.mockImplementation(
|
|
234
|
-
|
|
291
|
+
.mockImplementation(
|
|
292
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
|
|
293
|
+
Promise.resolve(fn(pageMock, contextMock))
|
|
235
294
|
)
|
|
236
295
|
|
|
237
296
|
const response = await makePostHandler()(requestMock, hMock)
|
|
@@ -269,8 +328,9 @@ describe('makePostHandler', () => {
|
|
|
269
328
|
|
|
270
329
|
jest
|
|
271
330
|
.mocked(redirectOrMakeHandler)
|
|
272
|
-
.mockImplementation(
|
|
273
|
-
|
|
331
|
+
.mockImplementation(
|
|
332
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
|
|
333
|
+
Promise.resolve(fn(pageMock, contextMock))
|
|
274
334
|
)
|
|
275
335
|
|
|
276
336
|
await makePostHandler()(requestMock, hMock)
|
|
@@ -310,8 +370,9 @@ describe('makePostHandler', () => {
|
|
|
310
370
|
|
|
311
371
|
jest
|
|
312
372
|
.mocked(redirectOrMakeHandler)
|
|
313
|
-
.mockImplementation(
|
|
314
|
-
|
|
373
|
+
.mockImplementation(
|
|
374
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
|
|
375
|
+
Promise.resolve(fn(pageMock, contextMock))
|
|
315
376
|
)
|
|
316
377
|
|
|
317
378
|
await makePostHandler()(requestMock, hMock)
|
|
@@ -349,7 +410,12 @@ describe('makePostHandler', () => {
|
|
|
349
410
|
jest
|
|
350
411
|
.mocked(redirectOrMakeHandler)
|
|
351
412
|
.mockImplementation(
|
|
352
|
-
async (
|
|
413
|
+
async (
|
|
414
|
+
_req: AnyFormRequest,
|
|
415
|
+
_h: FormResponseToolkit,
|
|
416
|
+
_onRequest,
|
|
417
|
+
fn
|
|
418
|
+
) => {
|
|
353
419
|
try {
|
|
354
420
|
await fn(pageMock, contextMock)
|
|
355
421
|
} catch (err) {
|
|
@@ -364,6 +430,51 @@ describe('makePostHandler', () => {
|
|
|
364
430
|
|
|
365
431
|
expect(error).toEqual(Boom.notFound('No model found for /some-path'))
|
|
366
432
|
})
|
|
433
|
+
|
|
434
|
+
it('should pass onRequest callback to redirectOrMakeHandler', async () => {
|
|
435
|
+
const onRequestCallback = jest.fn().mockResolvedValue(undefined)
|
|
436
|
+
const modelMock = {
|
|
437
|
+
basePath: 'some-base-path',
|
|
438
|
+
def: { name: 'Hello world' }
|
|
439
|
+
} as FormModel
|
|
440
|
+
|
|
441
|
+
const pageMock = createMockPageController(
|
|
442
|
+
modelMock,
|
|
443
|
+
(
|
|
444
|
+
_request: FormRequest,
|
|
445
|
+
_context: FormContext,
|
|
446
|
+
_h: FormResponseToolkit
|
|
447
|
+
) => {
|
|
448
|
+
return Promise.resolve({} as unknown as ResponseObject)
|
|
449
|
+
}
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
const contextMock = { data: {}, model: {} } as unknown as FormContext
|
|
453
|
+
|
|
454
|
+
const requestMock = {
|
|
455
|
+
params: { path: 'some-path' },
|
|
456
|
+
app: { model: modelMock },
|
|
457
|
+
payload: { some: 'payload' }
|
|
458
|
+
} as unknown as FormRequestPayload
|
|
459
|
+
|
|
460
|
+
jest
|
|
461
|
+
.mocked(redirectOrMakeHandler)
|
|
462
|
+
.mockImplementation(
|
|
463
|
+
(_req: AnyFormRequest, _h: FormResponseToolkit, onRequest, fn) => {
|
|
464
|
+
expect(onRequest).toBe(onRequestCallback)
|
|
465
|
+
return Promise.resolve(fn(pageMock, contextMock))
|
|
466
|
+
}
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
await makePostHandler(undefined, onRequestCallback)(requestMock, hMock)
|
|
470
|
+
|
|
471
|
+
expect(redirectOrMakeHandler).toHaveBeenCalledWith(
|
|
472
|
+
requestMock,
|
|
473
|
+
hMock,
|
|
474
|
+
onRequestCallback,
|
|
475
|
+
expect.any(Function)
|
|
476
|
+
)
|
|
477
|
+
})
|
|
367
478
|
})
|
|
368
479
|
|
|
369
480
|
function createMockPageController(
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
import {
|
|
27
27
|
type AnyFormRequest,
|
|
28
28
|
type FormContext,
|
|
29
|
+
type OnRequestCallback,
|
|
29
30
|
type PreparePageEventRequestOptions
|
|
30
31
|
} from '~/src/server/plugins/engine/types.js'
|
|
31
32
|
import {
|
|
@@ -74,7 +75,8 @@ async function handleHttpEvent(
|
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
export function makeGetHandler(
|
|
77
|
-
preparePageEventRequestOptions?: PreparePageEventRequestOptions
|
|
78
|
+
preparePageEventRequestOptions?: PreparePageEventRequestOptions,
|
|
79
|
+
onRequest?: OnRequestCallback
|
|
78
80
|
) {
|
|
79
81
|
return function getHandler(request: FormRequest, h: FormResponseToolkit) {
|
|
80
82
|
const { params } = request
|
|
@@ -83,34 +85,40 @@ export function makeGetHandler(
|
|
|
83
85
|
return dispatchHandler(request, h)
|
|
84
86
|
}
|
|
85
87
|
|
|
86
|
-
return redirectOrMakeHandler(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
return redirectOrMakeHandler(
|
|
89
|
+
request,
|
|
90
|
+
h,
|
|
91
|
+
onRequest,
|
|
92
|
+
async (page, context) => {
|
|
93
|
+
// Check for a page onLoad HTTP event and if one exists,
|
|
94
|
+
// call it and assign the response to the context data
|
|
95
|
+
const { events } = page
|
|
96
|
+
const { model } = request.app
|
|
91
97
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
if (!model) {
|
|
99
|
+
throw Boom.notFound(`No model found for /${params.path}`)
|
|
100
|
+
}
|
|
95
101
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
if (events?.onLoad && events.onLoad.type === 'http') {
|
|
103
|
+
await handleHttpEvent(
|
|
104
|
+
request,
|
|
105
|
+
page,
|
|
106
|
+
context,
|
|
107
|
+
events.onLoad,
|
|
108
|
+
model,
|
|
109
|
+
preparePageEventRequestOptions
|
|
110
|
+
)
|
|
111
|
+
}
|
|
106
112
|
|
|
107
|
-
|
|
108
|
-
|
|
113
|
+
return page.makeGetRouteHandler()(request, context, h)
|
|
114
|
+
}
|
|
115
|
+
)
|
|
109
116
|
}
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
export function makePostHandler(
|
|
113
|
-
preparePageEventRequestOptions?: PreparePageEventRequestOptions
|
|
120
|
+
preparePageEventRequestOptions?: PreparePageEventRequestOptions,
|
|
121
|
+
onRequest?: OnRequestCallback
|
|
114
122
|
) {
|
|
115
123
|
return function postHandler(
|
|
116
124
|
request: FormRequestPayload,
|
|
@@ -118,40 +126,45 @@ export function makePostHandler(
|
|
|
118
126
|
) {
|
|
119
127
|
const { query } = request
|
|
120
128
|
|
|
121
|
-
return redirectOrMakeHandler(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
129
|
+
return redirectOrMakeHandler(
|
|
130
|
+
request,
|
|
131
|
+
h,
|
|
132
|
+
onRequest,
|
|
133
|
+
async (page, context) => {
|
|
134
|
+
const { pageDef } = page
|
|
135
|
+
const { isForceAccess } = context
|
|
136
|
+
const { model } = request.app
|
|
137
|
+
const { events } = page
|
|
126
138
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
139
|
+
// Redirect to GET for preview URL direct access
|
|
140
|
+
if (isForceAccess && !hasFormComponents(pageDef)) {
|
|
141
|
+
return proceed(request, h, redirectPath(page.href, query))
|
|
142
|
+
}
|
|
131
143
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
144
|
+
if (!model) {
|
|
145
|
+
throw Boom.notFound(`No model found for /${request.params.path}`)
|
|
146
|
+
}
|
|
135
147
|
|
|
136
|
-
|
|
148
|
+
const response = await page.makePostRouteHandler()(request, context, h)
|
|
137
149
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
if (
|
|
151
|
+
events?.onSave &&
|
|
152
|
+
events.onSave.type === 'http' &&
|
|
153
|
+
isSuccessful(response)
|
|
154
|
+
) {
|
|
155
|
+
await handleHttpEvent(
|
|
156
|
+
request,
|
|
157
|
+
page,
|
|
158
|
+
context,
|
|
159
|
+
events.onSave,
|
|
160
|
+
model,
|
|
161
|
+
preparePageEventRequestOptions
|
|
162
|
+
)
|
|
163
|
+
}
|
|
152
164
|
|
|
153
|
-
|
|
154
|
-
|
|
165
|
+
return response
|
|
166
|
+
}
|
|
167
|
+
)
|
|
155
168
|
}
|
|
156
169
|
}
|
|
157
170
|
|
|
@@ -164,13 +177,14 @@ function isSuccessful(response: ResponseObject): boolean {
|
|
|
164
177
|
export function getRoutes(
|
|
165
178
|
getRouteOptions: RouteOptions<FormRequestRefs>,
|
|
166
179
|
postRouteOptions: RouteOptions<FormRequestPayloadRefs>,
|
|
167
|
-
preparePageEventRequestOptions?: PreparePageEventRequestOptions
|
|
180
|
+
preparePageEventRequestOptions?: PreparePageEventRequestOptions,
|
|
181
|
+
onRequest?: OnRequestCallback
|
|
168
182
|
): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {
|
|
169
183
|
return [
|
|
170
184
|
{
|
|
171
185
|
method: 'get',
|
|
172
186
|
path: '/{slug}',
|
|
173
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
187
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
174
188
|
options: {
|
|
175
189
|
...getRouteOptions,
|
|
176
190
|
validate: {
|
|
@@ -197,7 +211,7 @@ export function getRoutes(
|
|
|
197
211
|
{
|
|
198
212
|
method: 'get',
|
|
199
213
|
path: '/{slug}/{path}/{itemId?}',
|
|
200
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
214
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
201
215
|
options: {
|
|
202
216
|
...getRouteOptions,
|
|
203
217
|
validate: {
|
|
@@ -212,7 +226,7 @@ export function getRoutes(
|
|
|
212
226
|
{
|
|
213
227
|
method: 'get',
|
|
214
228
|
path: '/preview/{state}/{slug}/{path}/{itemId?}',
|
|
215
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
229
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
216
230
|
options: {
|
|
217
231
|
...getRouteOptions,
|
|
218
232
|
validate: {
|
|
@@ -228,7 +242,7 @@ export function getRoutes(
|
|
|
228
242
|
{
|
|
229
243
|
method: 'post',
|
|
230
244
|
path: '/{slug}/{path}/{itemId?}',
|
|
231
|
-
handler: makePostHandler(preparePageEventRequestOptions),
|
|
245
|
+
handler: makePostHandler(preparePageEventRequestOptions, onRequest),
|
|
232
246
|
options: {
|
|
233
247
|
...postRouteOptions,
|
|
234
248
|
validate: {
|
|
@@ -250,7 +264,7 @@ export function getRoutes(
|
|
|
250
264
|
{
|
|
251
265
|
method: 'post',
|
|
252
266
|
path: '/preview/{state}/{slug}/{path}/{itemId?}',
|
|
253
|
-
handler: makePostHandler(preparePageEventRequestOptions),
|
|
267
|
+
handler: makePostHandler(preparePageEventRequestOptions, onRequest),
|
|
254
268
|
options: {
|
|
255
269
|
...postRouteOptions,
|
|
256
270
|
validate: {
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { getRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'
|
|
2
|
+
import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'
|
|
3
|
+
|
|
4
|
+
describe('repeater item-delete routes', () => {
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
jest.clearAllMocks()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
describe('route configuration', () => {
|
|
10
|
+
it('should return all expected routes', () => {
|
|
11
|
+
const routes = getRoutes({}, {}, undefined)
|
|
12
|
+
|
|
13
|
+
expect(routes).toHaveLength(4)
|
|
14
|
+
|
|
15
|
+
const expectedPaths = [
|
|
16
|
+
'/{slug}/{path}/{itemId}/confirm-delete',
|
|
17
|
+
'/preview/{state}/{slug}/{path}/{itemId}/confirm-delete'
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
expectedPaths.forEach((path) => {
|
|
21
|
+
const getRoute = routes.find(
|
|
22
|
+
(route) => route.method === 'get' && route.path === path
|
|
23
|
+
)
|
|
24
|
+
const postRoute = routes.find(
|
|
25
|
+
(route) => route.method === 'post' && route.path === path
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
expect(getRoute).toBeDefined()
|
|
29
|
+
expect(postRoute).toBeDefined()
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should pass onRequest callback to handlers', () => {
|
|
34
|
+
const onRequestCallback: OnRequestCallback = jest
|
|
35
|
+
.fn()
|
|
36
|
+
.mockResolvedValue(undefined)
|
|
37
|
+
const routes = getRoutes({}, {}, onRequestCallback)
|
|
38
|
+
|
|
39
|
+
// Test that the handlers are created with the onRequest callback
|
|
40
|
+
const getRoute = routes.find(
|
|
41
|
+
(route) =>
|
|
42
|
+
route.method === 'get' &&
|
|
43
|
+
route.path === '/{slug}/{path}/{itemId}/confirm-delete'
|
|
44
|
+
)
|
|
45
|
+
const postRoute = routes.find(
|
|
46
|
+
(route) =>
|
|
47
|
+
route.method === 'post' &&
|
|
48
|
+
route.path === '/{slug}/{path}/{itemId}/confirm-delete'
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
expect(getRoute?.handler).toBeDefined()
|
|
52
|
+
expect(postRoute?.handler).toBeDefined()
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
describe('handler functionality', () => {
|
|
57
|
+
it('should create handlers that accept onRequest callback', () => {
|
|
58
|
+
const onRequestCallback: OnRequestCallback = jest
|
|
59
|
+
.fn()
|
|
60
|
+
.mockResolvedValue(undefined)
|
|
61
|
+
const routes = getRoutes({}, {}, onRequestCallback)
|
|
62
|
+
|
|
63
|
+
// Test that the handlers are created with the onRequest callback
|
|
64
|
+
const getRoute = routes.find(
|
|
65
|
+
(route) =>
|
|
66
|
+
route.method === 'get' &&
|
|
67
|
+
route.path === '/{slug}/{path}/{itemId}/confirm-delete'
|
|
68
|
+
)
|
|
69
|
+
const postRoute = routes.find(
|
|
70
|
+
(route) =>
|
|
71
|
+
route.method === 'post' &&
|
|
72
|
+
route.path === '/{slug}/{path}/{itemId}/confirm-delete'
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
expect(getRoute?.handler).toBeDefined()
|
|
76
|
+
expect(postRoute?.handler).toBeDefined()
|
|
77
|
+
|
|
78
|
+
// Test that handlers are functions
|
|
79
|
+
expect(typeof getRoute?.handler).toBe('function')
|
|
80
|
+
expect(typeof postRoute?.handler).toBe('function')
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
})
|
|
@@ -6,6 +6,7 @@ import Joi from 'joi'
|
|
|
6
6
|
import { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'
|
|
7
7
|
import { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
|
|
8
8
|
import { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'
|
|
9
|
+
import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'
|
|
9
10
|
import {
|
|
10
11
|
type FormRequest,
|
|
11
12
|
type FormRequestPayload,
|
|
@@ -23,52 +24,57 @@ import {
|
|
|
23
24
|
} from '~/src/server/schemas/index.js'
|
|
24
25
|
|
|
25
26
|
// Item delete GET route
|
|
26
|
-
function getHandler(
|
|
27
|
-
|
|
27
|
+
function getHandler(onRequest?: OnRequestCallback) {
|
|
28
|
+
return async function (request: FormRequest, h: FormResponseToolkit) {
|
|
29
|
+
const { params } = request
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
32
|
+
if (
|
|
33
|
+
!(
|
|
34
|
+
page instanceof RepeatPageController ||
|
|
35
|
+
page instanceof FileUploadPageController
|
|
36
|
+
)
|
|
37
|
+
) {
|
|
38
|
+
throw Boom.notFound(`No page found for /${params.path}`)
|
|
39
|
+
}
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
return page.makeGetItemDeleteRouteHandler()(request, context, h)
|
|
42
|
+
})
|
|
43
|
+
}
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
function postHandler(
|
|
44
|
-
|
|
46
|
+
function postHandler(onRequest?: OnRequestCallback) {
|
|
47
|
+
return async function (request: FormRequestPayload, h: FormResponseToolkit) {
|
|
48
|
+
const { params } = request
|
|
45
49
|
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
51
|
+
const { isForceAccess } = context
|
|
48
52
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
if (
|
|
54
|
+
isForceAccess ||
|
|
55
|
+
!(
|
|
56
|
+
page instanceof RepeatPageController ||
|
|
57
|
+
page instanceof FileUploadPageController
|
|
58
|
+
)
|
|
59
|
+
) {
|
|
60
|
+
throw Boom.notFound(`No page found for /${params.path}`)
|
|
61
|
+
}
|
|
58
62
|
|
|
59
|
-
|
|
60
|
-
|
|
63
|
+
return page.makePostItemDeleteRouteHandler()(request, context, h)
|
|
64
|
+
})
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
export function getRoutes(
|
|
64
69
|
getRouteOptions: RouteOptions<FormRequestRefs>,
|
|
65
|
-
postRouteOptions: RouteOptions<FormRequestPayloadRefs
|
|
70
|
+
postRouteOptions: RouteOptions<FormRequestPayloadRefs>,
|
|
71
|
+
onRequest?: OnRequestCallback
|
|
66
72
|
): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {
|
|
67
73
|
return [
|
|
68
74
|
{
|
|
69
75
|
method: 'get',
|
|
70
76
|
path: '/{slug}/{path}/{itemId}/confirm-delete',
|
|
71
|
-
handler: getHandler,
|
|
77
|
+
handler: getHandler(onRequest),
|
|
72
78
|
options: {
|
|
73
79
|
...getRouteOptions,
|
|
74
80
|
validate: {
|
|
@@ -84,7 +90,7 @@ export function getRoutes(
|
|
|
84
90
|
{
|
|
85
91
|
method: 'get',
|
|
86
92
|
path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
|
|
87
|
-
handler: getHandler,
|
|
93
|
+
handler: getHandler(onRequest),
|
|
88
94
|
options: {
|
|
89
95
|
...getRouteOptions,
|
|
90
96
|
validate: {
|
|
@@ -101,7 +107,7 @@ export function getRoutes(
|
|
|
101
107
|
{
|
|
102
108
|
method: 'post',
|
|
103
109
|
path: '/{slug}/{path}/{itemId}/confirm-delete',
|
|
104
|
-
handler: postHandler,
|
|
110
|
+
handler: postHandler(onRequest),
|
|
105
111
|
options: {
|
|
106
112
|
...postRouteOptions,
|
|
107
113
|
validate: {
|
|
@@ -124,7 +130,7 @@ export function getRoutes(
|
|
|
124
130
|
{
|
|
125
131
|
method: 'post',
|
|
126
132
|
path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
|
|
127
|
-
handler: postHandler,
|
|
133
|
+
handler: postHandler(onRequest),
|
|
128
134
|
options: {
|
|
129
135
|
...postRouteOptions,
|
|
130
136
|
validate: {
|