From 889527506bd429c0bd1f7a71bc00e0e7e6fd0e00 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 20 Jul 2026 11:54:43 +0100 Subject: [PATCH 1/7] HDPI-6501-Automation-EXUI-CaseWorker-ReviewDates --- .../addReviewDates.page.data.ts | 42 +++++++++ ...heckYourAnswersAddReviewDates.page.data.ts | 7 ++ .../confirmReviewDatesAdded.page.data.ts | 7 ++ .../page-data-caseManagement-figma/index.ts | 3 + .../urlToFileMappingCM.ts | 3 + .../data/page-data/caseSummary.page.data.ts | 3 +- .../caseManagement.addReviewDates.spec.ts | 65 ++++++++++++++ .../caseManagement.action.ts | 86 ++++++++++++++++--- .../caseManagementErrorValidation.action.ts | 31 ++++++- .../action-caseManagement.registry.ts | 5 +- 10 files changed, 238 insertions(+), 14 deletions(-) create mode 100644 src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts create mode 100644 src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/checkYourAnswersAddReviewDates.page.data.ts create mode 100644 src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/confirmReviewDatesAdded.page.data.ts create mode 100644 src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts new file mode 100644 index 0000000000..1cb7ed6de8 --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -0,0 +1,42 @@ +export const addReviewDates = { + mainHeader: `Review dates`, + addReviewDateHintText: `Add review date`, + reviewDateSubHeader: `Review date`, + dateOfReviewLabel: `Date of review`, + addNewButton:`Add new`, + dayTextLabel: `Day`, + monthTextLabel: `Month`, + yearTextLabel: `Year`, + reasonLabel: `Reason`, + unlessOrderRadioOption:`Unless order`, + StayCaseRadioOption: `Stay a case`, + liftStayRadioOption: `Lift a stay`, + dismissCaseRadioOption: `Dismiss case`, + generalOrderRadioOption: `General order`, + OtherRadioOption: `Other`, + descriptionTextLabel: `Description of review`, + youCanEnterUpToHiddenHintText: `You can enter up to 500 characters`, + removeButton:`Remove`, + continueButton: `Continue`, + previousButton: `Previous`, + cancelLink: `Cancel`, + dayInputText :`20`, + monthInputText :`12`, + yearInputText :`2030`, + descriptionTextInput:`50`, + errorValidation: `YES`, + eventCouldNotBeCreatedErrorMessageHeader: 'The event could not be created', + errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField` }, + errorValidationField: { + errorDateField: [ + { type: 'none', input: '', errMessage: `Date of review is required` } + ], + errorRadioOption: [ + { type: 'none', input: '', errMessage: `Reason is required` } + ], + errorTextField: [ + { type: 'none', input: '', errMessage: `Description of review is required` }, + {type: 'one', input: '510', errMessage: `In ‘Description of review’, you have entered more than the maximum number of characters (500)` } + ], + }, +}; diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/checkYourAnswersAddReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/checkYourAnswersAddReviewDates.page.data.ts new file mode 100644 index 0000000000..d2044cf883 --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/checkYourAnswersAddReviewDates.page.data.ts @@ -0,0 +1,7 @@ +export const checkYourAnswersAddReviewDates = { + mainHeader: `Add review date`, + cyaHeader: `Check your answers`, + submitButton: `Submit`, + previousButton: `Previous`, + cancelLink: `Cancel`, +}; diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/confirmReviewDatesAdded.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/confirmReviewDatesAdded.page.data.ts new file mode 100644 index 0000000000..06446b37b9 --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/confirmReviewDatesAdded.page.data.ts @@ -0,0 +1,7 @@ +export const confirmReviewDatesAdded = { + mainHeader: `Add review date`, + reviewDatesAdded: `Review dates added`, + whatHappensNextHeader: `What happens next`, + theCaseWillParagraph: `Work allocation tasks will be created for court staff to complete on the review dates.`, + closeAndReturnToCaseOverviewButton: `Close and Return to case details`, +}; diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/index.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/index.ts index 2afc27d86e..55f01357b5 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/index.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/index.ts @@ -1,2 +1,5 @@ export * from './selectDocument.page.data'; export * from './amendDocumentDetails.page.data'; +export * from './addReviewDates.page.data'; +export * from './checkYourAnswersAddReviewDates.page.data' +export * from './confirmReviewDatesAdded.page.data' diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts index 7032021a9a..5e9a5d9cbb 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts @@ -1,3 +1,6 @@ export default { 'amendDocumentsselectDocument': 'selectDocument', + 'addCaseReviewDateaddCaseReviewDate': 'addReviewDate', + 'addCaseReviewDate/submit' : 'checkYourAnswersAddReviewDate', + 'addCaseReviewDate/confirm': 'confirmReviewDatesAdded' }; diff --git a/src/e2eTest/data/page-data/caseSummary.page.data.ts b/src/e2eTest/data/page-data/caseSummary.page.data.ts index 3ebffafb43..243badcae0 100644 --- a/src/e2eTest/data/page-data/caseSummary.page.data.ts +++ b/src/e2eTest/data/page-data/caseSummary.page.data.ts @@ -15,5 +15,6 @@ export const caseSummary = { serviceRequestTab: 'Service Request', manageDocuments:{ amend : 'Manage documents: Amend' - } + }, + addReviewDates: 'Add review date', } diff --git a/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts new file mode 100644 index 0000000000..040a7392f9 --- /dev/null +++ b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts @@ -0,0 +1,65 @@ +import { createCaseApiData, makeAnApplicationApiData, submitCaseApiData } from '@data/api-data'; +import {initializeExecutor, performValidation} from '@utils/controller'; +import test from '@playwright/test'; +import { caseInfo, defendantUserDetails } from '@utils/actions/custom-actions'; +import { PageContentValidation } from '@utils/validations/element-validations/pageContent.validation'; +import { caseSummary, user } from '@data/page-data'; +import { dismissCookieBanner } from '@config/cookie-banner'; +import { initializeCMExecutor, performAction } from '@utils/controller-caseManagement'; +import {addReviewDates, checkYourAnswersAddReviewDates} from "@data/page-data-figma/page-data-caseManagement-figma"; + + +test.use({ storageState: undefined }) + +test.beforeEach(async ({ page, context }) => { + await context.clearCookies(); + initializeExecutor(page); + initializeCMExecutor(page); + await performAction('createCaseAPI', { data: createCaseApiData.createCasePayload }); + await performAction('submitCaseAPI', { data: submitCaseApiData.submitCasePayloadCaseFileView }); + await performAction('updatePaymentAPI'); + await performAction('getCaseAPI', 'Link Solicitor'); + + // for (const defendant of defendantUserDetails) { + // await performAction('makeAnApplicationAPI', { + // data: makeAnApplicationApiData.makeAnApplicationAdjournPayload( + // defendant.id, + // defendant.name + // ), + // }); + // }; + + await performAction('navigateToUrl', process.env.MANAGE_CASE_BASE_URL); + await dismissCookieBanner(page, 'additional'); + await performAction('login', user.staffAdmin); + await dismissCookieBanner(page, 'analytics'); + await performAction('navigateToSummaryPage'); +}); + +test.afterEach(async () => { + if (caseInfo.id) { + await performAction('deleteCaseRole', '[CLAIMANTSOLICITOR]'); + } + PageContentValidation.finaliseTest(); + +}); + +test.describe('Case management - Case Worker Add Review date @nightly', async () => { + test('Case management - Case Worker Add Review Date @CM @regression', async () => { + await performAction('selectAnEvent', { eventType: caseSummary.addReviewDates }); + await performValidation('mainHeader', addReviewDates.mainHeader); + performAction('clickButton', addReviewDates.addNewButton); + await performAction('errorValidationAddReviewDatesPage', addReviewDates.errorValidation); + await performAction('addReviewDates', { + Day: addReviewDates.dayInputText, + Month: addReviewDates.monthInputText, + Year: addReviewDates.yearInputText, + question: addReviewDates.reasonLabel, option: addReviewDates.dismissCaseRadioOption, + label: addReviewDates.descriptionTextLabel, userInput: addReviewDates.descriptionTextInput, + nextPage: checkYourAnswersAddReviewDates.mainHeader + }); + await performAction('clickButton', checkYourAnswersAddReviewDates.submitButton); + await performAction('confirmReviewDatesAdded'); + await performValidation('bannerAlert', 'Case #.* has been updated with event: Add review date'); + }); +}); diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index 6aa019db95..b38140c7cf 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -6,7 +6,14 @@ import { getCaseTypeId } from '@utils/common/caseType.utils'; import { performAction, performValidation } from '@utils/controller-caseManagement'; import { VERY_LONG_TIMEOUT } from 'playwright.config'; import { caseSummary, home } from '@data/page-data'; -import { selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import { + addReviewDates, + confirmReviewDatesAdded, + selectDocument +} from '@data/page-data-figma/page-data-caseManagement-figma'; +import {generateRandomString} from "@utils/common/string.utils"; +import {performActions} from "@utils/controller"; +import {caseInfo} from "@utils/actions/custom-actions"; export const addressInfo = { @@ -24,6 +31,8 @@ export class CaseManagementAction implements IAction { ['navigateToSummaryPage', () => this.navigateToSummaryPage(page)], ['selectAnEvent', () => this.selectAnEvent(fieldName as actionRecord)], ['selectDocumentToAmend', () => this.selectDocumentToAmend(fieldName as actionRecord)], + ['addReviewDates', () => this.addReviewDates(fieldName as actionRecord)], + ['confirmReviewDatesAdded', () => this.confirmReviewDatesAdded()], ['inputErrorValidation', () => this.inputErrorValidation(page, fieldName as actionRecord)], ]); @@ -58,34 +67,72 @@ export class CaseManagementAction implements IAction { } + private async addReviewDates(reviewDateData: actionRecord){ + await performValidation('text', { elementType: 'paragraph', text: 'Case number: ' + caseInfo.fid }); + await performValidation('text', { + elementType: 'paragraph', + text: `Property address: ${addressInfo.buildingStreet}, ${addressInfo.townCity}, ${addressInfo.engOrWalPostcode}` + }); + const userInput = + typeof reviewDateData.input === 'number' + ? generateRandomString(reviewDateData.input) + : (reviewDateData.input as string); + await performActions( + 'Date of Review', + ['inputText', addReviewDates.dayTextLabel, reviewDateData.Day], + ['inputText', addReviewDates.monthTextLabel, reviewDateData.Month], + ['inputText', addReviewDates.yearTextLabel, reviewDateData.Year] + ); + await performAction('clickRadioButton', { question: reviewDateData.question, option: reviewDateData.option }); + await performAction('inputText', reviewDateData.label, reviewDateData.userInput); + await performAction('reTryOnCallBackError', addReviewDates.continueButton, reviewDateData.nextPage as string); + } + + private async confirmReviewDatesAdded(): Promise { + await performValidation('text', { elementType: 'paragraph', text: 'Case number: ' + caseInfo.fid }); + await performValidation('text', { + elementType: 'paragraph', + text: `Property address: ${addressInfo.buildingStreet}, ${addressInfo.townCity}, ${addressInfo.engOrWalPostcode}` + }); + await performValidation('text', { elementType: 'inlineText', text: confirmReviewDatesAdded.reviewDatesAdded}); + await performValidation('text', { elementType: 'inlineText', text: 'Case number #' + caseInfo.fid }); + await performValidation('text', { + elementType: 'inlineText', + text: `${addressInfo.buildingStreet}, ${addressInfo.addressLine2}, ${addressInfo.townCity}, ${addressInfo.engOrWalPostcode}` + }); + await performValidation('mainHeader', confirmReviewDatesAdded.mainHeader); + await performAction('clickButton', confirmReviewDatesAdded.closeAndReturnToCaseOverviewButton); + } + + private async inputErrorValidation(page: Page, validationArr: actionRecord) { - - + + if (Array.isArray(validationArr.inputArray)) { for (const item of validationArr.inputArray) { switch (validationArr.validationType) { - - + + case 'radioOptions': await performAction('clickButton', validationArr.button); await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errInlineMessage); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); await performAction('clickRadioButton', { question: validationArr.question, option: validationArr.option }); break; - + case 'checkBox': await performAction('clickButton', validationArr.button); await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errMessage); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); await performAction('check', validationArr.checkBox); break; - + case 'checkBoxPageLevel': await performAction('clickButton', validationArr.button); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); await performAction('check', validationArr.checkBox); break; - + case 'dropDown': await performAction('clickButton', validationArr.button); await expect(async () => { @@ -96,10 +143,29 @@ export class CaseManagementAction implements IAction { }); await performAction('select', validationArr.dropQn, validationArr.option); break; - + + case 'textField': + await performAction('inputText', validationArr.label, generateRandomString(item.input)); + await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', validationArr.label, item.errMessage); + break; + + case 'dateField': + await performAction('clickButton', validationArr.button); + await performValidation( + 'inputError', + !validationArr?.label ? validationArr.label : item.errMessage + ); + await performValidation( + 'errorMessage', + !validationArr?.header ? 'There is a problem' : validationArr.header, + item.errMessage + ); + break; + default: throw new Error(`Validation type :"${validationArr.validationType}" is not valid`); - }; + } } } if (validationArr.buttonRemove) { diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts index 52c7f6fbc5..7a45ba32fc 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts @@ -1,13 +1,13 @@ import { Page } from '@playwright/test'; import { performAction } from '@utils/controller-caseManagement'; import { IAction, actionData, actionRecord } from '@utils/interfaces/action.interface'; -import { selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import {addReviewDates, selectDocument} from '@data/page-data-figma/page-data-caseManagement-figma'; export class ErrorValidationAction implements IAction { async execute(page: Page, action: string, errorFlag: string | actionRecord, roles?: actionData): Promise { const actionsMap = new Map Promise>([ ['errorValidationSelectDocumentPage', () => this.errorValidationSelectDocumentPage(errorFlag as string)], - + ['errorValidationAddReviewDatesPage', () => this.errorValidationAddReviewDatesPage(errorFlag as string)], ]); const actionToPerform = actionsMap.get(action); if (!actionToPerform) throw new Error(`No action found for '${action}'`); @@ -33,4 +33,31 @@ export class ErrorValidationAction implements IAction { } } + private async errorValidationAddReviewDatesPage(validationReq: string) { + if (validationReq === 'YES') { + await performAction('inputErrorValidation',{ + validationType: addReviewDates.errorValidationType.five, + inputArray: addReviewDates.errorValidationField.errorDateField, + label: addReviewDates.dateOfReviewLabel, + button: addReviewDates.continueButton + }); + await performAction('inputErrorValidation',{ + validationType: addReviewDates.errorValidationType.two, + inputArray: addReviewDates.errorValidationField.errorRadioOption, + label: addReviewDates.reasonLabel, + button: addReviewDates.continueButton + }); + await performAction('inputErrorValidation',{ + validationType: addReviewDates.errorValidationType.one, + inputArray: addReviewDates.errorValidationField.errorTextField, + day: addReviewDates.dayInputText, + Month: addReviewDates.monthInputText, + Year: addReviewDates.yearInputText, + option: addReviewDates.generalOrderRadioOption, + header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, + label: addReviewDates.descriptionTextLabel, + button: addReviewDates.continueButton + }); + } + } } diff --git a/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts b/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts index 1858b2e686..b8934e29c1 100644 --- a/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts +++ b/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts @@ -37,9 +37,12 @@ export class ActionCMRegistry { ['selectAnEvent', new CaseManagementAction()], ['selectDocumentToAmend', new CaseManagementAction()], ['errorValidationSelectDocumentPage', new ErrorValidationAction()], + ['addReviewDates', new CaseManagementAction()], + ['confirmReviewDatesAdded', new CaseManagementAction()], + ['errorValidationAddReviewDatesPage', new ErrorValidationAction()], ['inputErrorValidation', new CaseManagementAction()], ['reTryOnCallBackError', new RetryOnCallBackError()], - + ]); static getAction(actionName: string): IAction { From e668b661129455e0f0594d3131e101bb0de85956 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 20 Jul 2026 15:26:55 +0100 Subject: [PATCH 2/7] updated the error validations --- .../addReviewDates.page.data.ts | 3 +-- .../caseManagement.action.ts | 14 ++++++++++---- .../caseManagementErrorValidation.action.ts | 6 +----- .../element-validations/inputError.validation.ts | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts index 1cb7ed6de8..49cc69f920 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -35,8 +35,7 @@ export const addReviewDates = { { type: 'none', input: '', errMessage: `Reason is required` } ], errorTextField: [ - { type: 'none', input: '', errMessage: `Description of review is required` }, - {type: 'one', input: '510', errMessage: `In ‘Description of review’, you have entered more than the maximum number of characters (500)` } + { type: 'none', input: '', errMessage: `Description of review is required` } ], }, }; diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index b38140c7cf..9203e2bb6d 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -115,9 +115,14 @@ export class CaseManagementAction implements IAction { case 'radioOptions': await performAction('clickButton', validationArr.button); - await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errInlineMessage); + await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errMessage); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); - await performAction('clickRadioButton', { question: validationArr.question, option: validationArr.option }); + if (validationArr.option) { + await performAction('clickRadioButton', { + question: validationArr.question, + option: validationArr.option + }); + } break; case 'checkBox': @@ -154,11 +159,12 @@ export class CaseManagementAction implements IAction { await performAction('clickButton', validationArr.button); await performValidation( 'inputError', - !validationArr?.label ? validationArr.label : item.errMessage + validationArr.label, + item.errMessage ); await performValidation( 'errorMessage', - !validationArr?.header ? 'There is a problem' : validationArr.header, + validationArr.header ?? 'There is a problem', item.errMessage ); break; diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts index 7a45ba32fc..fcd5d5c830 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts @@ -47,14 +47,10 @@ export class ErrorValidationAction implements IAction { label: addReviewDates.reasonLabel, button: addReviewDates.continueButton }); + await performAction('inputErrorValidation',{ validationType: addReviewDates.errorValidationType.one, inputArray: addReviewDates.errorValidationField.errorTextField, - day: addReviewDates.dayInputText, - Month: addReviewDates.monthInputText, - Year: addReviewDates.yearInputText, - option: addReviewDates.generalOrderRadioOption, - header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, label: addReviewDates.descriptionTextLabel, button: addReviewDates.continueButton }); diff --git a/src/e2eTest/utils/validations/element-validations/inputError.validation.ts b/src/e2eTest/utils/validations/element-validations/inputError.validation.ts index ca27212690..04ef434d9d 100644 --- a/src/e2eTest/utils/validations/element-validations/inputError.validation.ts +++ b/src/e2eTest/utils/validations/element-validations/inputError.validation.ts @@ -18,7 +18,7 @@ export class InputErrorValidation implements IValidation { private async findFieldValueLocator(page: Page, fieldName: string, data: validationData): Promise { const locators = [ - page.locator(`//span[text()="${fieldName}"]/ancestor::div[contains(@class,'form-group') and position() = 1]//child::span[contains(@class,'error-message')]`) + page.locator(`//span[normalize-space()="${fieldName}"]/ancestor::div[contains(@class,'form-group')][1]//child::span[contains(@class,'error-message')]`) ]; for (const locator of locators) { @@ -47,4 +47,4 @@ export class InputErrorValidation implements IValidation { } throw new Error(`The error message "${data}" is not triggered`); } -} \ No newline at end of file +} From 6fe58d11963c2d461148a0195d8354b7883dde9a Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 20 Jul 2026 17:42:15 +0100 Subject: [PATCH 3/7] updated the error validations --- .../addReviewDates.page.data.ts | 21 ++++++++--- .../caseManagement.action.ts | 35 +++++++++++++++---- .../caseManagementErrorValidation.action.ts | 9 +++-- .../inputError.validation.ts | 10 +++++- 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts index 49cc69f920..c5a19175f1 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -26,16 +26,29 @@ export const addReviewDates = { descriptionTextInput:`50`, errorValidation: `YES`, eventCouldNotBeCreatedErrorMessageHeader: 'The event could not be created', - errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField` }, + errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField`, six: `maxInputField` }, errorValidationField: { errorDateField: [ - { type: 'none', input: '', errMessage: `Date of review is required` } + {type: 'none', input: {day: '', month: '', year: '',errMessage: 'Date of review is required' }}, + {type: 'invalid', input: {day: '30', month: '', year: '', errMessage: 'The data entered is not valid for Date of review'}}, + {type: 'invalid', input: {day: '30', month: '02', year: '', errMessage: 'The data entered is not valid for Date of review'}}, + {type: 'invalid', input: {day: '', month: '02', year: '2026', errMessage: 'The data entered is not valid for Date of review'}}, ], errorRadioOption: [ { type: 'none', input: '', errMessage: `Reason is required` } ], errorTextField: [ - { type: 'none', input: '', errMessage: `Description of review is required` } - ], + { type: 'none', input: '', errMessage: `Description of review is required` }, + ], + errorMaxInputField: [ + {type: 'Max', input: { + day: '30', + month: '08', + year: '2026', + maxLength: '510' + }, + errMessage: 'In ‘Description of review’, you have entered more than the maximum number of characters (500)' + } + ] }, }; diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index 9203e2bb6d..f26bd63f62 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -150,23 +150,46 @@ export class CaseManagementAction implements IAction { break; case 'textField': - await performAction('inputText', validationArr.label, generateRandomString(item.input)); + if (item.type === 'none') { + await performAction('clickButton', validationArr.button); + } else if (item.type === 'Max') { + await performAction('inputText', validationArr.label, generateRandomString(Number(item.input)) + ); + } await performAction('clickButton', validationArr.button); await performValidation('errorMessage', validationArr.label, item.errMessage); break; case 'dateField': + if (item.type !== 'none') { + await performActions( + 'Date of Review', + ['inputText', 'Day', item.input.day], + ['inputText', 'Month', item.input.month], + ['inputText', 'Year', item.input.year] + ); + } await performAction('clickButton', validationArr.button); await performValidation( 'inputError', validationArr.label, - item.errMessage + item.input.errMessage ); - await performValidation( - 'errorMessage', - validationArr.header ?? 'There is a problem', - item.errMessage + break; + + case 'maxInputField' : + await performActions( + 'Date of Review', + ['inputText', 'Day', item.input.day], + ['inputText', 'Month', item.input.month], + ['inputText', 'Year', item.input.year] ); + await performAction('clickRadioButton', { + question: validationArr.question, + option: validationArr.option + }); + await performAction('inputText', validationArr.label, generateRandomString(Number(item.input))); + await performAction('clickButton', validationArr.button); break; default: diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts index fcd5d5c830..8535d58033 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts @@ -41,6 +41,7 @@ export class ErrorValidationAction implements IAction { label: addReviewDates.dateOfReviewLabel, button: addReviewDates.continueButton }); + await performAction('inputErrorValidation',{ validationType: addReviewDates.errorValidationType.two, inputArray: addReviewDates.errorValidationField.errorRadioOption, @@ -48,10 +49,12 @@ export class ErrorValidationAction implements IAction { button: addReviewDates.continueButton }); - await performAction('inputErrorValidation',{ - validationType: addReviewDates.errorValidationType.one, - inputArray: addReviewDates.errorValidationField.errorTextField, + await performAction('inputErrorValidation', { + validationType: addReviewDates.errorValidationType.six, + inputArray: addReviewDates.errorValidationField.errorMaxInputField, label: addReviewDates.descriptionTextLabel, + question: addReviewDates.reasonLabel, + option: addReviewDates.OtherRadioOption, button: addReviewDates.continueButton }); } diff --git a/src/e2eTest/utils/validations/element-validations/inputError.validation.ts b/src/e2eTest/utils/validations/element-validations/inputError.validation.ts index 04ef434d9d..a8f1a8cae9 100644 --- a/src/e2eTest/utils/validations/element-validations/inputError.validation.ts +++ b/src/e2eTest/utils/validations/element-validations/inputError.validation.ts @@ -18,9 +18,17 @@ export class InputErrorValidation implements IValidation { private async findFieldValueLocator(page: Page, fieldName: string, data: validationData): Promise { const locators = [ - page.locator(`//span[normalize-space()="${fieldName}"]/ancestor::div[contains(@class,'form-group')][1]//child::span[contains(@class,'error-message')]`) + // Normal fields + page.locator( + `//span[normalize-space()="${fieldName}"]/ancestor::div[contains(@class,'form-group')][1]//span[contains(@class,'error-message')]` + ), + // Date fields + page.locator( + `//legend//span[normalize-space()="${fieldName}"]/following::span[contains(@class,'error-message')][1]` + ) ]; + for (const locator of locators) { const count = await locator.count(); From 375e97725e078a32483ffb0fd13f5086ab9f49fe Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 20 Jul 2026 20:19:01 +0100 Subject: [PATCH 4/7] updated the error validations --- .../addReviewDates.page.data.ts | 2 +- .../caseManagement.action.ts | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts index c5a19175f1..f956f7892a 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -25,7 +25,7 @@ export const addReviewDates = { yearInputText :`2030`, descriptionTextInput:`50`, errorValidation: `YES`, - eventCouldNotBeCreatedErrorMessageHeader: 'The event could not be created', + eventCouldNotBeCreatedErrorMessageHeader: `The event could not be created`, errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField`, six: `maxInputField` }, errorValidationField: { errorDateField: [ diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index f26bd63f62..fbbacdd1d7 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -110,13 +110,14 @@ export class CaseManagementAction implements IAction { if (Array.isArray(validationArr.inputArray)) { for (const item of validationArr.inputArray) { + const inlineMessage = item.errInlineMessage ?? item.errMessage; switch (validationArr.validationType) { case 'radioOptions': await performAction('clickButton', validationArr.button); - await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errMessage); - await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); + await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, inlineMessage); + await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); if (validationArr.option) if (validationArr.option) { await performAction('clickRadioButton', { question: validationArr.question, @@ -150,11 +151,8 @@ export class CaseManagementAction implements IAction { break; case 'textField': - if (item.type === 'none') { - await performAction('clickButton', validationArr.button); - } else if (item.type === 'Max') { - await performAction('inputText', validationArr.label, generateRandomString(Number(item.input)) - ); + if (item.type === 'Max') { + await performAction('inputText', validationArr.label, generateRandomString(Number(item.input))); } await performAction('clickButton', validationArr.button); await performValidation('errorMessage', validationArr.label, item.errMessage); @@ -188,7 +186,7 @@ export class CaseManagementAction implements IAction { question: validationArr.question, option: validationArr.option }); - await performAction('inputText', validationArr.label, generateRandomString(Number(item.input))); + await performAction('inputText', validationArr.label, generateRandomString(Number(item.input.maxLength))); await performAction('clickButton', validationArr.button); break; From ad1210370f0062239806f9eb000f72b708dc5656 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Mon, 20 Jul 2026 20:21:32 +0100 Subject: [PATCH 5/7] updated the error validations --- .../custom-actions-caseManagement/caseManagement.action.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index fbbacdd1d7..33d3f4c349 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -106,18 +106,15 @@ export class CaseManagementAction implements IAction { private async inputErrorValidation(page: Page, validationArr: actionRecord) { - - if (Array.isArray(validationArr.inputArray)) { for (const item of validationArr.inputArray) { const inlineMessage = item.errInlineMessage ?? item.errMessage; switch (validationArr.validationType) { - case 'radioOptions': await performAction('clickButton', validationArr.button); await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, inlineMessage); - await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); if (validationArr.option) + await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); if (validationArr.option) { await performAction('clickRadioButton', { question: validationArr.question, From 91b657a73989fee50a8e327d7d48bc80af13a760 Mon Sep 17 00:00:00 2001 From: padmakumari Date: Tue, 21 Jul 2026 13:50:01 +0100 Subject: [PATCH 6/7] Updated the files for validations --- .../addReviewDates.page.data.ts | 44 +++--- .../caseManagement.addReviewDates.spec.ts | 25 ++-- .../caseManagement.action.ts | 91 ++++++++----- .../caseManagementErrorValidation.action.ts | 18 ++- .../caseManagementUtils.action.ts | 125 ++++++++++++++++++ 5 files changed, 221 insertions(+), 82 deletions(-) create mode 100644 src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action.ts diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts index f956f7892a..e58ac0fabb 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -2,19 +2,19 @@ export const addReviewDates = { mainHeader: `Review dates`, addReviewDateHintText: `Add review date`, reviewDateSubHeader: `Review date`, - dateOfReviewLabel: `Date of review`, addNewButton:`Add new`, - dayTextLabel: `Day`, - monthTextLabel: `Month`, - yearTextLabel: `Year`, - reasonLabel: `Reason`, - unlessOrderRadioOption:`Unless order`, - StayCaseRadioOption: `Stay a case`, - liftStayRadioOption: `Lift a stay`, - dismissCaseRadioOption: `Dismiss case`, - generalOrderRadioOption: `General order`, - OtherRadioOption: `Other`, - descriptionTextLabel: `Description of review`, + dateOfReviewHiddenLabel: `Date of review`, + dayHiddenTextLabel: `Day`, + monthHiddenTextLabel: `Month`, + yearHiddenTextLabel: `Year`, + reasonHiddenLabel: `Reason`, + unlessOrderHiddenRadioOption:`Unless order`, + StayCaseHiddenRadioOption: `Stay a case`, + liftStayHiddenRadioOption: `Lift a stay`, + dismissCaseHiddenRadioOption: `Dismiss case`, + generalOrderHiddenRadioOption: `General order`, + OtherHiddenRadioOption: `Other`, + descriptionHiddenTextLabel: `Description of review`, youCanEnterUpToHiddenHintText: `You can enter up to 500 characters`, removeButton:`Remove`, continueButton: `Continue`, @@ -26,29 +26,21 @@ export const addReviewDates = { descriptionTextInput:`50`, errorValidation: `YES`, eventCouldNotBeCreatedErrorMessageHeader: `The event could not be created`, + thereIsProbErrorMessageHeader: `There is a problem`, errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField`, six: `maxInputField` }, errorValidationField: { errorDateField: [ - {type: 'none', input: {day: '', month: '', year: '',errMessage: 'Date of review is required' }}, - {type: 'invalid', input: {day: '30', month: '', year: '', errMessage: 'The data entered is not valid for Date of review'}}, - {type: 'invalid', input: {day: '30', month: '02', year: '', errMessage: 'The data entered is not valid for Date of review'}}, - {type: 'invalid', input: {day: '', month: '02', year: '2026', errMessage: 'The data entered is not valid for Date of review'}}, + { type: `empty`, input: `empty`, errMessage: `Date of review is required`,errInlineMessage: `Date of review is required`}, + { type: `invalid`, input: `invalid`, errMessage: `Date of review is not valid`, errInlineMessage: `The data entered is not valid for Date of review`}, ], errorRadioOption: [ - { type: 'none', input: '', errMessage: `Reason is required` } + { type: `none`, input: ``, errMessage: `Reason is required`,errInlineMessage: `Reason is required` } ], errorTextField: [ - { type: 'none', input: '', errMessage: `Description of review is required` }, + { type: `none`, input: ``, errMessage: `Description of review is required` }, ], errorMaxInputField: [ - {type: 'Max', input: { - day: '30', - month: '08', - year: '2026', - maxLength: '510' - }, - errMessage: 'In ‘Description of review’, you have entered more than the maximum number of characters (500)' - } + {type: `Max`, input: `510`, errMessage: `In ‘Description of review’, you have entered more than the maximum number of characters (500)`} ] }, }; diff --git a/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts index 040a7392f9..66c419b70f 100644 --- a/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts +++ b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts @@ -1,7 +1,7 @@ -import { createCaseApiData, makeAnApplicationApiData, submitCaseApiData } from '@data/api-data'; +import { createCaseApiData, submitCaseApiData } from '@data/api-data'; import {initializeExecutor, performValidation} from '@utils/controller'; import test from '@playwright/test'; -import { caseInfo, defendantUserDetails } from '@utils/actions/custom-actions'; +import { caseInfo } from '@utils/actions/custom-actions'; import { PageContentValidation } from '@utils/validations/element-validations/pageContent.validation'; import { caseSummary, user } from '@data/page-data'; import { dismissCookieBanner } from '@config/cookie-banner'; @@ -17,18 +17,9 @@ test.beforeEach(async ({ page, context }) => { initializeCMExecutor(page); await performAction('createCaseAPI', { data: createCaseApiData.createCasePayload }); await performAction('submitCaseAPI', { data: submitCaseApiData.submitCasePayloadCaseFileView }); + console.log(`Case created with case number: ${process.env.CASE_NUMBER}`); await performAction('updatePaymentAPI'); await performAction('getCaseAPI', 'Link Solicitor'); - - // for (const defendant of defendantUserDetails) { - // await performAction('makeAnApplicationAPI', { - // data: makeAnApplicationApiData.makeAnApplicationAdjournPayload( - // defendant.id, - // defendant.name - // ), - // }); - // }; - await performAction('navigateToUrl', process.env.MANAGE_CASE_BASE_URL); await dismissCookieBanner(page, 'additional'); await performAction('login', user.staffAdmin); @@ -51,11 +42,11 @@ test.describe('Case management - Case Worker Add Review date @nightly', async () performAction('clickButton', addReviewDates.addNewButton); await performAction('errorValidationAddReviewDatesPage', addReviewDates.errorValidation); await performAction('addReviewDates', { - Day: addReviewDates.dayInputText, - Month: addReviewDates.monthInputText, - Year: addReviewDates.yearInputText, - question: addReviewDates.reasonLabel, option: addReviewDates.dismissCaseRadioOption, - label: addReviewDates.descriptionTextLabel, userInput: addReviewDates.descriptionTextInput, + day: addReviewDates.dayHiddenTextLabel, + month: addReviewDates.monthHiddenTextLabel, + year: addReviewDates.yearHiddenTextLabel, + question: addReviewDates.reasonHiddenLabel, option: addReviewDates.dismissCaseHiddenRadioOption, + label: addReviewDates.descriptionHiddenTextLabel, userInput: addReviewDates.descriptionTextInput, nextPage: checkYourAnswersAddReviewDates.mainHeader }); await performAction('clickButton', checkYourAnswersAddReviewDates.submitButton); diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index 33d3f4c349..e6bbd3d395 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -14,6 +14,9 @@ import { import {generateRandomString} from "@utils/common/string.utils"; import {performActions} from "@utils/controller"; import {caseInfo} from "@utils/actions/custom-actions"; +import { + CaseManagementCommonUtils +} from "@utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action"; export const addressInfo = { @@ -77,12 +80,11 @@ export class CaseManagementAction implements IAction { typeof reviewDateData.input === 'number' ? generateRandomString(reviewDateData.input) : (reviewDateData.input as string); - await performActions( - 'Date of Review', - ['inputText', addReviewDates.dayTextLabel, reviewDateData.Day], - ['inputText', addReviewDates.monthTextLabel, reviewDateData.Month], - ['inputText', addReviewDates.yearTextLabel, reviewDateData.Year] - ); + let date = CaseManagementCommonUtils.getRandomDate(reviewDateData.dateType as string); + await performActions('Date of Review', + ['inputText', reviewDateData.day, date.split('/')[0]], + ['inputText', reviewDateData.month, date.split('/')[1]], + ['inputText', reviewDateData.year, date.split('/')[2]]); await performAction('clickRadioButton', { question: reviewDateData.question, option: reviewDateData.option }); await performAction('inputText', reviewDateData.label, reviewDateData.userInput); await performAction('reTryOnCallBackError', addReviewDates.continueButton, reviewDateData.nextPage as string); @@ -108,20 +110,19 @@ export class CaseManagementAction implements IAction { private async inputErrorValidation(page: Page, validationArr: actionRecord) { if (Array.isArray(validationArr.inputArray)) { for (const item of validationArr.inputArray) { - const inlineMessage = item.errInlineMessage ?? item.errMessage; + switch (validationArr.validationType) { case 'radioOptions': await performAction('clickButton', validationArr.button); - await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, inlineMessage); + await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errInlineMessage); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); if (validationArr.option) { await performAction('clickRadioButton', { question: validationArr.question, option: validationArr.option }); - } - break; + }break; case 'checkBox': await performAction('clickButton', validationArr.button); @@ -148,43 +149,65 @@ export class CaseManagementAction implements IAction { break; case 'textField': - if (item.type === 'Max') { - await performAction('inputText', validationArr.label, generateRandomString(Number(item.input))); - } - await performAction('clickButton', validationArr.button); - await performValidation('errorMessage', validationArr.label, item.errMessage); + await performAction('inputText', validationArr.label, CaseManagementCommonUtils.generateRandomString(item.input)); + await expect(async () => { + await performAction('clickButton', validationArr.button); + if (item.type === 'moreThanMax') { + await performValidation('errorMessage', { header: validationArr.header, message: item.errMessage }); + } else { + await performValidation('inputError', validationArr.label, item.errMessage); + await performValidation('errorMessage', validationArr.label, item.errMessage); + } + }).toPass({ + timeout: VERY_LONG_TIMEOUT, + }); break; case 'dateField': - if (item.type !== 'none') { - await performActions( - 'Date of Review', - ['inputText', 'Day', item.input.day], - ['inputText', 'Month', item.input.month], - ['inputText', 'Year', item.input.year] + let date: string = CaseManagementCommonUtils.getRandomDate(item.type as string); + const enterDate = () => + performActions( + 'Enter Date', + ['inputText', validationArr.label1, date.split('/')[0]], + ['inputText', validationArr.label2, date.split('/')[1]], + ['inputText', validationArr.label3, date.split('/')[2]] ); + + if (item.type === 'empty') { + await performAction('clickButton', validationArr.button); + await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errInlineMessage); + await performValidation('errorMessage', validationArr.header1, item.errMessage); + } else if (item.type === 'past') { + await enterDate(); + } else if (item.type === 'invalid') { + await enterDate(); + await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', validationArr.header1, item.errMessage); + } + else { + await enterDate(); + await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', { header: validationArr.header, message: item.errMessage }); } - await performAction('clickButton', validationArr.button); - await performValidation( - 'inputError', - validationArr.label, - item.input.errMessage - ); break; case 'maxInputField' : - await performActions( - 'Date of Review', - ['inputText', 'Day', item.input.day], - ['inputText', 'Month', item.input.month], - ['inputText', 'Year', item.input.year] - ); + let dateOfReview: string = CaseManagementCommonUtils.getRandomDate(item.type as string); + const enterDateOfReview = () => + performActions( + 'Enter Date', + ['inputText', validationArr.label1, dateOfReview.split('/')[0]], + ['inputText', validationArr.label2, dateOfReview.split('/')[1]], + ['inputText', validationArr.label3, dateOfReview.split('/')[2]] + ); + await enterDateOfReview(); await performAction('clickRadioButton', { question: validationArr.question, option: validationArr.option }); - await performAction('inputText', validationArr.label, generateRandomString(Number(item.input.maxLength))); + await performAction('inputText', validationArr.label, generateRandomString(Number(item.input))); await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', { header: validationArr.header, message: item.errMessage }); break; default: diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts index 8535d58033..9acb5f12f1 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts @@ -38,23 +38,31 @@ export class ErrorValidationAction implements IAction { await performAction('inputErrorValidation',{ validationType: addReviewDates.errorValidationType.five, inputArray: addReviewDates.errorValidationField.errorDateField, - label: addReviewDates.dateOfReviewLabel, + question: addReviewDates.dateOfReviewHiddenLabel, + header1: addReviewDates.thereIsProbErrorMessageHeader, + label1: addReviewDates.dayHiddenTextLabel, + label2: addReviewDates.monthHiddenTextLabel, + label3: addReviewDates.yearHiddenTextLabel, button: addReviewDates.continueButton }); await performAction('inputErrorValidation',{ validationType: addReviewDates.errorValidationType.two, inputArray: addReviewDates.errorValidationField.errorRadioOption, - label: addReviewDates.reasonLabel, + label: addReviewDates.reasonHiddenLabel, button: addReviewDates.continueButton }); await performAction('inputErrorValidation', { validationType: addReviewDates.errorValidationType.six, inputArray: addReviewDates.errorValidationField.errorMaxInputField, - label: addReviewDates.descriptionTextLabel, - question: addReviewDates.reasonLabel, - option: addReviewDates.OtherRadioOption, + header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, + label1: addReviewDates.dayHiddenTextLabel, + label2: addReviewDates.monthHiddenTextLabel, + label3: addReviewDates.yearHiddenTextLabel, + label: addReviewDates.descriptionHiddenTextLabel, + question: addReviewDates.reasonHiddenLabel, + option: addReviewDates.OtherHiddenRadioOption, button: addReviewDates.continueButton }); } diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action.ts new file mode 100644 index 0000000000..475dae546d --- /dev/null +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action.ts @@ -0,0 +1,125 @@ +import { Page } from '@playwright/test'; +export type actionData = string | number | boolean | object | string[] | object[]; +export type actionRecord = Record; +export type actionTuple = [string, actionData | actionRecord] | [string, actionData | actionRecord, actionData | actionRecord]; + +export class CaseManagementCommonUtils { + + public static async generateMoreThanMaxString(page: Page, label: string, input: string | number): Promise { + + let length: number; + + if (input === 'MAXPLUS') { + const hintText = await page + .locator(`//span[text()="${label}"]/ancestor::div[contains(@class,'form-group')]//span[contains(@class,'form-hint')]`) + .innerText(); + + const limit = CaseManagementCommonUtils.retrieveLengthFromString(hintText); + if (limit === 0) return ''; + + length = limit + 1; + + } else if (typeof input === 'number') { + length = input + 1; + + } else { + return ''; + } + + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let finalString = ''; + for (let i = 0; i < length; i++) { + finalString += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return finalString; + } + + public static retrieveLengthFromString(input: string): number { + const getCharCount = input.split('You can enter').map(str => str.trim()).filter(str => str.length > 0); + const charLimitInfo = getCharCount[getCharCount.length - 1].match(/[-+]?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?/); + const amount = charLimitInfo ? Number(charLimitInfo[0].replace(/,/g, "")) : 0; + return Number(amount.toFixed(2)); + } + + + // public static inputDOB(inputArray: string[]): string { + // return inputArray.map((item) => item + " - " + CaseManagementCommonUtils.getRandomDate(18, 30)).join('\n'); + // } + + + public static getRandomDate(type: string): string { + + if (type === 'invalid') { + return '32/13/9999'; + } + + const today = new Date(); + + if (type === 'present') { + const day = String(today.getDate()).padStart(2, '0'); + const month = String(today.getMonth() + 1).padStart(2, '0'); + const year = today.getFullYear(); + + return `${day}/${month}/${year}`; + } + + let minDate: Date; + let maxDate: Date; + + if (type === 'future') { + minDate = today; + maxDate = new Date( + today.getFullYear() + 10, + today.getMonth(), + today.getDate() + ); + } else { + minDate = new Date( + today.getFullYear() - 10, + today.getMonth(), + today.getDate() + ); + maxDate = today; + } + + const randomTime = + minDate.getTime() + + Math.random() * (maxDate.getTime() - minDate.getTime()); + + const randomDate = new Date(randomTime); + + const day = String(randomDate.getDate()).padStart(2, '0'); + const month = String(randomDate.getMonth() + 1).padStart(2, '0'); + const year = randomDate.getFullYear(); + + return `${day}/${month}/${year}`; + } + + public static getRandomElementForAnArray(arr: T[]): T | undefined { + + if (arr.length === 0) return undefined; + const index = Math.floor(Math.random() * arr.length); + return arr[index]; + + } + + public static formatPayLoadData(input: string): string { + + let formattedOutput = ""; + const splitInput = input.toLowerCase().split("_"); + formattedOutput = splitInput + .map((str, i) => (i === 0 ? str.charAt(0).toUpperCase() + str.slice(1) : str)) + .join(" "); + return formattedOutput; + + } + + public static generateRandomString(length: string | number): string { + if (typeof length !== 'number' || !Number.isInteger(length) || length <= 0) { + return ''; + } + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + return Array.from({ length }, () => chars[Math.floor(Math.random() * chars.length)]).join(''); + } + +} From d1a977908de3659ba501c4d77b6dba3f607ef78c Mon Sep 17 00:00:00 2001 From: padmakumari Date: Tue, 21 Jul 2026 18:22:19 +0100 Subject: [PATCH 7/7] Updated the files for validations --- .../addReviewDates.page.data.ts | 6 ++--- .../urlToFileMappingCM.ts | 6 ++--- .../caseManagement.addReviewDates.spec.ts | 2 +- .../caseManagement.action.ts | 24 ++++++++----------- .../caseManagementErrorValidation.action.ts | 16 +++++++++---- .../pageContent.validation.ts | 8 +++---- 6 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts index e58ac0fabb..59a9b1548b 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -16,7 +16,7 @@ export const addReviewDates = { OtherHiddenRadioOption: `Other`, descriptionHiddenTextLabel: `Description of review`, youCanEnterUpToHiddenHintText: `You can enter up to 500 characters`, - removeButton:`Remove`, + removeHiddenButton:`Remove`, continueButton: `Continue`, previousButton: `Previous`, cancelLink: `Cancel`, @@ -27,7 +27,7 @@ export const addReviewDates = { errorValidation: `YES`, eventCouldNotBeCreatedErrorMessageHeader: `The event could not be created`, thereIsProbErrorMessageHeader: `There is a problem`, - errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField`, six: `maxInputField` }, + errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField`, six: `dateRadioOption` }, errorValidationField: { errorDateField: [ { type: `empty`, input: `empty`, errMessage: `Date of review is required`,errInlineMessage: `Date of review is required`}, @@ -39,7 +39,7 @@ export const addReviewDates = { errorTextField: [ { type: `none`, input: ``, errMessage: `Description of review is required` }, ], - errorMaxInputField: [ + errorDateRadioOption: [ {type: `Max`, input: `510`, errMessage: `In ‘Description of review’, you have entered more than the maximum number of characters (500)`} ] }, diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts index fba802fee1..99301e5315 100644 --- a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts @@ -1,8 +1,8 @@ export default { 'amendDocumentsselectDocument': 'selectDocument', - 'addCaseReviewDateaddCaseReviewDate': 'addReviewDate', - 'addCaseReviewDate/submit' : 'checkYourAnswersAddReviewDate', - 'addCaseReviewDate/confirm': 'confirmReviewDatesAdded' + 'addCaseReviewDateaddCaseReviewDate': 'addReviewDates', + 'addCaseReviewDate/submit' : 'checkYourAnswersAddReviewDates', + 'addCaseReviewDate/confirm': 'confirmReviewDatesAdded', 'changeCaseStatechangeCaseStatePage': 'changeCaseState', 'changeCaseState/confirm': 'confirmCaseStateChange' }; diff --git a/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts index 66c419b70f..d81215d936 100644 --- a/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts +++ b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts @@ -39,7 +39,7 @@ test.describe('Case management - Case Worker Add Review date @nightly', async () test('Case management - Case Worker Add Review Date @CM @regression', async () => { await performAction('selectAnEvent', { eventType: caseSummary.addReviewDates }); await performValidation('mainHeader', addReviewDates.mainHeader); - performAction('clickButton', addReviewDates.addNewButton); + await performAction('clickButton', addReviewDates.addNewButton); await performAction('errorValidationAddReviewDatesPage', addReviewDates.errorValidation); await performAction('addReviewDates', { day: addReviewDates.dayHiddenTextLabel, diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts index 2aa1e5d42d..0eac1002e7 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagement.action.ts @@ -6,18 +6,18 @@ import { getCaseTypeId } from '@utils/common/caseType.utils'; import { performAction, performValidation } from '@utils/controller-caseManagement'; import { VERY_LONG_TIMEOUT } from 'playwright.config'; import { caseSummary, home } from '@data/page-data'; -import { - addReviewDates, - confirmReviewDatesAdded, - selectDocument -} from '@data/page-data-figma/page-data-caseManagement-figma'; import {generateRandomString} from "@utils/common/string.utils"; import {performActions} from "@utils/controller"; -import {caseInfo} from "@utils/actions/custom-actions"; import { CaseManagementCommonUtils } from "@utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action"; -import { changeCaseState, confirmCaseStateChange, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import { + addReviewDates, + confirmReviewDatesAdded, + selectDocument, + changeCaseState, + confirmCaseStateChange +} from '@data/page-data-figma/page-data-caseManagement-figma'; import { caseInfo } from '../createCaseAPI.action'; @@ -145,12 +145,8 @@ export class CaseManagementAction implements IAction { await performAction('clickButton', validationArr.button); await performValidation('inputError', !validationArr?.label ? validationArr.question : validationArr.label, item.errInlineMessage); await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); - if (validationArr.option) { - await performAction('clickRadioButton', { - question: validationArr.question, - option: validationArr.option - }); - }break; + await performAction('clickRadioButton', {question: validationArr.question, option: validationArr.option}); + break; case 'checkBox': await performAction('clickButton', validationArr.button); @@ -219,7 +215,7 @@ export class CaseManagementAction implements IAction { } break; - case 'maxInputField' : + case 'dateRadioOption' : let dateOfReview: string = CaseManagementCommonUtils.getRandomDate(item.type as string); const enterDateOfReview = () => performActions( diff --git a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts index 254bc9772e..93f2d48ad4 100644 --- a/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts +++ b/src/e2eTest/utils/actions/custom-actions/custom-actions-caseManagement/caseManagementErrorValidation.action.ts @@ -1,8 +1,7 @@ import { Page } from '@playwright/test'; import { performAction } from '@utils/controller-caseManagement'; import { IAction, actionData, actionRecord } from '@utils/interfaces/action.interface'; -import {addReviewDates, selectDocument} from '@data/page-data-figma/page-data-caseManagement-figma'; -import { changeCaseState, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import { addReviewDates,changeCaseState, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; export class ErrorValidationAction implements IAction { async execute(page: Page, action: string, errorFlag: string | actionRecord, roles?: actionData): Promise { @@ -52,13 +51,22 @@ export class ErrorValidationAction implements IAction { await performAction('inputErrorValidation',{ validationType: addReviewDates.errorValidationType.two, inputArray: addReviewDates.errorValidationField.errorRadioOption, - label: addReviewDates.reasonHiddenLabel, + question: addReviewDates.reasonHiddenLabel, + option: addReviewDates.unlessOrderHiddenRadioOption, + button: addReviewDates.continueButton + }); + + await performAction('inputErrorValidation', { + validationType: addReviewDates.errorValidationType.one, + inputArray: addReviewDates.errorValidationField.errorTextField, + header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, + label: addReviewDates.descriptionHiddenTextLabel, button: addReviewDates.continueButton }); await performAction('inputErrorValidation', { validationType: addReviewDates.errorValidationType.six, - inputArray: addReviewDates.errorValidationField.errorMaxInputField, + inputArray: addReviewDates.errorValidationField.errorDateRadioOption, header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, label1: addReviewDates.dayHiddenTextLabel, label2: addReviewDates.monthHiddenTextLabel, diff --git a/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts b/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts index 7594c6e49e..e68fcf8839 100644 --- a/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts +++ b/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts @@ -183,7 +183,7 @@ export class PageContentValidation implements IValidation { mappingPath = path.join(__dirname, '../../../data/page-data-figma/page-data-genApps-figma/urlToFileMappingGenApps.ts'); } else if( - ["amendDocuments", "changeCaseState"].some(str => + ["amendDocuments", "changeCaseState", "addCaseReviewDate"].some(str => page.url().includes(str) )) { mappingPath = path.join(__dirname, '../../../data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts'); @@ -248,7 +248,7 @@ export class PageContentValidation implements IValidation { filePath = path.join(__dirname, '../../../data/page-data-figma/page-data-common-component', `${fileName}.page.data.ts`); } else if ( - ["amendDocuments", "changeCaseState"].some(str => + ["amendDocuments", "changeCaseState", "addCaseReviewDate"].some(str => page.url().includes(str) )) { filePath = path.join(__dirname, '../../../data/page-data-figma/page-data-caseManagement-figma', `${fileName}.page.data.ts`); @@ -390,7 +390,7 @@ export class PageContentValidation implements IValidation { } else if(url.includes("makeAnApplication")){ mappingPath = path.join(__dirname, '../../../data/page-data-figma/page-data-genApps-figma/urlToFileMappingGenApps.ts'); } else if ( - ["amendDocuments", "changeCaseState"].some(str => + ["amendDocuments", "changeCaseState", "addCaseReviewDate"].some(str => url.includes(str) )) { mappingPath = path.join(__dirname, '../../../data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts'); @@ -428,4 +428,4 @@ export class PageContentValidation implements IValidation { this.pageToHeaderTextMap.clear(); this.validationExecuted = false; } -} \ No newline at end of file +}