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..59a9b1548b --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/addReviewDates.page.data.ts @@ -0,0 +1,46 @@ +export const addReviewDates = { + mainHeader: `Review dates`, + addReviewDateHintText: `Add review date`, + reviewDateSubHeader: `Review date`, + addNewButton:`Add new`, + 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`, + removeHiddenButton:`Remove`, + continueButton: `Continue`, + previousButton: `Previous`, + cancelLink: `Cancel`, + dayInputText :`20`, + monthInputText :`12`, + yearInputText :`2030`, + 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: `dateRadioOption` }, + errorValidationField: { + errorDateField: [ + { 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`,errInlineMessage: `Reason is required` } + ], + errorTextField: [ + { type: `none`, input: ``, errMessage: `Description of review is required` }, + ], + 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/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 ef3ae7b943..02db9c5e81 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,5 +1,8 @@ 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' export * from './changeCaseState.page.data'; export * from './checkYourAnswersChangeState.page.data'; -export * from './confirmCaseStateChange.page.data'; \ No newline at end of file +export * from './confirmCaseStateChange.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 5ddbccf2cc..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,5 +1,8 @@ export default { 'amendDocumentsselectDocument': 'selectDocument', + 'addCaseReviewDateaddCaseReviewDate': 'addReviewDates', + 'addCaseReviewDate/submit' : 'checkYourAnswersAddReviewDates', + 'addCaseReviewDate/confirm': 'confirmReviewDatesAdded', 'changeCaseStatechangeCaseStatePage': 'changeCaseState', 'changeCaseState/confirm': 'confirmCaseStateChange' -}; \ No newline at end of file +}; diff --git a/src/e2eTest/data/page-data/caseSummary.page.data.ts b/src/e2eTest/data/page-data/caseSummary.page.data.ts index 0c028d2f63..3a7a44c036 100644 --- a/src/e2eTest/data/page-data/caseSummary.page.data.ts +++ b/src/e2eTest/data/page-data/caseSummary.page.data.ts @@ -16,5 +16,6 @@ export const caseSummary = { manageDocuments:{ amend : 'Manage documents: Amend' }, + addReviewDates: 'Add review date', changeCaseState: 'Change case state' } 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..d81215d936 --- /dev/null +++ b/src/e2eTest/tests/test-caseManagement/caseManagement.addReviewDates.spec.ts @@ -0,0 +1,56 @@ +import { createCaseApiData, submitCaseApiData } from '@data/api-data'; +import {initializeExecutor, performValidation} from '@utils/controller'; +import test from '@playwright/test'; +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'; +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 }); + console.log(`Case created with case number: ${process.env.CASE_NUMBER}`); + await performAction('updatePaymentAPI'); + await performAction('getCaseAPI', 'Link Solicitor'); + 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); + await performAction('clickButton', addReviewDates.addNewButton); + await performAction('errorValidationAddReviewDatesPage', addReviewDates.errorValidation); + await performAction('addReviewDates', { + 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); + 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 575091ed09..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,7 +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 { changeCaseState, confirmCaseStateChange, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import {generateRandomString} from "@utils/common/string.utils"; +import {performActions} from "@utils/controller"; +import { + CaseManagementCommonUtils +} from "@utils/actions/custom-actions/custom-actions-caseManagement/caseManagementUtils.action"; +import { + addReviewDates, + confirmReviewDatesAdded, + selectDocument, + changeCaseState, + confirmCaseStateChange +} from '@data/page-data-figma/page-data-caseManagement-figma'; import { caseInfo } from '../createCaseAPI.action'; @@ -25,6 +36,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()], ['changeCaseState', () => this.changeCaseState(fieldName as actionRecord)], ['confirmCaseStateChange', () => this.confirmCaseStateChange()], ['inputErrorValidation', () => this.inputErrorValidation(page, fieldName as actionRecord)], @@ -85,33 +98,69 @@ export class CaseManagementAction implements IAction { await performAction('clickButton', confirmCaseStateChange.closeAndReturnToCaseOverviewButton); } + 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); + 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); + } + + 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': + + 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 }); + 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 () => { @@ -122,10 +171,72 @@ export class CaseManagementAction implements IAction { }); await performAction('select', validationArr.dropQn, validationArr.option); break; - + + case 'textField': + 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': + 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 }); + } + break; + + case 'dateRadioOption' : + 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))); + await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', { header: validationArr.header, message: 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 9b71a6c2ac..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,12 +1,13 @@ import { Page } from '@playwright/test'; import { performAction } from '@utils/controller-caseManagement'; import { IAction, actionData, actionRecord } from '@utils/interfaces/action.interface'; -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 { const actionsMap = new Map Promise>([ ['errorValidationSelectDocumentPage', () => this.errorValidationSelectDocumentPage(errorFlag as string)], + ['errorValidationAddReviewDatesPage', () => this.errorValidationAddReviewDatesPage(errorFlag as string)], ['errorValidationChangeCaseStatePage', () => this.errorValidationChangeCaseStatePage(errorFlag as string)], ]); @@ -34,6 +35,49 @@ export class ErrorValidationAction implements IAction { } } + private async errorValidationAddReviewDatesPage(validationReq: string) { + if (validationReq === 'YES') { + await performAction('inputErrorValidation',{ + validationType: addReviewDates.errorValidationType.five, + inputArray: addReviewDates.errorValidationField.errorDateField, + 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, + 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.errorDateRadioOption, + header: addReviewDates.eventCouldNotBeCreatedErrorMessageHeader, + label1: addReviewDates.dayHiddenTextLabel, + label2: addReviewDates.monthHiddenTextLabel, + label3: addReviewDates.yearHiddenTextLabel, + label: addReviewDates.descriptionHiddenTextLabel, + question: addReviewDates.reasonHiddenLabel, + option: addReviewDates.OtherHiddenRadioOption, + button: addReviewDates.continueButton + }); + } + } private async errorValidationChangeCaseStatePage(validationReq: string) { if (validationReq === 'YES') { await performAction('inputErrorValidation', { 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(''); + } + +} 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 ae30ee4ca7..a8363f2c51 100644 --- a/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts +++ b/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts @@ -41,9 +41,12 @@ export class ActionCMRegistry { ['errorValidationSelectDocumentPage', new ErrorValidationAction()], ['errorValidationChangeCaseStatePage', new ErrorValidationAction()], ['errorValidationSelectDocumentPage', new ErrorValidationAction()], + ['addReviewDates', new CaseManagementAction()], + ['confirmReviewDatesAdded', new CaseManagementAction()], + ['errorValidationAddReviewDatesPage', new ErrorValidationAction()], ['inputErrorValidation', new CaseManagementAction()], ['reTryOnCallBackError', new RetryOnCallBackError()], - + ]); static getAction(actionName: string): IAction { diff --git a/src/e2eTest/utils/validations/element-validations/inputError.validation.ts b/src/e2eTest/utils/validations/element-validations/inputError.validation.ts index ca27212690..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[text()="${fieldName}"]/ancestor::div[contains(@class,'form-group') and position() = 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(); @@ -47,4 +55,4 @@ export class InputErrorValidation implements IValidation { } throw new Error(`The error message "${data}" is not triggered`); } -} \ No newline at end of file +} 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 +}