From 0365a91cd62bbdffa9c1b53f23c40f97ea97c384 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Thu, 18 Dec 2025 13:51:07 +0000 Subject: [PATCH 1/3] Allows SaveAndExit to bypass validation --- src/server/plugins/engine/models/FormModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/plugins/engine/models/FormModel.ts b/src/server/plugins/engine/models/FormModel.ts index 42cfcad80..db3c12668 100644 --- a/src/server/plugins/engine/models/FormModel.ts +++ b/src/server/plugins/engine/models/FormModel.ts @@ -561,7 +561,7 @@ function validateFormPayload( if ( !request.payload || (action && - ![FormAction.Validate, FormAction.SaveAndExit].includes(action) && + action !== FormAction.Validate && !action.startsWith(FormAction.External)) ) { return context From a0c7dc8a2d63f5943ad751aa31a1a60bbc3f45cc Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Thu, 18 Dec 2025 13:55:45 +0000 Subject: [PATCH 2/3] Fixed test --- test/form/save-and-exit.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/form/save-and-exit.test.js b/test/form/save-and-exit.test.js index d527249e1..560db299a 100644 --- a/test/form/save-and-exit.test.js +++ b/test/form/save-and-exit.test.js @@ -113,7 +113,7 @@ describe('Save and Exit functionality', () => { expect(response.statusCode).toBe(StatusCodes.SEE_OTHER) }) - it('should prevent invalid form state being persisted', async () => { + it('should allow invalid form state for current page', async () => { const payload = { licenceLength: '', action: 'save-and-exit', @@ -127,7 +127,7 @@ describe('Save and Exit functionality', () => { payload }) - expect(response.statusCode).not.toBe(StatusCodes.MOVED_TEMPORARILY) // we shouldn't be redirected to the next question + expect(response.statusCode).not.toBe(StatusCodes.SEE_OTHER) }) it('should return 404 for non-existent page', async () => { From c790e3a54cca9b47a971a45a614f83ef4a48e419 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Thu, 18 Dec 2025 13:58:28 +0000 Subject: [PATCH 3/3] Fixed test --- src/server/plugins/engine/models/FormModel.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/plugins/engine/models/FormModel.test.ts b/src/server/plugins/engine/models/FormModel.test.ts index cd77cfcec..80bfe8ea4 100644 --- a/src/server/plugins/engine/models/FormModel.test.ts +++ b/src/server/plugins/engine/models/FormModel.test.ts @@ -200,7 +200,7 @@ describe('FormModel', () => { }) describe('getFormContext', () => { - it.each([FormAction.Validate, FormAction.SaveAndExit, undefined])( + it.each([FormAction.Validate, undefined])( 'returns a form context with the correct payload and state when action is %s', (action) => { const formModel = new FormModel(fieldsRequiredDefinition, {