From 954741b8451d6084f7d2fa0efdf0d0c26aebe96c Mon Sep 17 00:00:00 2001 From: Pardeep Singh Basi Date: Mon, 16 Mar 2026 18:03:43 +0000 Subject: [PATCH 01/25] feat: added page url tracking for feedback link --- src/main/app.ts | 4 +- src/main/assets/locales/cy/common.json | 2 +- src/main/assets/locales/en/common.json | 2 +- src/main/middleware/index.ts | 1 + src/main/middleware/pageTrackingUrl.ts | 21 +++++++ src/main/modules/i18n/index.ts | 1 - .../modules/steps/formBuilder/formContent.ts | 1 - src/main/views/journeyTemplate.njk | 2 +- src/main/views/stepsTemplate.njk | 2 +- src/main/views/template.njk | 2 +- .../unit/middleware/pageTrackingUrl.test.ts | 60 +++++++++++++++++++ 11 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 src/main/middleware/pageTrackingUrl.ts create mode 100644 src/test/unit/middleware/pageTrackingUrl.test.ts diff --git a/src/main/app.ts b/src/main/app.ts index e06ec72cf..49f366a6e 100644 --- a/src/main/app.ts +++ b/src/main/app.ts @@ -7,7 +7,7 @@ import { glob } from 'glob'; import favicon from 'serve-favicon'; import { setupDev } from './development'; -import { caseReferenceParamMiddleware } from './middleware'; +import { caseReferenceParamMiddleware, pageTrackingUrlMiddleware } from './middleware'; import * as modules from './modules'; import { setupErrorHandlers } from './modules/error-handler'; import { registerAllJourneys } from './routes/registerSteps'; @@ -39,6 +39,8 @@ app.use((req, res, next) => { next(); }); +app.use(pageTrackingUrlMiddleware); + // param middleware for caseReference app.param('caseReference', caseReferenceParamMiddleware); diff --git a/src/main/assets/locales/cy/common.json b/src/main/assets/locales/cy/common.json index 4bf3cf4f6..a55bfb081 100644 --- a/src/main/assets/locales/cy/common.json +++ b/src/main/assets/locales/cy/common.json @@ -1,7 +1,7 @@ { "serviceName": "cyRespond to a property possession claim", "phase": "cyALPHA", - "feedback": "cyThis is a new service – your feedback will help us to improve it.", + "feedback": "cyThis is a new service – your feedback will help us to improve it.", "languageToggle": "English", "logout": "cySign out", "navigationLabel": "cyService navigation", diff --git a/src/main/assets/locales/en/common.json b/src/main/assets/locales/en/common.json index d8cf946f1..b25f83ac1 100644 --- a/src/main/assets/locales/en/common.json +++ b/src/main/assets/locales/en/common.json @@ -1,7 +1,7 @@ { "serviceName": "Respond to a property possession claim", "phase": "ALPHA", - "feedback": "This is a new service – your feedback will help us to improve it.", + "feedback": "cyThis is a new service – your feedback will help us to improve it.", "languageToggle": "Cymraeg", "logout": "Sign out", "navigationLabel": "Service navigation", diff --git a/src/main/middleware/index.ts b/src/main/middleware/index.ts index 4d0884218..d8ed55b3b 100644 --- a/src/main/middleware/index.ts +++ b/src/main/middleware/index.ts @@ -1,2 +1,3 @@ export * from './oidc'; export * from './caseReference'; +export * from './pageTrackingUrl'; diff --git a/src/main/middleware/pageTrackingUrl.ts b/src/main/middleware/pageTrackingUrl.ts new file mode 100644 index 000000000..da1379a8c --- /dev/null +++ b/src/main/middleware/pageTrackingUrl.ts @@ -0,0 +1,21 @@ +import { NextFunction, Request, Response } from 'express'; + +const getPageTrackingUrl = (path: string): string => { + const segments = path.split('/').filter(Boolean); + + if (segments[0] === 'dashboard') { + return 'dashboard'; + } + + if (segments[0] === 'case' && segments.length > 2) { + return `/${segments.slice(2).join('/')}`; + } + + return path; +}; + +export const pageTrackingUrlMiddleware = (req: Request, res: Response, next: NextFunction): void => { + const pageTrackingUrl = getPageTrackingUrl(req.path); + res.locals.pageTrackingUrl = pageTrackingUrl; + next(); +}; diff --git a/src/main/modules/i18n/index.ts b/src/main/modules/i18n/index.ts index bdaaa0230..9a9c8586e 100644 --- a/src/main/modules/i18n/index.ts +++ b/src/main/modules/i18n/index.ts @@ -67,7 +67,6 @@ export type AllowedLang = (typeof allowedLanguages)[number]; export const COMMON_TRANSLATION_KEYS = [ 'serviceName', 'phase', - 'feedback', 'back', 'languageToggle', 'contactUsForHelp', diff --git a/src/main/modules/steps/formBuilder/formContent.ts b/src/main/modules/steps/formBuilder/formContent.ts index 66fde4728..1cf9f28fc 100644 --- a/src/main/modules/steps/formBuilder/formContent.ts +++ b/src/main/modules/steps/formBuilder/formContent.ts @@ -72,7 +72,6 @@ export function buildFormContent( errorSummary, serviceName: t('serviceName'), phase: t('phase'), - feedback: t('feedback'), back: t('back'), contactUsForHelp: t('contactUsForHelp'), contactUsForHelpText: t('contactUsForHelpText'), diff --git a/src/main/views/journeyTemplate.njk b/src/main/views/journeyTemplate.njk index 419b0bced..06c3cdec3 100644 --- a/src/main/views/journeyTemplate.njk +++ b/src/main/views/journeyTemplate.njk @@ -34,7 +34,7 @@
{{ govukPhaseBanner({ tag: { text: t('phase', 'Alpha') }, - html: (t('feedback') | safe) + html: (t('feedback', { pageTrackingUrl: pageTrackingUrl }) | safe) }) }}
diff --git a/src/main/views/stepsTemplate.njk b/src/main/views/stepsTemplate.njk index 5d14122d6..4d8f7db5c 100644 --- a/src/main/views/stepsTemplate.njk +++ b/src/main/views/stepsTemplate.njk @@ -46,7 +46,7 @@ tag: { text: (phase or t('phase') or 'ALPHA') | safe }, - html: ((feedback or t('feedback') or '')) | safe + html: ((feedback or t('feedback', { pageTrackingUrl: pageTrackingUrl }) or '')) | safe }) }} {% if backUrl %} diff --git a/src/main/views/template.njk b/src/main/views/template.njk index 82f1e8202..2bb581d55 100644 --- a/src/main/views/template.njk +++ b/src/main/views/template.njk @@ -47,7 +47,7 @@ tag: { text: (phase or t('phase') or 'ALPHA') | safe }, - html: ((feedback or t('feedback') or '')) | safe + html: ((feedback or t('feedback', { pageTrackingUrl: pageTrackingUrl }) or '')) | safe }) }} {% if backUrl %} diff --git a/src/test/unit/middleware/pageTrackingUrl.test.ts b/src/test/unit/middleware/pageTrackingUrl.test.ts new file mode 100644 index 000000000..0198e1ffa --- /dev/null +++ b/src/test/unit/middleware/pageTrackingUrl.test.ts @@ -0,0 +1,60 @@ +import type { NextFunction, Request, Response } from 'express'; + +import { pageTrackingUrlMiddleware } from '../../../main/middleware/pageTrackingUrl'; + +describe('pageTrackingUrlMiddleware', () => { + let req: Partial; + let res: Partial; + let next: NextFunction; + + beforeEach(() => { + res = { + locals: {}, + }; + next = jest.fn(); + }); + + it('should set dashboard as the tracking URL for dashboard routes', () => { + req = { + path: '/dashboard/active', + }; + + pageTrackingUrlMiddleware(req as Request, res as Response, next); + + expect(res.locals?.pageTrackingUrl).toBe('dashboard'); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('should strip the case id from case routes', () => { + req = { + path: '/case/1234567890123456/respond-to-claim/start-now', + }; + + pageTrackingUrlMiddleware(req as Request, res as Response, next); + + expect(res.locals?.pageTrackingUrl).toBe('/respond-to-claim/start-now'); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('should leave non-dashboard and non-case routes unchanged', () => { + req = { + path: '/contact-us', + }; + + pageTrackingUrlMiddleware(req as Request, res as Response, next); + + expect(res.locals?.pageTrackingUrl).toBe('/contact-us'); + expect(next).toHaveBeenCalledTimes(1); + }); + + it('should leave short case routes unchanged', () => { + req = { + path: '/case/1234567890123456', + }; + + pageTrackingUrlMiddleware(req as Request, res as Response, next); + + expect(res.locals?.pageTrackingUrl).toBe('/case/1234567890123456'); + expect(next).toHaveBeenCalledTimes(1); + }); +}); From 37dc1c773c6f0833a8f99b095f6f823829d1c6ac Mon Sep 17 00:00:00 2001 From: Pardeep Singh Basi Date: Tue, 17 Mar 2026 11:52:09 +0000 Subject: [PATCH 02/25] test: fix failing tests --- src/test/unit/app/controller/controllerFactory.test.ts | 6 ------ src/test/unit/modules/error-handler/index.test.ts | 2 -- src/test/unit/modules/i18n/index.test.ts | 4 ++-- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/test/unit/app/controller/controllerFactory.test.ts b/src/test/unit/app/controller/controllerFactory.test.ts index fa4021cda..30dc5b11e 100644 --- a/src/test/unit/app/controller/controllerFactory.test.ts +++ b/src/test/unit/app/controller/controllerFactory.test.ts @@ -78,7 +78,6 @@ describe('createGetController', () => { const translations: Record = { serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }; @@ -115,7 +114,6 @@ describe('createGetController', () => { backUrl: null, serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }) @@ -127,7 +125,6 @@ describe('createGetController', () => { const translations: Record = { serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }; @@ -163,7 +160,6 @@ describe('createGetController', () => { backUrl: null, serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }) @@ -175,7 +171,6 @@ describe('createGetController', () => { const translations: Record = { serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }; @@ -208,7 +203,6 @@ describe('createGetController', () => { backUrl: null, serviceName: 'Test Service', phase: 'ALPHA', - feedback: 'Feedback text', back: 'Back', languageToggle: 'Language toggle', }) diff --git a/src/test/unit/modules/error-handler/index.test.ts b/src/test/unit/modules/error-handler/index.test.ts index dab370f3c..49a8ab74d 100644 --- a/src/test/unit/modules/error-handler/index.test.ts +++ b/src/test/unit/modules/error-handler/index.test.ts @@ -33,7 +33,6 @@ describe('error-handler', () => { 'errorPages.500.paragraph': 'Please try again in a few minutes.', serviceName: 'Possession claims', phase: 'ALPHA', - feedback: 'Feedback text', languageToggle: 'Language toggle', back: 'Back', }; @@ -337,7 +336,6 @@ describe('error-handler', () => { expect(res.locals.serviceName).toBe('Possession claims'); expect(res.locals.phase).toBe('ALPHA'); - expect(res.locals.feedback).toBe('Feedback text'); expect(res.locals.languageToggle).toBe('Language toggle'); expect(res.locals.back).toBe('Back'); }); diff --git a/src/test/unit/modules/i18n/index.test.ts b/src/test/unit/modules/i18n/index.test.ts index 7b4e90c26..7b6c0fa58 100644 --- a/src/test/unit/modules/i18n/index.test.ts +++ b/src/test/unit/modules/i18n/index.test.ts @@ -264,7 +264,6 @@ describe('i18n module', () => { const translations: Record = { serviceName: 'Test Service', phase: 'BETA', - feedback: 'Feedback', back: 'Back', languageToggle: 'Language', contactUsForHelp: 'Contact', @@ -277,7 +276,8 @@ describe('i18n module', () => { expect(result.serviceName).toBe('Test Service'); expect(result.phase).toBe('BETA'); - expect(result.feedback).toBe('Feedback'); + expect(result.back).toBe('Back'); + expect(result.languageToggle).toBe('Language'); }); it('should exclude keys that return themselves', () => { From 4a7fb864e0c2c6c5efa62c50a25b4a91e1a3ee09 Mon Sep 17 00:00:00 2001 From: Pardeep Singh Basi Date: Tue, 17 Mar 2026 15:59:21 +0000 Subject: [PATCH 03/25] fix: leading slash present, not required as per jira --- src/main/assets/locales/cy/common.json | 2 +- src/main/assets/locales/en/common.json | 2 +- src/main/middleware/pageTrackingUrl.ts | 2 +- src/test/unit/middleware/pageTrackingUrl.test.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/assets/locales/cy/common.json b/src/main/assets/locales/cy/common.json index a55bfb081..cf045b2f7 100644 --- a/src/main/assets/locales/cy/common.json +++ b/src/main/assets/locales/cy/common.json @@ -1,7 +1,7 @@ { "serviceName": "cyRespond to a property possession claim", "phase": "cyALPHA", - "feedback": "cyThis is a new service – your feedback will help us to improve it.", + "feedback": "cyThis is a new service – your feedback (opens in new tab) will help us to improve it.", "languageToggle": "English", "logout": "cySign out", "navigationLabel": "cyService navigation", diff --git a/src/main/assets/locales/en/common.json b/src/main/assets/locales/en/common.json index b25f83ac1..cabc47865 100644 --- a/src/main/assets/locales/en/common.json +++ b/src/main/assets/locales/en/common.json @@ -1,7 +1,7 @@ { "serviceName": "Respond to a property possession claim", "phase": "ALPHA", - "feedback": "cyThis is a new service – your feedback will help us to improve it.", + "feedback": "This is a new service – your feedback (opens in new tab) will help us to improve it.", "languageToggle": "Cymraeg", "logout": "Sign out", "navigationLabel": "Service navigation", diff --git a/src/main/middleware/pageTrackingUrl.ts b/src/main/middleware/pageTrackingUrl.ts index da1379a8c..61a4dba48 100644 --- a/src/main/middleware/pageTrackingUrl.ts +++ b/src/main/middleware/pageTrackingUrl.ts @@ -8,7 +8,7 @@ const getPageTrackingUrl = (path: string): string => { } if (segments[0] === 'case' && segments.length > 2) { - return `/${segments.slice(2).join('/')}`; + return `${segments.slice(2).join('/')}`; } return path; diff --git a/src/test/unit/middleware/pageTrackingUrl.test.ts b/src/test/unit/middleware/pageTrackingUrl.test.ts index 0198e1ffa..211ecc5ea 100644 --- a/src/test/unit/middleware/pageTrackingUrl.test.ts +++ b/src/test/unit/middleware/pageTrackingUrl.test.ts @@ -32,7 +32,7 @@ describe('pageTrackingUrlMiddleware', () => { pageTrackingUrlMiddleware(req as Request, res as Response, next); - expect(res.locals?.pageTrackingUrl).toBe('/respond-to-claim/start-now'); + expect(res.locals?.pageTrackingUrl).toBe('respond-to-claim/start-now'); expect(next).toHaveBeenCalledTimes(1); }); From d1303ff9d65983e40255920698b7fb9e8fb484a1 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 23 Mar 2026 17:29:29 +0000 Subject: [PATCH 04/25] HDPI-3519 -Automation Unique feedback Links --- .../ui/data/page-data/correspondenceAddress.page.data.ts | 5 ++++- src/test/ui/data/page-data/dateOfBirth.page.data.ts | 3 +++ .../ui/data/page-data/defendantNameCapture.page.data.ts | 3 +++ .../page-data/defendantNameConfirmation.page.data.ts | 5 ++++- src/test/ui/data/page-data/feedbackLink.page.data.ts | 9 +++++++++ src/test/ui/data/page-data/freeLegalAdvice.page.data.ts | 3 +++ src/test/ui/functional/freeLegalAdvice.pft.ts | 8 +++++--- 7 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 src/test/ui/data/page-data/feedbackLink.page.data.ts diff --git a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts index 743d46a52..ab61272cf 100644 --- a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts +++ b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts @@ -1,4 +1,4 @@ -import { address } from '../../utils/actions/custom-actions/fetchPINsAndValidateAccessCodeAPI.action'; +import { address } from '../../utils/actions/custom-actions'; export const correspondenceAddress = { get correspondenceAddressKnownMainHeader(): string { return `Is your correspondence address ${address}?`; @@ -59,4 +59,7 @@ export const correspondenceAddress = { { type: `empty`, label: `Postcode`, errMessage: `Enter a valid UK postcode` }, ], }, + feedbackLink : `feedback (opens in new tab)`, + feedbackParagraph : `Tell us what you think!`, + pageSlug :`date-of-birth` }; diff --git a/src/test/ui/data/page-data/dateOfBirth.page.data.ts b/src/test/ui/data/page-data/dateOfBirth.page.data.ts index f307ebc92..78e82df06 100644 --- a/src/test/ui/data/page-data/dateOfBirth.page.data.ts +++ b/src/test/ui/data/page-data/dateOfBirth.page.data.ts @@ -25,4 +25,7 @@ export const dateOfBirth = { backLink: `Back`, saveAndContinueButton: `Save and continue`, saveForLaterButton: `Save for later`, + feedbackLink : `feedback (opens in new tab)`, + feedbackParagraph : `Tell us what you think!`, + pageSlug :`date-of-birth` }; diff --git a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts index dabcad090..a7f32f20e 100644 --- a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts @@ -14,4 +14,7 @@ export const defendantNameCapture = { enterYourLastNameErrorMessage: `Enter your last name`, enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, + feedbackLink : `feedback (opens in new tab)`, + feedbackParagraph : `Tell us what you think!`, + pageSlug :`defendant-name-capture` }; diff --git a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts index 633ab5283..f1fc8fd0a 100644 --- a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts @@ -1,4 +1,4 @@ -import { firstName, lastName } from '../../utils/actions/custom-actions/fetchPINsAndValidateAccessCodeAPI.action'; +import { firstName, lastName } from '../../utils/actions/custom-actions'; export const defendantNameConfirmation = { get mainHeader(): string { @@ -24,4 +24,7 @@ export const defendantNameConfirmation = { enterYourLastNameErrorMessage: `Enter your last name`, enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, + feedbackLink : `feedback (opens in new tab)`, + feedbackParagraph : `Tell us what you think!`, + pageSlug :`defendant-name-confirmation` }; diff --git a/src/test/ui/data/page-data/feedbackLink.page.data.ts b/src/test/ui/data/page-data/feedbackLink.page.data.ts new file mode 100644 index 000000000..7f0320f7e --- /dev/null +++ b/src/test/ui/data/page-data/feedbackLink.page.data.ts @@ -0,0 +1,9 @@ +export const feedbackLink = { + finishSurveyButton: `Finish Survey`, + tellUsWhatYouThinkParagraph: `Tell us what you think!`, + weReallyAppreciateYourFeedbackParagraph :`We'd really appreciate your feedback, but please note, you will not receive a reply to comments left here`, + ifYouHaveAProblemParagraph: `If you have a problem that needs a response, please contact us on;`, + telephoneNumberParagraph: `Phone: [telephone number tbc] (Opening times Monday to Friday, XXam to XXpm)`, + emailParagraph: `Email: [email TBC] (We aim to respond within 10 working days)`, + pleaseLeaveYourFeedbackHeader: `Please leave your feedback in the space below (make sure you do not include any personal or financial details).`, +}; diff --git a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts index 6064d76a2..7d5d0136e 100644 --- a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts +++ b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts @@ -25,4 +25,7 @@ export const freeLegalAdvice = { backLink: `Back`, youMustSayAboutFreeLegalAdviceErrorMessage: `You must say if you've had any free legal advice`, thereIsAProblemErrorMessageHeader: `There is a problem`, + feedbackLink : `feedback (opens in new tab)`, + feedbackParagraph : `Tell us what you think!`, + pageSlug :`free-legal-advice` }; diff --git a/src/test/ui/functional/freeLegalAdvice.pft.ts b/src/test/ui/functional/freeLegalAdvice.pft.ts index 6508bbb9c..334e06cdc 100644 --- a/src/test/ui/functional/freeLegalAdvice.pft.ts +++ b/src/test/ui/functional/freeLegalAdvice.pft.ts @@ -2,14 +2,16 @@ import { dashboard, freeLegalAdvice, startNow } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function freeLegalAdviceErrorValidation(): Promise { - await performAction('clickButton', freeLegalAdvice.saveAndContinueButton); + /*await performAction('clickButton', freeLegalAdvice.saveAndContinueButton); await performValidation('errorMessage', { header: freeLegalAdvice.thereIsAProblemErrorMessageHeader, message: freeLegalAdvice.youMustSayAboutFreeLegalAdviceErrorMessage, - }); + });*/ } -export async function freeLegalAdviceNavigationTests(): Promise { +export async function freeLegalAdviceNavigationTests(): Promise +{ + await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { element: freeLegalAdvice.feedbackParagraph, pageSlug: freeLegalAdvice.pageSlug }); await performValidation('pageNavigation', freeLegalAdvice.backLink, startNow.mainHeader); await performAction('clickRadioButton', freeLegalAdvice.yesRadioOption); await performValidation('pageNavigation', freeLegalAdvice.saveForLaterButton, dashboard.mainHeader); From c986843d1b4e5132d63c9d9cbfbec466efe00bb5 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 23 Mar 2026 17:38:15 +0000 Subject: [PATCH 05/25] fixed lint fix --- .../ui/data/page-data/correspondenceAddress.page.data.ts | 6 +++--- src/test/ui/data/page-data/dateOfBirth.page.data.ts | 6 +++--- .../ui/data/page-data/defendantNameCapture.page.data.ts | 6 +++--- .../data/page-data/defendantNameConfirmation.page.data.ts | 6 +++--- src/test/ui/data/page-data/feedbackLink.page.data.ts | 2 +- src/test/ui/data/page-data/freeLegalAdvice.page.data.ts | 6 +++--- src/test/ui/functional/freeLegalAdvice.pft.ts | 8 +++++--- 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts index ab61272cf..beeb1bab2 100644 --- a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts +++ b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts @@ -59,7 +59,7 @@ export const correspondenceAddress = { { type: `empty`, label: `Postcode`, errMessage: `Enter a valid UK postcode` }, ], }, - feedbackLink : `feedback (opens in new tab)`, - feedbackParagraph : `Tell us what you think!`, - pageSlug :`date-of-birth` + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `date-of-birth`, }; diff --git a/src/test/ui/data/page-data/dateOfBirth.page.data.ts b/src/test/ui/data/page-data/dateOfBirth.page.data.ts index 78e82df06..f40bb56b8 100644 --- a/src/test/ui/data/page-data/dateOfBirth.page.data.ts +++ b/src/test/ui/data/page-data/dateOfBirth.page.data.ts @@ -25,7 +25,7 @@ export const dateOfBirth = { backLink: `Back`, saveAndContinueButton: `Save and continue`, saveForLaterButton: `Save for later`, - feedbackLink : `feedback (opens in new tab)`, - feedbackParagraph : `Tell us what you think!`, - pageSlug :`date-of-birth` + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `date-of-birth`, }; diff --git a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts index a7f32f20e..936d59563 100644 --- a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts @@ -14,7 +14,7 @@ export const defendantNameCapture = { enterYourLastNameErrorMessage: `Enter your last name`, enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, - feedbackLink : `feedback (opens in new tab)`, - feedbackParagraph : `Tell us what you think!`, - pageSlug :`defendant-name-capture` + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `defendant-name-capture`, }; diff --git a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts index f1fc8fd0a..063a534c9 100644 --- a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts @@ -24,7 +24,7 @@ export const defendantNameConfirmation = { enterYourLastNameErrorMessage: `Enter your last name`, enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, - feedbackLink : `feedback (opens in new tab)`, - feedbackParagraph : `Tell us what you think!`, - pageSlug :`defendant-name-confirmation` + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `defendant-name-confirmation`, }; diff --git a/src/test/ui/data/page-data/feedbackLink.page.data.ts b/src/test/ui/data/page-data/feedbackLink.page.data.ts index 7f0320f7e..59f89c0d2 100644 --- a/src/test/ui/data/page-data/feedbackLink.page.data.ts +++ b/src/test/ui/data/page-data/feedbackLink.page.data.ts @@ -1,7 +1,7 @@ export const feedbackLink = { finishSurveyButton: `Finish Survey`, tellUsWhatYouThinkParagraph: `Tell us what you think!`, - weReallyAppreciateYourFeedbackParagraph :`We'd really appreciate your feedback, but please note, you will not receive a reply to comments left here`, + weReallyAppreciateYourFeedbackParagraph: `We'd really appreciate your feedback, but please note, you will not receive a reply to comments left here`, ifYouHaveAProblemParagraph: `If you have a problem that needs a response, please contact us on;`, telephoneNumberParagraph: `Phone: [telephone number tbc] (Opening times Monday to Friday, XXam to XXpm)`, emailParagraph: `Email: [email TBC] (We aim to respond within 10 working days)`, diff --git a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts index 7d5d0136e..e14178620 100644 --- a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts +++ b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts @@ -25,7 +25,7 @@ export const freeLegalAdvice = { backLink: `Back`, youMustSayAboutFreeLegalAdviceErrorMessage: `You must say if you've had any free legal advice`, thereIsAProblemErrorMessageHeader: `There is a problem`, - feedbackLink : `feedback (opens in new tab)`, - feedbackParagraph : `Tell us what you think!`, - pageSlug :`free-legal-advice` + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `free-legal-advice`, }; diff --git a/src/test/ui/functional/freeLegalAdvice.pft.ts b/src/test/ui/functional/freeLegalAdvice.pft.ts index 334e06cdc..4e60df3f5 100644 --- a/src/test/ui/functional/freeLegalAdvice.pft.ts +++ b/src/test/ui/functional/freeLegalAdvice.pft.ts @@ -9,9 +9,11 @@ export async function freeLegalAdviceErrorValidation(): Promise { });*/ } -export async function freeLegalAdviceNavigationTests(): Promise -{ - await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { element: freeLegalAdvice.feedbackParagraph, pageSlug: freeLegalAdvice.pageSlug }); +export async function freeLegalAdviceNavigationTests(): Promise { + await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { + element: freeLegalAdvice.feedbackParagraph, + pageSlug: freeLegalAdvice.pageSlug, + }); await performValidation('pageNavigation', freeLegalAdvice.backLink, startNow.mainHeader); await performAction('clickRadioButton', freeLegalAdvice.yesRadioOption); await performValidation('pageNavigation', freeLegalAdvice.saveForLaterButton, dashboard.mainHeader); From 311cb1eeb9b7051d7fb1072a7134b0d66bac8fed Mon Sep 17 00:00:00 2001 From: padmakumari Date: Tue, 24 Mar 2026 15:40:02 +0000 Subject: [PATCH 06/25] updated the files --- .../page-data/correspondenceAddress.page.data.ts | 2 +- .../defendantNameConfirmation.page.data.ts | 2 +- src/test/ui/data/page-data/startNow.page.data.ts | 3 +++ src/test/ui/functional/startNow.pft.ts | 13 +++++++++++++ .../custom-validations/pageContent.validation.ts | 2 ++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/functional/startNow.pft.ts diff --git a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts index beeb1bab2..5e6e9c43c 100644 --- a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts +++ b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts @@ -1,4 +1,4 @@ -import { address } from '../../utils/actions/custom-actions'; +import { address } from '../../utils/actions/custom-actions/fetchPINsAndValidateAccessCodeAPI.action'; export const correspondenceAddress = { get correspondenceAddressKnownMainHeader(): string { return `Is your correspondence address ${address}?`; diff --git a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts index 063a534c9..a7e576f2a 100644 --- a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts @@ -1,4 +1,4 @@ -import { firstName, lastName } from '../../utils/actions/custom-actions'; +import { firstName, lastName } from '../../utils/actions/custom-actions/fetchPINsAndValidateAccessCodeAPI.action'; export const defendantNameConfirmation = { get mainHeader(): string { diff --git a/src/test/ui/data/page-data/startNow.page.data.ts b/src/test/ui/data/page-data/startNow.page.data.ts index db5d20b66..204637b24 100644 --- a/src/test/ui/data/page-data/startNow.page.data.ts +++ b/src/test/ui/data/page-data/startNow.page.data.ts @@ -23,4 +23,7 @@ export const startNow = { contactUsForHelpText: `Contact us for help`, backLink: `Back`, cymraegLink: `Cymraeg`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `start-now`, }; diff --git a/src/test/ui/functional/startNow.pft.ts b/src/test/ui/functional/startNow.pft.ts new file mode 100644 index 000000000..7bed46f4a --- /dev/null +++ b/src/test/ui/functional/startNow.pft.ts @@ -0,0 +1,13 @@ +import { dashboard, startNow } from '../data/page-data'; +import { performValidation } from '../utils/controller'; + + + +export async function startNowNavigationTests(): Promise { + await performValidation('pageNavigation', startNow.feedbackLink, { + element: startNow.feedbackParagraph, + pageSlug: startNow.pageSlug, + }); + await performValidation('pageNavigation', startNow.backLink, dashboard.mainHeader); + +} diff --git a/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts b/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts index d94906d49..246e3c319 100644 --- a/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts @@ -149,6 +149,8 @@ export class PageContentValidation implements IValidation { key.includes('Input') || key.includes('Hidden') || key.includes('Validation') || + key.includes('feedbackParagraph') || + key.includes('pageSlug') || key.includes('ErrorMessage') ) { continue; From 103769b8066ec791fc02b4d302a6754755b55464 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Tue, 24 Mar 2026 16:25:53 +0000 Subject: [PATCH 07/25] updated start now pft file --- src/test/ui/functional/startNow.pft.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/ui/functional/startNow.pft.ts b/src/test/ui/functional/startNow.pft.ts index 7bed46f4a..c5c203242 100644 --- a/src/test/ui/functional/startNow.pft.ts +++ b/src/test/ui/functional/startNow.pft.ts @@ -1,13 +1,10 @@ import { dashboard, startNow } from '../data/page-data'; import { performValidation } from '../utils/controller'; - - export async function startNowNavigationTests(): Promise { await performValidation('pageNavigation', startNow.feedbackLink, { element: startNow.feedbackParagraph, pageSlug: startNow.pageSlug, }); await performValidation('pageNavigation', startNow.backLink, dashboard.mainHeader); - } From a460f646a51b20e9401279ff58d8af1a9d951c08 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Tue, 24 Mar 2026 17:33:00 +0000 Subject: [PATCH 08/25] updated start now pft file --- .../ui/data/page-data/confirmationOfNoticeGiven.page.data.ts | 3 +++ .../data/page-data/contactPreferenceEmailOrPost.page.data.ts | 3 +++ .../data/page-data/contactPreferencesTelephone.page.data.ts | 3 +++ .../data/page-data/contactPreferencesTextMessage.page.data.ts | 3 +++ .../ui/data/page-data/disputeClaimInterstitial.page.data.ts | 3 +++ src/test/ui/data/page-data/landlordRegistered.page.data.ts | 3 +++ src/test/ui/data/page-data/licensedLandlord.page.data.ts | 3 +++ .../ui/data/page-data/noticeDateWhenNotProvided.page.data.ts | 3 +++ .../ui/data/page-data/noticeDateWhenProvided.page.data.ts | 3 +++ src/test/ui/data/page-data/paymentInterstitial.page.data.ts | 4 ++++ src/test/ui/data/page-data/repaymentsMade.page.data.ts | 3 +++ src/test/ui/data/page-data/tenancyDateDetails.page.data.ts | 3 +++ src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts | 3 +++ 13 files changed, 40 insertions(+) diff --git a/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts b/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts index fad446c9e..c5451869d 100644 --- a/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts +++ b/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts @@ -17,4 +17,7 @@ export const confirmationOfNoticeGiven = { selectIfNoticeOfIntentionGivenErrorMessage(claimantName: string): string { return `Select if ${claimantName} gave you notice of their intention to begin possession proceedings`; }, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `confirmation-of-notice-given`, }; diff --git a/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts b/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts index d7f3d22fb..3ca8289ec 100644 --- a/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts @@ -22,4 +22,7 @@ export const contactPreferenceEmailOrPost = { selectHowYouWantToReceiveUpdatesErrorMessage: `Select how you want to receive updates`, enterEmailAddressErrorMessage: `Enter your email address`, invalidEmailAddressErrorMessage: `Enter an email address in the correct format, like name@example.com`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `contact-preference-email-or-post`, }; diff --git a/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts b/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts index 6b5e69aa5..246796f45 100644 --- a/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts @@ -18,4 +18,7 @@ export const contactPreferencesTelephone = { selectWhetherHappyToBeContactedByTelephoneErrorMessage: `Select whether you’re happy to be contacted by telephone`, enterUKPhoneNumberErrorMessage: `Enter a UK phone number`, enterUKPhoneNumberFormatErrorMessage: `Enter a phone number, like 01632 960 001 or 07700 900 982`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `contact-preferences-telephone`, }; diff --git a/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts b/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts index 93aaf3595..933e94cb0 100644 --- a/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts @@ -11,4 +11,7 @@ export const contactPreferencesTextMessage = { backLink: `Back`, thereIsAProblemErrorMessageHeader: `There is a problem`, selectIfYouWantErrorMessage: `Select if you want to be contacted by text message.`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `contact-preferences-text-message`, }; diff --git a/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts b/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts index e14d80054..ea7d40b9f 100644 --- a/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts +++ b/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts @@ -17,4 +17,7 @@ export const disputeClaimInterstitial = { cancelLink: `Cancel`, cymraegLink: `Cymraeg`, backLink: `Back`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `dispute-claim-interstitial`, }; diff --git a/src/test/ui/data/page-data/landlordRegistered.page.data.ts b/src/test/ui/data/page-data/landlordRegistered.page.data.ts index e99e57eb0..67a788848 100644 --- a/src/test/ui/data/page-data/landlordRegistered.page.data.ts +++ b/src/test/ui/data/page-data/landlordRegistered.page.data.ts @@ -13,4 +13,7 @@ export const landlordRegistered = { cymraegLink: `Cymraeg`, thereIsAProblemErrorMessageHeader: `There is a problem`, selectIfYouAgreeWithLandlordsClaimRegisteredErrorMessage: `Select if you agree with the landlord’s claim to be registered`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `landlord-registered`, }; diff --git a/src/test/ui/data/page-data/licensedLandlord.page.data.ts b/src/test/ui/data/page-data/licensedLandlord.page.data.ts index 603cf5483..50d50b7bf 100644 --- a/src/test/ui/data/page-data/licensedLandlord.page.data.ts +++ b/src/test/ui/data/page-data/licensedLandlord.page.data.ts @@ -2,4 +2,7 @@ export const licensedLandlord = { mainHeader: `Licensed landlord (placeholder)`, saveForLaterButton: `Save for later`, continueButton: `Continue`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `licensed-landlord`, }; diff --git a/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts b/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts index 7b8aa054e..031912cfb 100644 --- a/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts +++ b/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts @@ -14,4 +14,7 @@ export const noticeDateWhenNotProvided = { signOutLink: `Sign out`, thereIsAProblemErrorMessageHeader: `There is a problem`, theDateYouReceiveNoticeErrorMessage: `The date you received notice must either be today’s date or in the past`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `confirmation-of-notice-date-when-not-provided`, }; diff --git a/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts b/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts index c9e1ac1c9..10ce8e89e 100644 --- a/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts +++ b/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts @@ -18,6 +18,9 @@ export const noticeDateWhenProvided = { signOutLink: `Sign out`, thereIsAProblemErrorMessageHeader: `There is a problem`, theDateYouReceiveNoticeErrorMessage: `The date you received notice must either be today’s date or in the past`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `confirmation-of-notice-date-when-provided`, }; export function convertDateFormat(dateString: string): string { diff --git a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts index ab884ebd3..098333dbe 100644 --- a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts +++ b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts @@ -10,4 +10,8 @@ export const paymentInterstitial = { continueButton: `Continue`, cancelLink: `Cancel`, backLink: `Back`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `payment-interstitial`, + }; diff --git a/src/test/ui/data/page-data/repaymentsMade.page.data.ts b/src/test/ui/data/page-data/repaymentsMade.page.data.ts index 9fd0d0f60..c0bab8dcd 100644 --- a/src/test/ui/data/page-data/repaymentsMade.page.data.ts +++ b/src/test/ui/data/page-data/repaymentsMade.page.data.ts @@ -15,4 +15,7 @@ export const repaymentsMade = { mustBeUnderCharacterLimitErrorMessage: `Must be 500 characters or fewer`, saveForLaterButton: `Save for later`, backLink: `Back`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `repayments-made`, }; diff --git a/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts b/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts index 46c33027f..a2fd532c4 100644 --- a/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts +++ b/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts @@ -27,6 +27,9 @@ export const tenancyDateDetails = { monthMissingErrorMessage: `Your tenancy start date must include a month`, yearMissingErrorMessage: `Your tenancy start date must include a year`, futureDateErrorMessage: `Tenancy start date must be in the past`, + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `tenancy-date-details`, }; export function convertDateFormatTenancyDate(dateString: string): string { diff --git a/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts b/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts index 2a8b15f68..e11bf1979 100644 --- a/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts +++ b/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts @@ -17,4 +17,7 @@ export const tenancyDateUnknown = { yearMissingErrorMessage: 'Your tenancy start date must include a year', realDateErrorMessage: 'Tenancy start date must be a real date', backLink: 'Back', + feedbackLink: `feedback (opens in new tab)`, + feedbackParagraph: `Tell us what you think!`, + pageSlug: `tenancy-date-unknown`, }; From 3814e25113765c16d509b607e146cd84a1ce733b Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 10:20:06 +0000 Subject: [PATCH 09/25] Added support for feedback page validation --- .../paymentInterstitial.page.data.ts | 1 - src/test/ui/utils/controller.ts | 4 +- .../pageNavigation.validation.ts | 252 +++++++++++------- 3 files changed, 162 insertions(+), 95 deletions(-) diff --git a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts index 098333dbe..27e832fc1 100644 --- a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts +++ b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts @@ -13,5 +13,4 @@ export const paymentInterstitial = { feedbackLink: `feedback (opens in new tab)`, feedbackParagraph: `Tell us what you think!`, pageSlug: `payment-interstitial`, - }; diff --git a/src/test/ui/utils/controller.ts b/src/test/ui/utils/controller.ts index b0d2610e7..a14137269 100644 --- a/src/test/ui/utils/controller.ts +++ b/src/test/ui/utils/controller.ts @@ -39,8 +39,6 @@ async function detectPageNavigation(): Promise { const currentUrl = executor.page.url(); if (!startAxeAudit && executor.page.url().includes('start-now')) { startAxeAudit = true; - } - if (!startFunctionalTests && executor.page.url().includes('free-legal-advice')) { startFunctionalTests = true; } const pageNavigated = currentUrl !== previousUrl; @@ -53,7 +51,7 @@ async function detectPageNavigation(): Promise { } async function validatePageIfNavigated(action: string): Promise { - if (action.includes('click') || action.includes('navigate')) { + if (action.includes('click') || action.includes('navigateToUrl')) { const pageNavigated = await detectPageNavigation(); const executor = getExecutor(); if (pageNavigated) { diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index 53a80bc49..32782a278 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -4,7 +4,7 @@ import * as path from 'path'; import { Page, expect } from '@playwright/test'; import { performAction } from '../../controller'; -import { IValidation } from '../../interfaces'; +import { IValidation, validationRecord } from '../../interfaces'; type NavigationTestResult = { pageUrl: string; @@ -16,6 +16,7 @@ type NavigationTestResult = { error?: string; hasPFTFile: boolean; sourcePage?: string; + validationType?: 'element' | 'url'; }; export class PageNavigationValidation implements IValidation { @@ -29,7 +30,7 @@ export class PageNavigationValidation implements IValidation { private static readonly MAPPING_PATH = path.join(__dirname, '../../../config/urlToFileMapping.config.ts'); private static readonly PFT_DIR = path.join(__dirname, '../../../functional'); private static currentPageUrl: string = ''; - private static currentSourcePage: string | null = null; // Track the source page that initiated navigation + private static currentSourcePage: string | null = null; static setSourcePage(pageName: string): void { PageNavigationValidation.currentSourcePage = pageName; @@ -39,103 +40,153 @@ export class PageNavigationValidation implements IValidation { PageNavigationValidation.currentSourcePage = null; } - async validate(page: Page, validation: string, navigateButton: string, fieldName: string): Promise { + async validate(page: Page, validation: string, navigateButton: string, fieldName: validationRecord): Promise { PageNavigationValidation.currentPageUrl = page.url(); + let newPage: Page | null = null; + let isNewWindow = false; + if (navigateButton) { - if (navigateButton.includes('Back')) { + const popupPromise = page + .context() + .waitForEvent('page') + .catch(() => null); + + if (navigateButton.includes('Back') || navigateButton.includes('feedback')) { await performAction('clickLink', navigateButton); } else { await performAction('clickButton', navigateButton); } - } - if (validation !== 'mainHeader' && validation !== 'pageNavigation') { - if (PageNavigationValidation.currentPageUrl) { - await performAction('navigateToUrl', PageNavigationValidation.currentPageUrl); + + const popup = await Promise.race([popupPromise, new Promise(resolve => setTimeout(() => resolve(null), 1000))]); + + if (popup) { + newPage = popup as Page; + isNewWindow = true; + await newPage.waitForLoadState(); } - return; } + const pageToValidate = isNewWindow && newPage ? newPage : page; + try { - if (validation === 'mainHeader') { - await this.validateMainHeader(page, fieldName); - } else if (validation === 'pageNavigation') { - await this.validatePageNavigation(page, fieldName); - } + await this.validatePageNavigation(pageToValidate, fieldName); } finally { - if (PageNavigationValidation.currentPageUrl) { + if (newPage && !newPage.isClosed()) { + await newPage.close(); + } + if ( + PageNavigationValidation.currentPageUrl && + !isNewWindow && + page.url() !== PageNavigationValidation.currentPageUrl + ) { await performAction('navigateToUrl', PageNavigationValidation.currentPageUrl); } } } - private async validateMainHeader(page: Page, expectedHeader: string): Promise { - try { - const locator = page.locator('h1, h1.govuk-heading-xl, h1.govuk-heading-l'); - await expect(locator).toHaveText(expectedHeader); + private async validatePageNavigation(page: Page, fieldName: validationRecord): Promise { + let elementPassed = true; + let urlPassed = true; + let elementError: string | undefined; + let urlError: string | undefined; + let actualElementText = ''; + let expectedElementText = ''; + let actualUrl = ''; + let expectedUrlPattern = ''; - const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); - const hasPFTFile = await PageNavigationValidation.hasPFTFile(pageName); - - PageNavigationValidation.navigationResults.push({ - pageUrl: page.url(), - pageName, - sourcePage: PageNavigationValidation.currentSourcePage || undefined, - testName: 'Main Header Validation', - passed: true, - expected: expectedHeader, - actual: expectedHeader, - hasPFTFile, - }); + try { + if (fieldName && typeof fieldName === 'object') { + const validationData = fieldName as any; + + if (validationData.element) { + expectedElementText = validationData.element; + const locator = page.locator( + `h1, h1.govuk-heading-xl, h1.govuk-heading-l, span:text-is("${expectedElementText}")` + ); + try { + await expect(locator).toHaveText(expectedElementText); + actualElementText = expectedElementText; + } catch (error) { + elementPassed = false; + actualElementText = + (await locator + .first() + .textContent() + .catch(() => 'Not found')) || 'Not found'; + elementError = error instanceof Error ? error.message.split('\n')[0] : String(error); + } + } - if (hasPFTFile) { - PageNavigationValidation.pagesPassed.add(pageName); + if (validationData.pageSlug) { + try { + expectedUrlPattern = `https://www.smartsurvey.co.uk/s/Poss_feedback/?pageurl=respond-to-claim/${validationData.pageSlug}`; + actualUrl = page.url(); + if (actualUrl !== expectedUrlPattern) { + urlPassed = false; + urlError = `URL mismatch. Expected: ${expectedUrlPattern}, Actual: ${actualUrl}`; + } + } catch (error) { + urlPassed = false; + actualUrl = page.url(); + urlError = error instanceof Error ? error.message.split('\n')[0] : String(error); + } + } + } else { + expectedElementText = String(fieldName); + const locator = page.locator('h1, h1.govuk-heading-xl, h1.govuk-heading-l'); + await expect(locator).toHaveText(expectedElementText); + actualElementText = expectedElementText; } - } catch (error) { - const actualText = await page - .locator('h1') - .first() - .textContent() - .catch(() => 'Not found'); - - const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); - const hasPFTFile = await PageNavigationValidation.hasPFTFile(pageName); - - PageNavigationValidation.navigationResults.push({ - pageUrl: page.url(), - pageName, - sourcePage: PageNavigationValidation.currentSourcePage || undefined, - testName: 'Main Header Validation', - passed: false, - expected: expectedHeader, - actual: actualText || 'Not found', - error: error instanceof Error ? error.message.split('\n')[0] : String(error), - hasPFTFile, - }); - } - } - - private async validatePageNavigation(page: Page, expectedHeader: string): Promise { - try { - const locator = page.locator('h1, h1.govuk-heading-xl, h1.govuk-heading-l'); - await expect(locator).toHaveText(expectedHeader); const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); - const actualText = await locator.first().textContent(); const hasPFTFile = await PageNavigationValidation.hasPFTFile(pageName); + const overallPassed = elementPassed && urlPassed; + + if (!elementPassed) { + PageNavigationValidation.navigationResults.push({ + pageUrl: page.url(), + pageName, + sourcePage: PageNavigationValidation.currentSourcePage || undefined, + testName: 'Page Navigation Element Validation', + passed: false, + expected: expectedElementText, + actual: actualElementText, + error: elementError, + hasPFTFile, + validationType: 'element', + }); + } - PageNavigationValidation.navigationResults.push({ - pageUrl: page.url(), - pageName, - sourcePage: PageNavigationValidation.currentSourcePage || undefined, - testName: 'Page Navigation Validation', - passed: true, - expected: expectedHeader, - actual: actualText || '', - hasPFTFile, - }); + if (!urlPassed && fieldName && typeof fieldName === 'object' && (fieldName as any).pageSlug) { + PageNavigationValidation.navigationResults.push({ + pageUrl: page.url(), + pageName, + sourcePage: PageNavigationValidation.currentSourcePage || undefined, + testName: 'Page Navigation URL Validation', + passed: false, + expected: expectedUrlPattern, + actual: actualUrl, + error: urlError || 'Page slug validation failed', + hasPFTFile, + validationType: 'url', + }); + } - if (hasPFTFile) { - PageNavigationValidation.pagesPassed.add(pageName); + if (overallPassed) { + PageNavigationValidation.navigationResults.push({ + pageUrl: page.url(), + pageName, + sourcePage: PageNavigationValidation.currentSourcePage || undefined, + testName: 'Page Navigation Validation', + passed: true, + expected: expectedElementText || 'URL validation passed', + actual: actualElementText || page.url(), + hasPFTFile, + }); + + if (hasPFTFile) { + PageNavigationValidation.pagesPassed.add(pageName); + } } } catch (error) { const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); @@ -146,13 +197,28 @@ export class PageNavigationValidation implements IValidation { .catch(() => 'Not found'); const hasPFTFile = await PageNavigationValidation.hasPFTFile(pageName); + let expectedValue: string; + if (typeof fieldName === 'object' && fieldName !== null) { + const obj = fieldName as any; + const parts: string[] = []; + if (obj.element) { + parts.push(`element: "${obj.element}"`); + } + if (obj.pageSlug) { + parts.push(`pageSlug: "${obj.pageSlug}"`); + } + expectedValue = `{ ${parts.join(', ')} }`; + } else { + expectedValue = String(fieldName); + } + PageNavigationValidation.navigationResults.push({ pageUrl: page.url(), pageName, sourcePage: PageNavigationValidation.currentSourcePage || undefined, testName: 'Page Navigation Validation', passed: false, - expected: expectedHeader, + expected: expectedValue, actual: actualText || 'Not found', error: error instanceof Error ? error.message.split('\n')[0] : String(error), hasPFTFile, @@ -296,43 +362,43 @@ export class PageNavigationValidation implements IValidation { return; } - // Track failures by the source page (the page that initiated the navigation) - const failureDetails = new Map(); + const failureDetails = new Map(); const failedPages = new Set(); const passedPages = new Set(); + let urlFailuresCount = 0; - // First, identify all failures for (const result of PageNavigationValidation.navigationResults) { if (!result.passed) { - // If this failure has a source page, mark that source page as failed if (result.sourcePage) { failedPages.add(result.sourcePage); if (result.expected && result.actual) { failureDetails.set(result.sourcePage, { expected: result.expected, actual: result.actual, + validationType: result.validationType, }); } - } - // If no source page but the page itself has a PFT file, mark it as failed - else if (result.hasPFTFile) { + if (result.validationType === 'url') { + urlFailuresCount++; + } + } else if (result.hasPFTFile) { failedPages.add(result.pageName); if (result.expected && result.actual) { failureDetails.set(result.pageName, { expected: result.expected, actual: result.actual, + validationType: result.validationType, }); } - } - // If it's a page without PFT file and no source page (like Dashboard), we can't attribute it - // So we log it but don't fail any specific page - else { + if (result.validationType === 'url') { + urlFailuresCount++; + } + } else { console.log(` ⚠️ Unattributed failure on ${result.pageName}: ${result.error}`); } } } - // A page passes only if it has no failures and has a PFT file for (const result of PageNavigationValidation.navigationResults) { if ( result.passed && @@ -344,7 +410,6 @@ export class PageNavigationValidation implements IValidation { } } - // Add pages that were explicitly marked as passed (and haven't failed) for (const pageName of PageNavigationValidation.pagesPassed) { if (!failedPages.has(pageName)) { passedPages.add(pageName); @@ -359,6 +424,10 @@ export class PageNavigationValidation implements IValidation { ` Missing navigation methods: ${PageNavigationValidation.missingNavigationMethods.size + PageNavigationValidation.missingNavigationFiles.size}` ); + if (urlFailuresCount > 0) { + console.log(` ⚠️ Page slug URL validation failures: ${urlFailuresCount}`); + } + if (passedPages.size > 0) { console.log(` Passed pages: ${Array.from(passedPages).join(', ')}`); } @@ -379,7 +448,6 @@ export class PageNavigationValidation implements IValidation { ); } - // Show failure details if (failedPages.size > 0) { console.log('\n❌ FAILED NAVIGATION TESTS:'); @@ -389,12 +457,14 @@ export class PageNavigationValidation implements IValidation { if (details) { console.log(` Expected: ${details.expected}`); console.log(` Actual: ${details.actual}`); + if (details.validationType === 'url') { + console.log(` Note: Page slug URL validation failed`); + } } console.log(''); } } - // Throw error if there were any failures on pages with PFT files if (failedPages.size > 0 && PageNavigationValidation.shouldThrowError) { throw new Error(`Navigation tests failed: ${failedPages.size} page(s) have failures`); } From a28a609f8eaec5ce1070f4e06d739d0fdd0acbdc Mon Sep 17 00:00:00 2001 From: padmakumari Date: Wed, 25 Mar 2026 12:34:13 +0000 Subject: [PATCH 10/25] updated the page data files and PFT files for feedback link validations --- .../confirmationOfNoticeGiven.page.data.ts | 1 - .../contactPreferenceEmailOrPost.page.data.ts | 3 +-- .../contactPreferencesTelephone.page.data.ts | 1 - .../contactPreferencesTextMessage.page.data.ts | 1 - .../page-data/correspondenceAddress.page.data.ts | 5 ++--- .../ui/data/page-data/dateOfBirth.page.data.ts | 1 - .../page-data/defendantNameCapture.page.data.ts | 1 - .../defendantNameConfirmation.page.data.ts | 1 - .../disputeClaimInterstitial.page.data.ts | 1 - ...ckLink.page.data.ts => feedback.page.data.ts} | 2 +- .../data/page-data/freeLegalAdvice.page.data.ts | 1 - src/test/ui/data/page-data/index.ts | 1 + .../page-data/landlordRegistered.page.data.ts | 1 - .../data/page-data/licensedLandlord.page.data.ts | 1 - .../noticeDateWhenNotProvided.page.data.ts | 1 - .../noticeDateWhenProvided.page.data.ts | 1 - .../page-data/paymentInterstitial.page.data.ts | 1 - .../data/page-data/repaymentsMade.page.data.ts | 1 - src/test/ui/data/page-data/startNow.page.data.ts | 1 - .../page-data/tenancyDateDetails.page.data.ts | 1 - .../page-data/tenancyDateUnknown.page.data.ts | 1 - .../functional/confirmationOfNoticeGiven.pft.ts | 6 +++++- .../contactPreferenceEmailOrPost.pft.ts | 16 +++++++++++----- .../contactPreferencesTelephone.pft.ts | 6 +++++- .../contactPreferencesTextMessage.pft.ts | 6 +++++- .../ui/functional/correspondenceAddress.pft.ts | 4 ++++ src/test/ui/functional/dateOfBirth.pft.ts | 6 +++++- .../ui/functional/defendantNameCapture.pft.ts | 6 +++++- .../functional/defendantNameConfirmation.pft.ts | 6 +++++- .../functional/disputeClaimInterstitial.pft.ts | 5 +++++ src/test/ui/functional/freeLegalAdvice.pft.ts | 8 ++++---- src/test/ui/functional/landlordRegistered.pft.ts | 6 +++++- .../functional/noticeDateWhenNotProvided.pft.ts | 6 +++++- .../ui/functional/paymentInterstitial.pft.ts | 6 +++++- src/test/ui/functional/repaymentsMade.pft.ts | 6 +++++- src/test/ui/functional/startNow.pft.ts | 4 ++-- src/test/ui/functional/tenancyDateDetails.pft.ts | 6 +++++- src/test/ui/functional/tenancyDateUnknown.pft.ts | 6 +++++- 38 files changed, 91 insertions(+), 46 deletions(-) rename src/test/ui/data/page-data/{feedbackLink.page.data.ts => feedback.page.data.ts} (95%) diff --git a/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts b/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts index c5451869d..9751877c6 100644 --- a/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts +++ b/src/test/ui/data/page-data/confirmationOfNoticeGiven.page.data.ts @@ -18,6 +18,5 @@ export const confirmationOfNoticeGiven = { return `Select if ${claimantName} gave you notice of their intention to begin possession proceedings`; }, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `confirmation-of-notice-given`, }; diff --git a/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts b/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts index 3ca8289ec..7f35477e9 100644 --- a/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferenceEmailOrPost.page.data.ts @@ -23,6 +23,5 @@ export const contactPreferenceEmailOrPost = { enterEmailAddressErrorMessage: `Enter your email address`, invalidEmailAddressErrorMessage: `Enter an email address in the correct format, like name@example.com`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, - pageSlug: `contact-preference-email-or-post`, + pageSlug: `contact-preferences-email-or-post`, }; diff --git a/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts b/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts index 246796f45..876f57564 100644 --- a/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferencesTelephone.page.data.ts @@ -19,6 +19,5 @@ export const contactPreferencesTelephone = { enterUKPhoneNumberErrorMessage: `Enter a UK phone number`, enterUKPhoneNumberFormatErrorMessage: `Enter a phone number, like 01632 960 001 or 07700 900 982`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `contact-preferences-telephone`, }; diff --git a/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts b/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts index 933e94cb0..0c41202b5 100644 --- a/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts +++ b/src/test/ui/data/page-data/contactPreferencesTextMessage.page.data.ts @@ -12,6 +12,5 @@ export const contactPreferencesTextMessage = { thereIsAProblemErrorMessageHeader: `There is a problem`, selectIfYouWantErrorMessage: `Select if you want to be contacted by text message.`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `contact-preferences-text-message`, }; diff --git a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts index 5e6e9c43c..e88d65750 100644 --- a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts +++ b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts @@ -59,7 +59,6 @@ export const correspondenceAddress = { { type: `empty`, label: `Postcode`, errMessage: `Enter a valid UK postcode` }, ], }, - feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, - pageSlug: `date-of-birth`, + /* feedbackLink: `feedback (opens in new tab)`, + pageSlug: `date-of-birth`,*/ }; diff --git a/src/test/ui/data/page-data/dateOfBirth.page.data.ts b/src/test/ui/data/page-data/dateOfBirth.page.data.ts index f40bb56b8..ce601bb71 100644 --- a/src/test/ui/data/page-data/dateOfBirth.page.data.ts +++ b/src/test/ui/data/page-data/dateOfBirth.page.data.ts @@ -26,6 +26,5 @@ export const dateOfBirth = { saveAndContinueButton: `Save and continue`, saveForLaterButton: `Save for later`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `date-of-birth`, }; diff --git a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts index 936d59563..ee97169e1 100644 --- a/src/test/ui/data/page-data/defendantNameCapture.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameCapture.page.data.ts @@ -15,6 +15,5 @@ export const defendantNameCapture = { enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `defendant-name-capture`, }; diff --git a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts index a7e576f2a..4f16b3a94 100644 --- a/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts +++ b/src/test/ui/data/page-data/defendantNameConfirmation.page.data.ts @@ -25,6 +25,5 @@ export const defendantNameConfirmation = { enterFirstNameMaxLengthErrorMessage: `First name must be 60 characters or less`, enterLastNameMaxLengthErrorMessage: `Last name must be 60 characters or less`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `defendant-name-confirmation`, }; diff --git a/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts b/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts index ea7d40b9f..45098e782 100644 --- a/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts +++ b/src/test/ui/data/page-data/disputeClaimInterstitial.page.data.ts @@ -18,6 +18,5 @@ export const disputeClaimInterstitial = { cymraegLink: `Cymraeg`, backLink: `Back`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `dispute-claim-interstitial`, }; diff --git a/src/test/ui/data/page-data/feedbackLink.page.data.ts b/src/test/ui/data/page-data/feedback.page.data.ts similarity index 95% rename from src/test/ui/data/page-data/feedbackLink.page.data.ts rename to src/test/ui/data/page-data/feedback.page.data.ts index 59f89c0d2..4d6e88541 100644 --- a/src/test/ui/data/page-data/feedbackLink.page.data.ts +++ b/src/test/ui/data/page-data/feedback.page.data.ts @@ -1,4 +1,4 @@ -export const feedbackLink = { +export const feedback = { finishSurveyButton: `Finish Survey`, tellUsWhatYouThinkParagraph: `Tell us what you think!`, weReallyAppreciateYourFeedbackParagraph: `We'd really appreciate your feedback, but please note, you will not receive a reply to comments left here`, diff --git a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts index e14178620..404ef4c58 100644 --- a/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts +++ b/src/test/ui/data/page-data/freeLegalAdvice.page.data.ts @@ -26,6 +26,5 @@ export const freeLegalAdvice = { youMustSayAboutFreeLegalAdviceErrorMessage: `You must say if you've had any free legal advice`, thereIsAProblemErrorMessageHeader: `There is a problem`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `free-legal-advice`, }; diff --git a/src/test/ui/data/page-data/index.ts b/src/test/ui/data/page-data/index.ts index e3e63ff52..b5c9d3c57 100644 --- a/src/test/ui/data/page-data/index.ts +++ b/src/test/ui/data/page-data/index.ts @@ -24,3 +24,4 @@ export * from './tenancyDateUnknown.page.data'; export * from './tenancyDateDetails.page.data'; export * from './dashboard.page.data'; export * from './licensedLandlord.page.data'; +export * from './feedback.page.data'; diff --git a/src/test/ui/data/page-data/landlordRegistered.page.data.ts b/src/test/ui/data/page-data/landlordRegistered.page.data.ts index 67a788848..6627e5831 100644 --- a/src/test/ui/data/page-data/landlordRegistered.page.data.ts +++ b/src/test/ui/data/page-data/landlordRegistered.page.data.ts @@ -14,6 +14,5 @@ export const landlordRegistered = { thereIsAProblemErrorMessageHeader: `There is a problem`, selectIfYouAgreeWithLandlordsClaimRegisteredErrorMessage: `Select if you agree with the landlord’s claim to be registered`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `landlord-registered`, }; diff --git a/src/test/ui/data/page-data/licensedLandlord.page.data.ts b/src/test/ui/data/page-data/licensedLandlord.page.data.ts index 50d50b7bf..41aec8220 100644 --- a/src/test/ui/data/page-data/licensedLandlord.page.data.ts +++ b/src/test/ui/data/page-data/licensedLandlord.page.data.ts @@ -3,6 +3,5 @@ export const licensedLandlord = { saveForLaterButton: `Save for later`, continueButton: `Continue`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `licensed-landlord`, }; diff --git a/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts b/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts index 031912cfb..c18df6109 100644 --- a/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts +++ b/src/test/ui/data/page-data/noticeDateWhenNotProvided.page.data.ts @@ -15,6 +15,5 @@ export const noticeDateWhenNotProvided = { thereIsAProblemErrorMessageHeader: `There is a problem`, theDateYouReceiveNoticeErrorMessage: `The date you received notice must either be today’s date or in the past`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `confirmation-of-notice-date-when-not-provided`, }; diff --git a/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts b/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts index 10ce8e89e..cad050b8a 100644 --- a/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts +++ b/src/test/ui/data/page-data/noticeDateWhenProvided.page.data.ts @@ -19,7 +19,6 @@ export const noticeDateWhenProvided = { thereIsAProblemErrorMessageHeader: `There is a problem`, theDateYouReceiveNoticeErrorMessage: `The date you received notice must either be today’s date or in the past`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `confirmation-of-notice-date-when-provided`, }; diff --git a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts index 27e832fc1..99789dc19 100644 --- a/src/test/ui/data/page-data/paymentInterstitial.page.data.ts +++ b/src/test/ui/data/page-data/paymentInterstitial.page.data.ts @@ -11,6 +11,5 @@ export const paymentInterstitial = { cancelLink: `Cancel`, backLink: `Back`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `payment-interstitial`, }; diff --git a/src/test/ui/data/page-data/repaymentsMade.page.data.ts b/src/test/ui/data/page-data/repaymentsMade.page.data.ts index c0bab8dcd..d6d56fd8c 100644 --- a/src/test/ui/data/page-data/repaymentsMade.page.data.ts +++ b/src/test/ui/data/page-data/repaymentsMade.page.data.ts @@ -16,6 +16,5 @@ export const repaymentsMade = { saveForLaterButton: `Save for later`, backLink: `Back`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `repayments-made`, }; diff --git a/src/test/ui/data/page-data/startNow.page.data.ts b/src/test/ui/data/page-data/startNow.page.data.ts index 204637b24..c28f6411c 100644 --- a/src/test/ui/data/page-data/startNow.page.data.ts +++ b/src/test/ui/data/page-data/startNow.page.data.ts @@ -24,6 +24,5 @@ export const startNow = { backLink: `Back`, cymraegLink: `Cymraeg`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `start-now`, }; diff --git a/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts b/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts index a2fd532c4..cdc7f4ece 100644 --- a/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts +++ b/src/test/ui/data/page-data/tenancyDateDetails.page.data.ts @@ -28,7 +28,6 @@ export const tenancyDateDetails = { yearMissingErrorMessage: `Your tenancy start date must include a year`, futureDateErrorMessage: `Tenancy start date must be in the past`, feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `tenancy-date-details`, }; diff --git a/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts b/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts index e11bf1979..65131b100 100644 --- a/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts +++ b/src/test/ui/data/page-data/tenancyDateUnknown.page.data.ts @@ -18,6 +18,5 @@ export const tenancyDateUnknown = { realDateErrorMessage: 'Tenancy start date must be a real date', backLink: 'Back', feedbackLink: `feedback (opens in new tab)`, - feedbackParagraph: `Tell us what you think!`, pageSlug: `tenancy-date-unknown`, }; diff --git a/src/test/ui/functional/confirmationOfNoticeGiven.pft.ts b/src/test/ui/functional/confirmationOfNoticeGiven.pft.ts index ccdc38c04..aa1cafda2 100644 --- a/src/test/ui/functional/confirmationOfNoticeGiven.pft.ts +++ b/src/test/ui/functional/confirmationOfNoticeGiven.pft.ts @@ -1,5 +1,5 @@ import { submitCaseApiData } from '../data/api-data'; -import { confirmationOfNoticeGiven, dashboard, tenancyDateUnknown } from '../data/page-data'; +import { confirmationOfNoticeGiven, dashboard, feedback, tenancyDateUnknown } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; let claimantName = ''; @@ -19,6 +19,10 @@ export async function confirmationOfNoticeGivenErrorValidation(): Promise } export async function confirmationOfNoticeGivenNavigationTests(): Promise { + await performValidation('pageNavigation', confirmationOfNoticeGiven.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: confirmationOfNoticeGiven.pageSlug, + }); await performValidation('pageNavigation', confirmationOfNoticeGiven.backLink, tenancyDateUnknown.mainHeader); await performAction('clickRadioButton', confirmationOfNoticeGiven.yesRadioOption); await performValidation('pageNavigation', confirmationOfNoticeGiven.saveForLaterButton, dashboard.mainHeader); diff --git a/src/test/ui/functional/contactPreferenceEmailOrPost.pft.ts b/src/test/ui/functional/contactPreferenceEmailOrPost.pft.ts index b546d709d..79a9eeebd 100644 --- a/src/test/ui/functional/contactPreferenceEmailOrPost.pft.ts +++ b/src/test/ui/functional/contactPreferenceEmailOrPost.pft.ts @@ -1,4 +1,4 @@ -import { contactPreferenceEmailOrPost } from '../data/page-data'; +import { contactPreferenceEmailOrPost, feedback } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function contactPreferenceEmailOrPostErrorValidation(): Promise { @@ -85,9 +85,14 @@ export async function contactPreferenceEmailOrPostErrorValidation(): Promise { - if (process.env.CORRESPONDENCE_ADDRESS === 'UNKNOWN') { + +export async function contactPreferenceEmailOrPostNavigationTests(): Promise { + await performValidation('pageNavigation', contactPreferenceEmailOrPost.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: contactPreferenceEmailOrPost.pageSlug, + }); + //--The below line is commented out as we have an open bug - HDPI-5396 + /*if (process.env.CORRESPONDENCE_ADDRESS === 'UNKNOWN') { await performValidation( 'pageNavigation', contactPreferenceEmailOrPost.backLink, @@ -102,4 +107,5 @@ export async function contactPreferenceEmailOrPostErrorValidation(): Promise { @@ -46,6 +46,10 @@ export async function contactPreferencesTelephoneErrorValidation(): Promise { + await performValidation('pageNavigation', contactPreferencesTelephone.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: contactPreferencesTelephone.pageSlug, + }); await performValidation( 'pageNavigation', contactPreferencesTelephone.backLink, diff --git a/src/test/ui/functional/contactPreferencesTextMessage.pft.ts b/src/test/ui/functional/contactPreferencesTextMessage.pft.ts index 6a21e102d..cc30bb51a 100644 --- a/src/test/ui/functional/contactPreferencesTextMessage.pft.ts +++ b/src/test/ui/functional/contactPreferencesTextMessage.pft.ts @@ -1,4 +1,4 @@ -import { contactPreferencesTelephone, contactPreferencesTextMessage, dashboard } from '../data/page-data'; +import { contactPreferencesTelephone, contactPreferencesTextMessage, dashboard, feedback } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function contactPreferencesTextMessageErrorValidation(): Promise { @@ -10,6 +10,10 @@ export async function contactPreferencesTextMessageErrorValidation(): Promise { + await performValidation('pageNavigation', contactPreferencesTextMessage.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: contactPreferencesTextMessage.pageSlug, + }); await performValidation( 'pageNavigation', contactPreferencesTextMessage.backLink, diff --git a/src/test/ui/functional/correspondenceAddress.pft.ts b/src/test/ui/functional/correspondenceAddress.pft.ts index 848e6c7eb..042f10640 100644 --- a/src/test/ui/functional/correspondenceAddress.pft.ts +++ b/src/test/ui/functional/correspondenceAddress.pft.ts @@ -82,6 +82,10 @@ export async function correspondenceAddressErrorValidation(): Promise { } export async function correspondenceAddressNavigationTests(): Promise { + /* await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: freeLegalAdvice.pageSlug, + });*/ await performValidation('pageNavigation', correspondenceAddress.backLink, dateOfBirth.mainHeader); await performAction('clickRadioButton', correspondenceAddress.yesRadioOption); await performValidation('pageNavigation', correspondenceAddress.saveForLaterButton, dashboard.mainHeader); diff --git a/src/test/ui/functional/dateOfBirth.pft.ts b/src/test/ui/functional/dateOfBirth.pft.ts index 0c428bb0a..960e6a2a1 100644 --- a/src/test/ui/functional/dateOfBirth.pft.ts +++ b/src/test/ui/functional/dateOfBirth.pft.ts @@ -1,7 +1,11 @@ -import { dashboard, dateOfBirth, defendantNameCapture } from '../data/page-data'; +import { dashboard, dateOfBirth, defendantNameCapture, feedback } from '../data/page-data'; import { performValidation } from '../utils/controller'; export async function dateOfBirthNavigationTests(): Promise { + await performValidation('pageNavigation', dateOfBirth.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: dateOfBirth.pageSlug, + }); await performValidation('pageNavigation', dateOfBirth.backLink, defendantNameCapture.mainHeader); await performValidation('pageNavigation', dateOfBirth.saveForLaterButton, dashboard.mainHeader); } diff --git a/src/test/ui/functional/defendantNameCapture.pft.ts b/src/test/ui/functional/defendantNameCapture.pft.ts index f62be60a5..0441a5f95 100644 --- a/src/test/ui/functional/defendantNameCapture.pft.ts +++ b/src/test/ui/functional/defendantNameCapture.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, defendantNameCapture, freeLegalAdvice } from '../data/page-data'; +import { dashboard, defendantNameCapture, feedback, freeLegalAdvice } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; const overMaxLengthString = 'A'.repeat(61); @@ -38,6 +38,10 @@ export async function defendantNameCaptureNavigationTests(): Promise { } export async function defendantNameCaptureInputValuesPrePopulated(): Promise { + await performValidation('pageNavigation', defendantNameCapture.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: defendantNameCapture.pageSlug, + }); await performAction('inputText', defendantNameCapture.firstNameTextLabel, defendantNameCapture.firstNameTextInput); await performAction('inputText', defendantNameCapture.lastNameTextLabel, defendantNameCapture.lastNameTextInput); await performValidation('pageNavigation', freeLegalAdvice.saveForLaterButton, dashboard.mainHeader); diff --git a/src/test/ui/functional/defendantNameConfirmation.pft.ts b/src/test/ui/functional/defendantNameConfirmation.pft.ts index e2fad7c6e..23e640d05 100644 --- a/src/test/ui/functional/defendantNameConfirmation.pft.ts +++ b/src/test/ui/functional/defendantNameConfirmation.pft.ts @@ -1,4 +1,4 @@ -import { defendantNameConfirmation, freeLegalAdvice } from '../data/page-data'; +import { defendantNameConfirmation, feedback, freeLegalAdvice } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; import { defendantNameCaptureInputValuesPrePopulated } from './defendantNameCapture.pft'; @@ -46,6 +46,10 @@ export async function defendantNameConfirmationErrorValidation(): Promise }); } export async function defendantNameConfirmationNavigationTests(): Promise { + await performValidation('pageNavigation', defendantNameConfirmation.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: defendantNameConfirmation.pageSlug, + }); await performValidation('pageNavigation', defendantNameConfirmation.backLink, freeLegalAdvice.mainHeader); await performAction('clickRadioButton', { question: defendantNameConfirmation.mainHeader, diff --git a/src/test/ui/functional/disputeClaimInterstitial.pft.ts b/src/test/ui/functional/disputeClaimInterstitial.pft.ts index 57bd221eb..e6ea8cb21 100644 --- a/src/test/ui/functional/disputeClaimInterstitial.pft.ts +++ b/src/test/ui/functional/disputeClaimInterstitial.pft.ts @@ -3,10 +3,15 @@ import { contactPreferencesTextMessage, dashboard, disputeClaimInterstitial, + feedback, } from '../data/page-data'; import { performValidation } from '../utils/controller'; export async function disputeClaimInterstitialNavigationTests(): Promise { + await performValidation('pageNavigation', disputeClaimInterstitial.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: disputeClaimInterstitial.pageSlug, + }); if (process.env.CONTACT_PREFERENCES_TELEPHONE === 'YES') { await performValidation( 'pageNavigation', diff --git a/src/test/ui/functional/freeLegalAdvice.pft.ts b/src/test/ui/functional/freeLegalAdvice.pft.ts index 4e60df3f5..4df11f34d 100644 --- a/src/test/ui/functional/freeLegalAdvice.pft.ts +++ b/src/test/ui/functional/freeLegalAdvice.pft.ts @@ -1,17 +1,17 @@ -import { dashboard, freeLegalAdvice, startNow } from '../data/page-data'; +import { dashboard, feedback, freeLegalAdvice, startNow } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function freeLegalAdviceErrorValidation(): Promise { - /*await performAction('clickButton', freeLegalAdvice.saveAndContinueButton); + await performAction('clickButton', freeLegalAdvice.saveAndContinueButton); await performValidation('errorMessage', { header: freeLegalAdvice.thereIsAProblemErrorMessageHeader, message: freeLegalAdvice.youMustSayAboutFreeLegalAdviceErrorMessage, - });*/ + }); } export async function freeLegalAdviceNavigationTests(): Promise { await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { - element: freeLegalAdvice.feedbackParagraph, + element: feedback.tellUsWhatYouThinkParagraph, pageSlug: freeLegalAdvice.pageSlug, }); await performValidation('pageNavigation', freeLegalAdvice.backLink, startNow.mainHeader); diff --git a/src/test/ui/functional/landlordRegistered.pft.ts b/src/test/ui/functional/landlordRegistered.pft.ts index 7b8b1dc73..8d6f177b8 100644 --- a/src/test/ui/functional/landlordRegistered.pft.ts +++ b/src/test/ui/functional/landlordRegistered.pft.ts @@ -1,5 +1,5 @@ import { submitCaseApiData } from '../data/api-data'; -import { dashboard, disputeClaimInterstitial, landlordRegistered } from '../data/page-data'; +import { dashboard, disputeClaimInterstitial, feedback, landlordRegistered } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function landlordRegisteredErrorValidation(): Promise { @@ -12,6 +12,10 @@ export async function landlordRegisteredErrorValidation(): Promise { export async function landlordRegisteredNavigationTests(): Promise { const claimantsName = submitCaseApiData.submitCasePayload.claimantName; + await performValidation('pageNavigation', landlordRegistered.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: landlordRegistered.pageSlug, + }); await performValidation( 'pageNavigation', landlordRegistered.backLink, diff --git a/src/test/ui/functional/noticeDateWhenNotProvided.pft.ts b/src/test/ui/functional/noticeDateWhenNotProvided.pft.ts index 0108c784e..20871a6a7 100644 --- a/src/test/ui/functional/noticeDateWhenNotProvided.pft.ts +++ b/src/test/ui/functional/noticeDateWhenNotProvided.pft.ts @@ -1,4 +1,4 @@ -import { confirmationOfNoticeGiven, dashboard, noticeDateWhenNotProvided } from '../data/page-data'; +import { confirmationOfNoticeGiven, dashboard, feedback, noticeDateWhenNotProvided } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function noticeDateWhenNotProvidedErrorValidation(): Promise { @@ -15,6 +15,10 @@ export async function noticeDateWhenNotProvidedErrorValidation(): Promise } export async function noticeDateWhenNotProvidedNavigationTests(): Promise { + await performValidation('pageNavigation', noticeDateWhenNotProvided.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: noticeDateWhenNotProvided.pageSlug, + }); await performValidation('pageNavigation', noticeDateWhenNotProvided.backLink, confirmationOfNoticeGiven.mainHeader); await performValidation('pageNavigation', noticeDateWhenNotProvided.saveForLaterButton, dashboard.mainHeader); } diff --git a/src/test/ui/functional/paymentInterstitial.pft.ts b/src/test/ui/functional/paymentInterstitial.pft.ts index 7eacfc840..782493ace 100644 --- a/src/test/ui/functional/paymentInterstitial.pft.ts +++ b/src/test/ui/functional/paymentInterstitial.pft.ts @@ -1,7 +1,11 @@ -import { counterClaim, dashboard, paymentInterstitial } from '../data/page-data'; +import { counterClaim, dashboard, feedback, paymentInterstitial } from '../data/page-data'; import { performValidation } from '../utils/controller'; export async function paymentInterstitialNavigationTests(): Promise { + await performValidation('pageNavigation', paymentInterstitial.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: paymentInterstitial.pageSlug, + }); await performValidation('pageNavigation', paymentInterstitial.backLink, counterClaim.mainHeader); await performValidation('pageNavigation', paymentInterstitial.cancelLink, dashboard.mainHeader); } diff --git a/src/test/ui/functional/repaymentsMade.pft.ts b/src/test/ui/functional/repaymentsMade.pft.ts index 616d73161..0acc127ed 100644 --- a/src/test/ui/functional/repaymentsMade.pft.ts +++ b/src/test/ui/functional/repaymentsMade.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, paymentInterstitial, repaymentsMade } from '../data/page-data'; +import { dashboard, feedback, paymentInterstitial, repaymentsMade } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function repaymentsMadeErrorValidation(): Promise { @@ -25,6 +25,10 @@ export async function repaymentsMadeErrorValidation(): Promise { } export async function repaymentsMadeNavigationTests(): Promise { + await performValidation('pageNavigation', repaymentsMade.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: repaymentsMade.pageSlug, + }); await performValidation('pageNavigation', repaymentsMade.backLink, paymentInterstitial.mainHeader); await performAction('clickRadioButton', repaymentsMade.yesRadioOption); await performAction('inputText', repaymentsMade.giveDetailsHiddenTextLabel, repaymentsMade.detailsTextInput); diff --git a/src/test/ui/functional/startNow.pft.ts b/src/test/ui/functional/startNow.pft.ts index c5c203242..176ae6c12 100644 --- a/src/test/ui/functional/startNow.pft.ts +++ b/src/test/ui/functional/startNow.pft.ts @@ -1,9 +1,9 @@ -import { dashboard, startNow } from '../data/page-data'; +import { dashboard, feedback, startNow } from '../data/page-data'; import { performValidation } from '../utils/controller'; export async function startNowNavigationTests(): Promise { await performValidation('pageNavigation', startNow.feedbackLink, { - element: startNow.feedbackParagraph, + element: feedback.tellUsWhatYouThinkParagraph, pageSlug: startNow.pageSlug, }); await performValidation('pageNavigation', startNow.backLink, dashboard.mainHeader); diff --git a/src/test/ui/functional/tenancyDateDetails.pft.ts b/src/test/ui/functional/tenancyDateDetails.pft.ts index 5a93cdcef..76b84145a 100644 --- a/src/test/ui/functional/tenancyDateDetails.pft.ts +++ b/src/test/ui/functional/tenancyDateDetails.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, tenancyDateDetails, tenancyDetails } from '../data/page-data'; +import { dashboard, feedback, tenancyDateDetails, tenancyDetails } from '../data/page-data'; import { performAction, performActions, performValidation } from '../utils/controller'; export async function tenancyDateDetailsErrorValidation(): Promise { @@ -50,6 +50,10 @@ export async function tenancyDateDetailsErrorValidation(): Promise { } export async function tenancyDateDetailsNavigationTests(): Promise { + await performValidation('pageNavigation', tenancyDateDetails.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: tenancyDateDetails.pageSlug, + }); await performValidation('pageNavigation', tenancyDateDetails.backLink, tenancyDetails.mainHeader); await performAction('clickRadioButton', tenancyDateDetails.yesRadioOption); await performValidation('pageNavigation', tenancyDateDetails.saveForLaterButton, dashboard.mainHeader); diff --git a/src/test/ui/functional/tenancyDateUnknown.pft.ts b/src/test/ui/functional/tenancyDateUnknown.pft.ts index c1dfa2cd4..912d8fb02 100644 --- a/src/test/ui/functional/tenancyDateUnknown.pft.ts +++ b/src/test/ui/functional/tenancyDateUnknown.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, tenancyDateUnknown, tenancyDetails } from '../data/page-data'; +import { dashboard, feedback, tenancyDateUnknown, tenancyDetails } from '../data/page-data'; import { performAction, performActions, performValidation } from '../utils/controller'; export async function tenancyDateUnknownErrorValidation(): Promise { @@ -40,6 +40,10 @@ export async function tenancyDateUnknownErrorValidation(): Promise { } export async function tenancyDateUnknownNavigationTests(): Promise { + await performValidation('pageNavigation', tenancyDateUnknown.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: tenancyDateUnknown.pageSlug, + }); await performValidation('pageNavigation', tenancyDateUnknown.backLink, tenancyDetails.mainHeader); await performActions( 'Enter Date', From 4ec6350e2f0aa27fd08a5df7e1eb0a4c0a3503ae Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 13:41:08 +0000 Subject: [PATCH 11/25] Testing page navigation --- src/test/ui/e2eTest/respondToAClaim.spec.ts | 2 +- .../validations/custom-validations/pageNavigation.validation.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/ui/e2eTest/respondToAClaim.spec.ts b/src/test/ui/e2eTest/respondToAClaim.spec.ts index 9bf985a17..e95af7c80 100644 --- a/src/test/ui/e2eTest/respondToAClaim.spec.ts +++ b/src/test/ui/e2eTest/respondToAClaim.spec.ts @@ -60,7 +60,7 @@ test.afterEach(async () => { //All defendant details known pages and Rent-arrears routing is covered in submitCasePayload //Mix and match of testcases needs to updated in e2etests once complete routing is implemented. ex: (Tendency type HDPI-3316 etc.) test.describe('Respond to a claim - e2e Journey @nightly', async () => { - test('Respond to a claim @noDefendants @regression @accessibility', async () => { + test('@PR Respond to a claim @noDefendants @regression @accessibility', async () => { await performAction('selectLegalAdvice', freeLegalAdvice.yesRadioOption); await performAction('inputDefendantDetails', { fName: defendantNameCapture.firstNameTextInput, diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index 32782a278..18014feec 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -53,6 +53,7 @@ export class PageNavigationValidation implements IValidation { if (navigateButton.includes('Back') || navigateButton.includes('feedback')) { await performAction('clickLink', navigateButton); + await page.waitForTimeout(1000); } else { await performAction('clickButton', navigateButton); } From c922e893746a06f44dfe0b2abf3f3c39759256d8 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 13:57:40 +0000 Subject: [PATCH 12/25] added debug --- .../pageNavigation.validation.ts | 53 +++++++++++++++---- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index 18014feec..db74fd9bc 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -41,11 +41,15 @@ export class PageNavigationValidation implements IValidation { } async validate(page: Page, validation: string, navigateButton: string, fieldName: validationRecord): Promise { - PageNavigationValidation.currentPageUrl = page.url(); + const originalUrl = page.url(); + PageNavigationValidation.currentPageUrl = originalUrl; + console.log(`[DEBUG] Starting validation. Original URL: ${originalUrl}`); + let newPage: Page | null = null; let isNewWindow = false; if (navigateButton) { + console.log(`[DEBUG] Clicking button: ${navigateButton}`); const popupPromise = page .context() .waitForEvent('page') @@ -53,34 +57,54 @@ export class PageNavigationValidation implements IValidation { if (navigateButton.includes('Back') || navigateButton.includes('feedback')) { await performAction('clickLink', navigateButton); - await page.waitForTimeout(1000); } else { await performAction('clickButton', navigateButton); } + console.log(`[DEBUG] Button clicked, checking for popup...`); const popup = await Promise.race([popupPromise, new Promise(resolve => setTimeout(() => resolve(null), 1000))]); if (popup) { newPage = popup as Page; isNewWindow = true; - await newPage.waitForLoadState(); + console.log(`[DEBUG] Popup detected, waiting for load. Popup URL: ${newPage.url()}`); + await newPage.waitForLoadState('domcontentloaded'); + console.log(`[DEBUG] Popup loaded. URL: ${newPage.url()}`); + } else { + console.log(`[DEBUG] No popup detected, waiting for page navigation`); + // Wait for page to navigate after click + await page.waitForLoadState('domcontentloaded'); + console.log(`[DEBUG] Page navigation completed. Current URL: ${page.url()}`); } } const pageToValidate = isNewWindow && newPage ? newPage : page; + console.log(`[DEBUG] Validating page: ${pageToValidate.url()}`); try { await this.validatePageNavigation(pageToValidate, fieldName); + console.log(`[DEBUG] Validation completed successfully`); + } catch (error) { + console.log(`[DEBUG] Validation failed:`, error); + throw error; } finally { if (newPage && !newPage.isClosed()) { + console.log(`[DEBUG] Closing popup window`); await newPage.close(); } + // Only navigate back if we're on a different page and no new window was opened if ( PageNavigationValidation.currentPageUrl && !isNewWindow && page.url() !== PageNavigationValidation.currentPageUrl ) { + console.log(`[DEBUG] Navigating back to original URL: ${PageNavigationValidation.currentPageUrl}`); await performAction('navigateToUrl', PageNavigationValidation.currentPageUrl); + console.log(`[DEBUG] Navigation completed. Current URL: ${page.url()}`); + } else { + console.log( + `[DEBUG] Skipping navigation back. Current URL: ${page.url()}, Original URL: ${PageNavigationValidation.currentPageUrl}, isNewWindow: ${isNewWindow}` + ); } } } @@ -96,17 +120,23 @@ export class PageNavigationValidation implements IValidation { let expectedUrlPattern = ''; try { + // Wait for page to be fully ready + await page.waitForLoadState('domcontentloaded'); + console.log(`[DEBUG] Page ready for validation: ${page.url()}`); + if (fieldName && typeof fieldName === 'object') { const validationData = fieldName as any; if (validationData.element) { expectedElementText = validationData.element; + console.log(`[DEBUG] Looking for element with text: "${expectedElementText}"`); const locator = page.locator( `h1, h1.govuk-heading-xl, h1.govuk-heading-l, span:text-is("${expectedElementText}")` ); try { - await expect(locator).toHaveText(expectedElementText); + await expect(locator).toHaveText(expectedElementText, { timeout: 5000 }); actualElementText = expectedElementText; + console.log(`[DEBUG] Element found successfully`); } catch (error) { elementPassed = false; actualElementText = @@ -115,6 +145,7 @@ export class PageNavigationValidation implements IValidation { .textContent() .catch(() => 'Not found')) || 'Not found'; elementError = error instanceof Error ? error.message.split('\n')[0] : String(error); + console.log(`[DEBUG] Element not found. Actual: "${actualElementText}"`); } } @@ -122,6 +153,7 @@ export class PageNavigationValidation implements IValidation { try { expectedUrlPattern = `https://www.smartsurvey.co.uk/s/Poss_feedback/?pageurl=respond-to-claim/${validationData.pageSlug}`; actualUrl = page.url(); + console.log(`[DEBUG] Validating URL. Expected: ${expectedUrlPattern}, Actual: ${actualUrl}`); if (actualUrl !== expectedUrlPattern) { urlPassed = false; urlError = `URL mismatch. Expected: ${expectedUrlPattern}, Actual: ${actualUrl}`; @@ -134,9 +166,11 @@ export class PageNavigationValidation implements IValidation { } } else { expectedElementText = String(fieldName); + console.log(`[DEBUG] Looking for header with text: "${expectedElementText}"`); const locator = page.locator('h1, h1.govuk-heading-xl, h1.govuk-heading-l'); - await expect(locator).toHaveText(expectedElementText); + await expect(locator).toHaveText(expectedElementText, { timeout: 5000 }); actualElementText = expectedElementText; + console.log(`[DEBUG] Header found successfully`); } const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); @@ -202,12 +236,8 @@ export class PageNavigationValidation implements IValidation { if (typeof fieldName === 'object' && fieldName !== null) { const obj = fieldName as any; const parts: string[] = []; - if (obj.element) { - parts.push(`element: "${obj.element}"`); - } - if (obj.pageSlug) { - parts.push(`pageSlug: "${obj.pageSlug}"`); - } + if (obj.element) {parts.push(`element: "${obj.element}"`);} + if (obj.pageSlug) {parts.push(`pageSlug: "${obj.pageSlug}"`);} expectedValue = `{ ${parts.join(', ')} }`; } else { expectedValue = String(fieldName); @@ -224,6 +254,7 @@ export class PageNavigationValidation implements IValidation { error: error instanceof Error ? error.message.split('\n')[0] : String(error), hasPFTFile, }); + throw error; } } From dd09b84a4185dde2249ebf86eb7ebdbbeba8d1b8 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 13:59:53 +0000 Subject: [PATCH 13/25] lint fix --- .../custom-validations/pageNavigation.validation.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index db74fd9bc..ea02e43f0 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -236,8 +236,12 @@ export class PageNavigationValidation implements IValidation { if (typeof fieldName === 'object' && fieldName !== null) { const obj = fieldName as any; const parts: string[] = []; - if (obj.element) {parts.push(`element: "${obj.element}"`);} - if (obj.pageSlug) {parts.push(`pageSlug: "${obj.pageSlug}"`);} + if (obj.element) { + parts.push(`element: "${obj.element}"`); + } + if (obj.pageSlug) { + parts.push(`pageSlug: "${obj.pageSlug}"`); + } expectedValue = `{ ${parts.join(', ')} }`; } else { expectedValue = String(fieldName); From 04603268e5d76c5c9d1745c74afa42f434be98de Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 14:45:10 +0000 Subject: [PATCH 14/25] Navigation fix - 2 --- .../pageNavigation.validation.ts | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index ea02e43f0..8d0db95f0 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -41,9 +41,8 @@ export class PageNavigationValidation implements IValidation { } async validate(page: Page, validation: string, navigateButton: string, fieldName: validationRecord): Promise { - const originalUrl = page.url(); - PageNavigationValidation.currentPageUrl = originalUrl; - console.log(`[DEBUG] Starting validation. Original URL: ${originalUrl}`); + PageNavigationValidation.currentPageUrl = page.url(); + console.log(`[DEBUG] Starting validation. Original URL: ${page.url()}`); let newPage: Page | null = null; let isNewWindow = false; @@ -65,14 +64,21 @@ export class PageNavigationValidation implements IValidation { const popup = await Promise.race([popupPromise, new Promise(resolve => setTimeout(() => resolve(null), 1000))]); if (popup) { - newPage = popup as Page; - isNewWindow = true; - console.log(`[DEBUG] Popup detected, waiting for load. Popup URL: ${newPage.url()}`); - await newPage.waitForLoadState('domcontentloaded'); - console.log(`[DEBUG] Popup loaded. URL: ${newPage.url()}`); + const popupPage = popup as Page; + // Only treat as new window if it's a real page (not about:blank) + if (popupPage.url() !== 'about:blank') { + newPage = popupPage; + isNewWindow = true; + console.log(`[DEBUG] Real popup detected, waiting for load. Popup URL: ${newPage.url()}`); + await newPage.waitForLoadState('domcontentloaded'); + console.log(`[DEBUG] Popup loaded. URL: ${newPage.url()}`); + } else { + // It's a false popup (like from back button), ignore it + console.log(`[DEBUG] Detected about:blank popup, ignoring (likely from back button)`); + await popupPage.close(); + } } else { console.log(`[DEBUG] No popup detected, waiting for page navigation`); - // Wait for page to navigate after click await page.waitForLoadState('domcontentloaded'); console.log(`[DEBUG] Page navigation completed. Current URL: ${page.url()}`); } @@ -120,7 +126,6 @@ export class PageNavigationValidation implements IValidation { let expectedUrlPattern = ''; try { - // Wait for page to be fully ready await page.waitForLoadState('domcontentloaded'); console.log(`[DEBUG] Page ready for validation: ${page.url()}`); @@ -236,12 +241,8 @@ export class PageNavigationValidation implements IValidation { if (typeof fieldName === 'object' && fieldName !== null) { const obj = fieldName as any; const parts: string[] = []; - if (obj.element) { - parts.push(`element: "${obj.element}"`); - } - if (obj.pageSlug) { - parts.push(`pageSlug: "${obj.pageSlug}"`); - } + if (obj.element) {parts.push(`element: "${obj.element}"`);} + if (obj.pageSlug) {parts.push(`pageSlug: "${obj.pageSlug}"`);} expectedValue = `{ ${parts.join(', ')} }`; } else { expectedValue = String(fieldName); From 6993a8e48159750c327674a7c31c201c1807e2aa Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 14:46:00 +0000 Subject: [PATCH 15/25] lint fix --- .../custom-validations/pageNavigation.validation.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index 8d0db95f0..b1e1f27a1 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -241,8 +241,12 @@ export class PageNavigationValidation implements IValidation { if (typeof fieldName === 'object' && fieldName !== null) { const obj = fieldName as any; const parts: string[] = []; - if (obj.element) {parts.push(`element: "${obj.element}"`);} - if (obj.pageSlug) {parts.push(`pageSlug: "${obj.pageSlug}"`);} + if (obj.element) { + parts.push(`element: "${obj.element}"`); + } + if (obj.pageSlug) { + parts.push(`pageSlug: "${obj.pageSlug}"`); + } expectedValue = `{ ${parts.join(', ')} }`; } else { expectedValue = String(fieldName); From fb61729e0cacb53f960f37b80687b72a3ad54a52 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 15:06:08 +0000 Subject: [PATCH 16/25] Navigation fix - 3 --- .../pageNavigation.validation.ts | 35 ++++--------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index b1e1f27a1..17d70373e 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -42,13 +42,10 @@ export class PageNavigationValidation implements IValidation { async validate(page: Page, validation: string, navigateButton: string, fieldName: validationRecord): Promise { PageNavigationValidation.currentPageUrl = page.url(); - console.log(`[DEBUG] Starting validation. Original URL: ${page.url()}`); - let newPage: Page | null = null; let isNewWindow = false; if (navigateButton) { - console.log(`[DEBUG] Clicking button: ${navigateButton}`); const popupPromise = page .context() .waitForEvent('page') @@ -60,57 +57,39 @@ export class PageNavigationValidation implements IValidation { await performAction('clickButton', navigateButton); } - console.log(`[DEBUG] Button clicked, checking for popup...`); const popup = await Promise.race([popupPromise, new Promise(resolve => setTimeout(() => resolve(null), 1000))]); if (popup) { const popupPage = popup as Page; - // Only treat as new window if it's a real page (not about:blank) - if (popupPage.url() !== 'about:blank') { + // Wait a bit for the popup to load its real URL + await page.waitForTimeout(500); + + // Only treat as new window if it's a real page (not about:blank and not an axe popup) + if (popupPage.url() !== 'about:blank' && !popupPage.url().includes('axe')) { newPage = popupPage; isNewWindow = true; - console.log(`[DEBUG] Real popup detected, waiting for load. Popup URL: ${newPage.url()}`); - await newPage.waitForLoadState('domcontentloaded'); - console.log(`[DEBUG] Popup loaded. URL: ${newPage.url()}`); + await newPage.waitForLoadState(); } else { - // It's a false popup (like from back button), ignore it - console.log(`[DEBUG] Detected about:blank popup, ignoring (likely from back button)`); + // It's a false popup (axe or about:blank), close it and continue await popupPage.close(); } - } else { - console.log(`[DEBUG] No popup detected, waiting for page navigation`); - await page.waitForLoadState('domcontentloaded'); - console.log(`[DEBUG] Page navigation completed. Current URL: ${page.url()}`); } } const pageToValidate = isNewWindow && newPage ? newPage : page; - console.log(`[DEBUG] Validating page: ${pageToValidate.url()}`); try { await this.validatePageNavigation(pageToValidate, fieldName); - console.log(`[DEBUG] Validation completed successfully`); - } catch (error) { - console.log(`[DEBUG] Validation failed:`, error); - throw error; } finally { if (newPage && !newPage.isClosed()) { - console.log(`[DEBUG] Closing popup window`); await newPage.close(); } - // Only navigate back if we're on a different page and no new window was opened if ( PageNavigationValidation.currentPageUrl && !isNewWindow && page.url() !== PageNavigationValidation.currentPageUrl ) { - console.log(`[DEBUG] Navigating back to original URL: ${PageNavigationValidation.currentPageUrl}`); await performAction('navigateToUrl', PageNavigationValidation.currentPageUrl); - console.log(`[DEBUG] Navigation completed. Current URL: ${page.url()}`); - } else { - console.log( - `[DEBUG] Skipping navigation back. Current URL: ${page.url()}, Original URL: ${PageNavigationValidation.currentPageUrl}, isNewWindow: ${isNewWindow}` - ); } } } From de729322572b913058c7ce0b0e010f06ed011a65 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 16:55:29 +0000 Subject: [PATCH 17/25] Navigation fix - 4 --- .../pageNavigation.validation.ts | 44 +++---------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts index 17d70373e..62dfe020e 100644 --- a/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageNavigation.validation.ts @@ -53,26 +53,17 @@ export class PageNavigationValidation implements IValidation { if (navigateButton.includes('Back') || navigateButton.includes('feedback')) { await performAction('clickLink', navigateButton); + await page.waitForTimeout(200); } else { await performAction('clickButton', navigateButton); } const popup = await Promise.race([popupPromise, new Promise(resolve => setTimeout(() => resolve(null), 1000))]); - if (popup) { - const popupPage = popup as Page; - // Wait a bit for the popup to load its real URL - await page.waitForTimeout(500); - - // Only treat as new window if it's a real page (not about:blank and not an axe popup) - if (popupPage.url() !== 'about:blank' && !popupPage.url().includes('axe')) { - newPage = popupPage; - isNewWindow = true; - await newPage.waitForLoadState(); - } else { - // It's a false popup (axe or about:blank), close it and continue - await popupPage.close(); - } + if (popup && (popup as Page).url() !== 'about:blank') { + newPage = popup as Page; + isNewWindow = true; + await newPage.waitForLoadState(); } } @@ -105,22 +96,17 @@ export class PageNavigationValidation implements IValidation { let expectedUrlPattern = ''; try { - await page.waitForLoadState('domcontentloaded'); - console.log(`[DEBUG] Page ready for validation: ${page.url()}`); - if (fieldName && typeof fieldName === 'object') { const validationData = fieldName as any; if (validationData.element) { expectedElementText = validationData.element; - console.log(`[DEBUG] Looking for element with text: "${expectedElementText}"`); const locator = page.locator( `h1, h1.govuk-heading-xl, h1.govuk-heading-l, span:text-is("${expectedElementText}")` ); try { - await expect(locator).toHaveText(expectedElementText, { timeout: 5000 }); + await expect(locator).toHaveText(expectedElementText); actualElementText = expectedElementText; - console.log(`[DEBUG] Element found successfully`); } catch (error) { elementPassed = false; actualElementText = @@ -129,7 +115,6 @@ export class PageNavigationValidation implements IValidation { .textContent() .catch(() => 'Not found')) || 'Not found'; elementError = error instanceof Error ? error.message.split('\n')[0] : String(error); - console.log(`[DEBUG] Element not found. Actual: "${actualElementText}"`); } } @@ -137,7 +122,6 @@ export class PageNavigationValidation implements IValidation { try { expectedUrlPattern = `https://www.smartsurvey.co.uk/s/Poss_feedback/?pageurl=respond-to-claim/${validationData.pageSlug}`; actualUrl = page.url(); - console.log(`[DEBUG] Validating URL. Expected: ${expectedUrlPattern}, Actual: ${actualUrl}`); if (actualUrl !== expectedUrlPattern) { urlPassed = false; urlError = `URL mismatch. Expected: ${expectedUrlPattern}, Actual: ${actualUrl}`; @@ -150,11 +134,9 @@ export class PageNavigationValidation implements IValidation { } } else { expectedElementText = String(fieldName); - console.log(`[DEBUG] Looking for header with text: "${expectedElementText}"`); const locator = page.locator('h1, h1.govuk-heading-xl, h1.govuk-heading-l'); - await expect(locator).toHaveText(expectedElementText, { timeout: 5000 }); + await expect(locator).toHaveText(expectedElementText); actualElementText = expectedElementText; - console.log(`[DEBUG] Header found successfully`); } const pageName = await PageNavigationValidation.getPageNameFromUrl(page.url(), page); @@ -242,7 +224,6 @@ export class PageNavigationValidation implements IValidation { error: error instanceof Error ? error.message.split('\n')[0] : String(error), hasPFTFile, }); - throw error; } } @@ -385,7 +366,6 @@ export class PageNavigationValidation implements IValidation { const failureDetails = new Map(); const failedPages = new Set(); const passedPages = new Set(); - let urlFailuresCount = 0; for (const result of PageNavigationValidation.navigationResults) { if (!result.passed) { @@ -398,9 +378,6 @@ export class PageNavigationValidation implements IValidation { validationType: result.validationType, }); } - if (result.validationType === 'url') { - urlFailuresCount++; - } } else if (result.hasPFTFile) { failedPages.add(result.pageName); if (result.expected && result.actual) { @@ -410,9 +387,6 @@ export class PageNavigationValidation implements IValidation { validationType: result.validationType, }); } - if (result.validationType === 'url') { - urlFailuresCount++; - } } else { console.log(` ⚠️ Unattributed failure on ${result.pageName}: ${result.error}`); } @@ -444,10 +418,6 @@ export class PageNavigationValidation implements IValidation { ` Missing navigation methods: ${PageNavigationValidation.missingNavigationMethods.size + PageNavigationValidation.missingNavigationFiles.size}` ); - if (urlFailuresCount > 0) { - console.log(` ⚠️ Page slug URL validation failures: ${urlFailuresCount}`); - } - if (passedPages.size > 0) { console.log(` Passed pages: ${Array.from(passedPages).join(', ')}`); } From 10e061fcf97d19c18e2137c12046fed4a3324d31 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 17:12:54 +0000 Subject: [PATCH 18/25] title changed --- src/test/ui/e2eTest/respondToAClaim.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/e2eTest/respondToAClaim.spec.ts b/src/test/ui/e2eTest/respondToAClaim.spec.ts index e95af7c80..9bf985a17 100644 --- a/src/test/ui/e2eTest/respondToAClaim.spec.ts +++ b/src/test/ui/e2eTest/respondToAClaim.spec.ts @@ -60,7 +60,7 @@ test.afterEach(async () => { //All defendant details known pages and Rent-arrears routing is covered in submitCasePayload //Mix and match of testcases needs to updated in e2etests once complete routing is implemented. ex: (Tendency type HDPI-3316 etc.) test.describe('Respond to a claim - e2e Journey @nightly', async () => { - test('@PR Respond to a claim @noDefendants @regression @accessibility', async () => { + test('Respond to a claim @noDefendants @regression @accessibility', async () => { await performAction('selectLegalAdvice', freeLegalAdvice.yesRadioOption); await performAction('inputDefendantDetails', { fName: defendantNameCapture.firstNameTextInput, From f5caf6e8cff1cc33b6f2236bff45cf5f19ead192 Mon Sep 17 00:00:00 2001 From: Gautham059 Date: Wed, 25 Mar 2026 17:35:43 +0000 Subject: [PATCH 19/25] Relocated feedback link logic --- src/test/ui/functional/defendantNameCapture.pft.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/ui/functional/defendantNameCapture.pft.ts b/src/test/ui/functional/defendantNameCapture.pft.ts index 0441a5f95..d7dff357f 100644 --- a/src/test/ui/functional/defendantNameCapture.pft.ts +++ b/src/test/ui/functional/defendantNameCapture.pft.ts @@ -33,15 +33,15 @@ export async function defendantNameCaptureErrorValidation(): Promise { }); } export async function defendantNameCaptureNavigationTests(): Promise { + await performValidation('pageNavigation', defendantNameCapture.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: defendantNameCapture.pageSlug, + }); await performValidation('pageNavigation', defendantNameCapture.backLink, freeLegalAdvice.mainHeader); await defendantNameCaptureInputValuesPrePopulated(); } export async function defendantNameCaptureInputValuesPrePopulated(): Promise { - await performValidation('pageNavigation', defendantNameCapture.feedbackLink, { - element: feedback.tellUsWhatYouThinkParagraph, - pageSlug: defendantNameCapture.pageSlug, - }); await performAction('inputText', defendantNameCapture.firstNameTextLabel, defendantNameCapture.firstNameTextInput); await performAction('inputText', defendantNameCapture.lastNameTextLabel, defendantNameCapture.lastNameTextInput); await performValidation('pageNavigation', freeLegalAdvice.saveForLaterButton, dashboard.mainHeader); From 6239f184e75da243c5a8292c45a2f04aeb52c0b4 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Wed, 25 Mar 2026 18:15:36 +0000 Subject: [PATCH 20/25] updated the page data files --- src/test/ui/data/page-data/correspondenceAddress.page.data.ts | 2 -- src/test/ui/functional/correspondenceAddress.pft.ts | 4 ---- 2 files changed, 6 deletions(-) diff --git a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts index e88d65750..743d46a52 100644 --- a/src/test/ui/data/page-data/correspondenceAddress.page.data.ts +++ b/src/test/ui/data/page-data/correspondenceAddress.page.data.ts @@ -59,6 +59,4 @@ export const correspondenceAddress = { { type: `empty`, label: `Postcode`, errMessage: `Enter a valid UK postcode` }, ], }, - /* feedbackLink: `feedback (opens in new tab)`, - pageSlug: `date-of-birth`,*/ }; diff --git a/src/test/ui/functional/correspondenceAddress.pft.ts b/src/test/ui/functional/correspondenceAddress.pft.ts index 042f10640..848e6c7eb 100644 --- a/src/test/ui/functional/correspondenceAddress.pft.ts +++ b/src/test/ui/functional/correspondenceAddress.pft.ts @@ -82,10 +82,6 @@ export async function correspondenceAddressErrorValidation(): Promise { } export async function correspondenceAddressNavigationTests(): Promise { - /* await performValidation('pageNavigation', freeLegalAdvice.feedbackLink, { - element: feedback.tellUsWhatYouThinkParagraph, - pageSlug: freeLegalAdvice.pageSlug, - });*/ await performValidation('pageNavigation', correspondenceAddress.backLink, dateOfBirth.mainHeader); await performAction('clickRadioButton', correspondenceAddress.yesRadioOption); await performValidation('pageNavigation', correspondenceAddress.saveForLaterButton, dashboard.mainHeader); From b0b313098276602e65861507a138aad3ededfd6a Mon Sep 17 00:00:00 2001 From: padmakumari Date: Thu, 26 Mar 2026 09:33:34 +0000 Subject: [PATCH 21/25] resolved the conflicts and updated the feedback link validation for new pages --- src/test/ui/data/page-data/landlordLicensed.page.data.ts | 2 ++ src/test/ui/functional/landlordLicensed.pft.ts | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/ui/data/page-data/landlordLicensed.page.data.ts b/src/test/ui/data/page-data/landlordLicensed.page.data.ts index 69264be77..1e9414a98 100644 --- a/src/test/ui/data/page-data/landlordLicensed.page.data.ts +++ b/src/test/ui/data/page-data/landlordLicensed.page.data.ts @@ -13,4 +13,6 @@ export const landlordLicensed = { cymraegLink: `Cymraeg`, thereIsAProblemErrorMessageHeader: `There is a problem`, selectIfYouAgreeWithLandlordsClaimLicensedErrorMessage: `Select if you agree with the landlord’s claim to be licensed`, + feedbackLink: `feedback (opens in new tab)`, + pageSlug: `landlord-licensed`, }; diff --git a/src/test/ui/functional/landlordLicensed.pft.ts b/src/test/ui/functional/landlordLicensed.pft.ts index 319255574..773dc4349 100644 --- a/src/test/ui/functional/landlordLicensed.pft.ts +++ b/src/test/ui/functional/landlordLicensed.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, landlordLicensed, landlordRegistered } from '../data/page-data'; +import { dashboard, feedback, landlordLicensed, landlordRegistered } from '../data/page-data'; import { performAction, performValidation } from '../utils/controller'; export async function landlordLicensedErrorValidation(): Promise { @@ -10,6 +10,10 @@ export async function landlordLicensedErrorValidation(): Promise { } export async function landlordLicensedNavigationTests(): Promise { + await performValidation('pageNavigation', landlordLicensed.feedbackLink, { + element: feedback.tellUsWhatYouThinkParagraph, + pageSlug: landlordLicensed.pageSlug, + }); await performValidation('pageNavigation', landlordLicensed.backLink, landlordRegistered.mainHeader); await performAction('clickRadioButton', landlordLicensed.yesRadioOption); await performValidation('pageNavigation', landlordLicensed.saveForLaterButton, dashboard.mainHeader); From 49462129485a5cd630874bff553625ae97b77089 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Thu, 26 Mar 2026 13:37:50 +0000 Subject: [PATCH 22/25] removed feedbackParagraph key --- .../validations/custom-validations/pageContent.validation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts b/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts index 246e3c319..cdc9914d4 100644 --- a/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts +++ b/src/test/ui/utils/validations/custom-validations/pageContent.validation.ts @@ -149,7 +149,6 @@ export class PageContentValidation implements IValidation { key.includes('Input') || key.includes('Hidden') || key.includes('Validation') || - key.includes('feedbackParagraph') || key.includes('pageSlug') || key.includes('ErrorMessage') ) { From 64293ecebaf1786d60bcf8ee49b67052822e5f6b Mon Sep 17 00:00:00 2001 From: Pardeep Singh Basi Date: Fri, 27 Mar 2026 11:38:50 +0000 Subject: [PATCH 23/25] fix: cve issues --- package.json | 1 - yarn-audit-known-issues | 1 - yarn.lock | 41 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ff67e9c87..bbe577406 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,6 @@ "js-yaml": "^4.1.1", "@azure/msal-browser": "4.27.0", "superagent": "10.2.3", - "brace-expansion": "2.0.2", "diff": "^8.0.3", "form-data": "^4.0.4", "@eslint/plugin-kit": "^0.5.0", diff --git a/yarn-audit-known-issues b/yarn-audit-known-issues index 4615d3351..e69de29bb 100644 --- a/yarn-audit-known-issues +++ b/yarn-audit-known-issues @@ -1 +0,0 @@ -{"value":"minimatch","children":{"ID":1113371,"Issue":"minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern","URL":"https://github.com/advisories/GHSA-3ppc-4f35-3m26","Severity":"high","Vulnerable Versions":"<10.2.1","Tree Versions":["3.1.3","9.0.6"],"Dependents":["eslint@virtual:5578f0b4f0946e03056c35ce2c97c3b2453d39e80c228ac05efcf6a35db69023d504a3bfa190f8432c9978e2c40409e85ef9d9426658e6ed4acc25fc3cf04cfb#npm:9.39.1","glob@npm:13.0.6"]}} diff --git a/yarn.lock b/yarn.lock index 1148946d7..1fc7299b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6201,6 +6201,13 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10/fb07bb66a0959c2843fc055838047e2a95ccebb837c519614afb067ebfdf2fa967ca8d712c35ced07f2cd26fc6f07964230b094891315ad74f11eba3d53178a0 + languageName: node + linkType: hard + "bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": version: 2.8.2 resolution: "bare-events@npm:2.8.2" @@ -6348,12 +6355,31 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:2.0.2": - version: 2.0.2 - resolution: "brace-expansion@npm:2.0.2" +"brace-expansion@npm:^1.1.7": + version: 1.1.13 + resolution: "brace-expansion@npm:1.1.13" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10/01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 + concat-map: "npm:0.0.1" + checksum: 10/b5f4329fdbe9d2e25fa250c8f866ebd054ba946179426e99b86dcccddabdb1d481f0e40ee5430032e62a7d0a6c2837605ace6783d015aa1d65d85ca72154d936 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.2": + version: 2.0.3 + resolution: "brace-expansion@npm:2.0.3" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10/e9dd66caaf0784126e1654f1bc19adb28f3ef86f39f2226f833f7700ec727c141f6cd85eaa47bacf3426beda01c9fbc3a2f28174cf59330dc9b58ffaf9e09d96 + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.2": + version: 5.0.5 + resolution: "brace-expansion@npm:5.0.5" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10/f259b2ddf04489da9512ad637ba6b4ef2d77abd4445d20f7f1714585f153435200a53fa6a2e4a5ee974df14ddad4cd16421f6f803e96e8b452bd48598878d0ee languageName: node linkType: hard @@ -6883,6 +6909,13 @@ __metadata: languageName: node linkType: hard +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10/9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 + languageName: node + linkType: hard + "config@npm:^3.3.9": version: 3.3.12 resolution: "config@npm:3.3.12" From a4ef03ea0addea3311e29367f825ebbffc8383f9 Mon Sep 17 00:00:00 2001 From: Pardeep Singh Basi Date: Fri, 27 Mar 2026 17:21:39 +0000 Subject: [PATCH 24/25] fix: cve issues --- yarn.lock | 7 ------- 1 file changed, 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index aefe83d73..78e739a44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6883,13 +6883,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10/9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 - languageName: node - linkType: hard - "config@npm:^3.3.9": version: 3.3.12 resolution: "config@npm:3.3.12" From 9290b0dff80c6faf50be3dfb1586397617957d16 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 30 Mar 2026 11:15:24 +0100 Subject: [PATCH 25/25] updated the changes as per the tenancyTypeDetails files --- .../ui/e2eTest/respondToClaimWales.spec.ts | 1 + .../ui/functional/tenancyDateDetails.pft.ts | 4 ++-- .../ui/functional/tenancyTypeDetails.pft.ts | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/test/ui/e2eTest/respondToClaimWales.spec.ts b/src/test/ui/e2eTest/respondToClaimWales.spec.ts index 798a9f26d..553052af2 100644 --- a/src/test/ui/e2eTest/respondToClaimWales.spec.ts +++ b/src/test/ui/e2eTest/respondToClaimWales.spec.ts @@ -24,6 +24,7 @@ const home_url = config.get('e2e.testUrl') as string; test.beforeEach(async ({ page }) => { initializeExecutor(page); process.env.WALES_POSTCODE = 'YES'; + process.env.CLAIMANT_NAME = submitCaseApiDataWales.submitCasePayload.claimantName; await performAction('createCaseAPI', { data: createCaseApiWalesData.createCasePayload }); await performAction('submitCaseAPI', { data: submitCaseApiDataWales.submitCasePayload }); await performAction('fetchPINsAPI'); diff --git a/src/test/ui/functional/tenancyDateDetails.pft.ts b/src/test/ui/functional/tenancyDateDetails.pft.ts index 76b84145a..9d6dd0772 100644 --- a/src/test/ui/functional/tenancyDateDetails.pft.ts +++ b/src/test/ui/functional/tenancyDateDetails.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, feedback, tenancyDateDetails, tenancyDetails } from '../data/page-data'; +import { dashboard, feedback, tenancyDateDetails, tenancyTypeDetails } from '../data/page-data'; import { performAction, performActions, performValidation } from '../utils/controller'; export async function tenancyDateDetailsErrorValidation(): Promise { @@ -54,7 +54,7 @@ export async function tenancyDateDetailsNavigationTests(): Promise { element: feedback.tellUsWhatYouThinkParagraph, pageSlug: tenancyDateDetails.pageSlug, }); - await performValidation('pageNavigation', tenancyDateDetails.backLink, tenancyDetails.mainHeader); + await performValidation('pageNavigation', tenancyDateDetails.backLink, tenancyTypeDetails.mainHeader); await performAction('clickRadioButton', tenancyDateDetails.yesRadioOption); await performValidation('pageNavigation', tenancyDateDetails.saveForLaterButton, dashboard.mainHeader); } diff --git a/src/test/ui/functional/tenancyTypeDetails.pft.ts b/src/test/ui/functional/tenancyTypeDetails.pft.ts index f900f45de..ec0ba372b 100644 --- a/src/test/ui/functional/tenancyTypeDetails.pft.ts +++ b/src/test/ui/functional/tenancyTypeDetails.pft.ts @@ -1,4 +1,4 @@ -import { dashboard, disputeClaimInterstitial, tenancyTypeDetails } from '../data/page-data'; +import { dashboard, disputeClaimInterstitial, tenancyTypeDetails, writtenTerms } from '../data/page-data'; import { claimantsName } from '../utils/actions/custom-actions'; import { performAction, performValidation } from '../utils/controller'; @@ -25,10 +25,18 @@ export async function tenancyTypeDetailsErrorValidation(): Promise { } export async function tenancyTypeDetailsNavigationTests(): Promise { - if (claimantsName) { - const backHeader = _backNavigationHeader ?? disputeClaimInterstitial.getMainHeader(claimantsName); - _backNavigationHeader = null; - await performValidation('pageNavigation', tenancyTypeDetails.backLink, backHeader); + if (process.env.WALES_POSTCODE === 'YES') { + if (claimantsName) { + await performValidation('pageNavigation', tenancyTypeDetails.backLink, writtenTerms.mainHeader); + } + } else { + if (claimantsName) { + await performValidation( + 'pageNavigation', + tenancyTypeDetails.backLink, + disputeClaimInterstitial.getMainHeader(claimantsName) + ); + } } await performAction('clickRadioButton', tenancyTypeDetails.yesRadioOption); await performValidation('pageNavigation', tenancyTypeDetails.saveForLaterButton, dashboard.mainHeader);