diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationDetails.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationDetails.page.data.ts new file mode 100644 index 0000000000..7419ef3fc0 --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationDetails.page.data.ts @@ -0,0 +1,42 @@ +export const enterGenappApplication = { + mainHeader: `Application details`, + whichPartyMadeAppQuestion: `Which party made the application?`, + whatDateAppReceivedQuestion: `What date was the application received?`, + typeOfAppQuestion: `Which type of application has the applicant made?`, + adjournRadioOption: `Adjourn`, + setAsideRadioOption: `Set aside`, + somethingElseRadioOption: `Something else`, + dayTextLabel: `Day`, + monthTextLabel: `Month`, + yearTextLabel: `Year`, + dateTypeHiddenUserInput: 'past', + whichCategoriesHiddenTextLabel: `Which categories apply?`, + whichCategoriesHiddenTextInput: 400, + 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` }, + errorValidationField: { + errorRadioOption1: [ + { type: `none`, input: ``, errMessage: `Which party made the application? is required`, errInlineMessage: `Field is required` }, + ], + errorRadioOption2: [ + { type: `none`, input: ``, errMessage: `Which type of application has the applicant made? is required`, errInlineMessage: `Which type of application has the applicant made? is required` }, + ], + errorDateField: [ + { type: `empty`, input: `empty`, errMessage: `What date was the application received? is required`,errInlineMessage: `What date was the application received? is required`}, + { type: `invalid`, input: `invalid`, errMessage: `What date was the application received? is not valid `,errInlineMessage: `The data entered is not valid for What date was the application received?`}, + { type: `future`, input: 'future', errMessage: `Date the application was received must be in the past`, errInlineMessage: `The data entered is not valid for What date was the application received?` }, + { type: `present`, input: 'present', errMessage: `Date the application was received must be in the past`, errInlineMessage: `The data entered is not valid for What date was the application received?` }, + { type: `past`, input: 'past', errMessage: ``, errInlineMessage: `` }, + + ], + errorTextField: [ + { type: `moreThanMax`, input: 505, errMessage: `In ‘Which categories apply’, you have entered more than the maximum number of characters (500)` }, + { type: `empty`, input: `EMPTY`, errMessage: `Which categories apply? is required `}, + ] + }, + continueButton: `Continue`, + previousButton: `Previous`, + cancelLink: `Cancel`, +}; diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationFee.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationFee.page.data.ts new file mode 100644 index 0000000000..d08bc9e6b0 --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenAppapplicationFee.page.data.ts @@ -0,0 +1,6 @@ +export const enterGenAppapplicationFee = { + mainHeader: `Application fee`, + continueButton: `Save and continue`, + previousButton: `Previous`, + cancelLink: `Cancel`, +}; diff --git a/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenApphearingDate.page.data.ts b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenApphearingDate.page.data.ts new file mode 100644 index 0000000000..baef91057e --- /dev/null +++ b/src/e2eTest/data/page-data-figma/page-data-caseManagement-figma/enterGenApphearingDate.page.data.ts @@ -0,0 +1,16 @@ +export const enterGenAppHearingDate = { + mainHeader: `Hearing date`, + hearingInNext14DaysQuestion: `Is there a hearing for this case in the next 14 days?`, + yesRadioOption: `Yes`, + noRadioOption: `No`, + errorValidation: `YES`, + errorValidationType: { one: `textField`, two: `radioOptions`, three: `checkBox`, four: `dropDown`, five: `dateField` }, + errorValidationField: { + errorRadioOption: [ + { type: `none`, input: ``, errMessage: `Is there a hearing for this case in the next 14 days? is required`, errInlineMessage: `Is there a hearing for this case in the next 14 days? is required` }, + ], + }, + continueButton: `Continue`, + previousButton: `Previous`, + cancelLink: `Cancel`, +}; 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..61c900e31d 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 @@ -2,4 +2,7 @@ export * from './selectDocument.page.data'; export * from './amendDocumentDetails.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'; +export * from './enterGenAppapplicationDetails.page.data'; +export * from './enterGenApphearingDate.page.data'; +export * from './enterGenAppapplicationFee.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..b4fd14a519 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', 'changeCaseStatechangeCaseStatePage': 'changeCaseState', - 'changeCaseState/confirm': 'confirmCaseStateChange' -}; \ No newline at end of file + 'changeCaseState/confirm': 'confirmCaseStateChange', + 'enterGenAppapplicationDetails': 'enterGenAppapplicationDetails', + 'enterGenApphearingDate': 'enterGenApphearingDate', + 'enterGenAppapplicationFee': 'enterGenAppapplicationFee', +}; diff --git a/src/e2eTest/data/page-data/caseSummary.page.data.ts b/src/e2eTest/data/page-data/caseSummary.page.data.ts index 0c028d2f63..b2a7be001d 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' }, - changeCaseState: 'Change case state' + changeCaseState: 'Change case state', + enterAGenApp: 'Enter a general application' } diff --git a/src/e2eTest/tests/test-caseManagement/caseManagement.caseWorkerGenApps.spec.ts b/src/e2eTest/tests/test-caseManagement/caseManagement.caseWorkerGenApps.spec.ts new file mode 100644 index 0000000000..c59d621bce --- /dev/null +++ b/src/e2eTest/tests/test-caseManagement/caseManagement.caseWorkerGenApps.spec.ts @@ -0,0 +1,99 @@ +import { createCaseApiData, submitCaseApiData } from '@data/api-data'; +import { initializeExecutor } 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, performValidation } from '@utils/controller-caseManagement'; +import { allPartyDetails } from '@utils/actions/custom-actions/custom-actions-caseManagement'; +import { enterGenappApplication, enterGenAppapplicationFee, enterGenAppHearingDate } from '@data/page-data-figma/page-data-caseManagement-figma'; +import { label } from 'allure-js-commons'; + +test.use({ storageState: undefined }) + +test.beforeEach(async ({ page, context }) => { + await context.clearCookies(); + initializeExecutor(page); + initializeCMExecutor(page); + allPartyDetails.length = 0; + await performAction('createCaseAPI', { data: createCaseApiData.createCasePayload }); + await performAction('submitCaseAPI', { data: submitCaseApiData.submitCasePayloadCaseFileView }); + await performAction('updatePaymentAPI'); + await performAction('getCaseAPI', 'Link Solicitor'); + await performAction('getAllPartyDetails', { + defendant1NameKnown: submitCaseApiData.submitCasePayloadCaseFileView.defendant1.nameKnown, + additionalDefendants: submitCaseApiData.submitCasePayloadCaseFileView.addAnotherDefendant, + payLoad: submitCaseApiData.submitCasePayloadCaseFileView + }); + await performAction('navigateToUrl', process.env.MANAGE_CASE_BASE_URL); + await dismissCookieBanner(page, 'additional'); + await performAction('login', user.hearingCenterAdmin); + 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 Enter a General application @nightly', async () => { + test('Case management - Case Worker Enter a General application ADJOURN Journey @CM @regression', async () => { + await performAction('selectAnEvent', { eventType: caseSummary.enterAGenApp }); + await performValidation('mainHeader', enterGenappApplication.mainHeader); + await performAction('errorValidationEnterGeneralAppPage', enterGenappApplication.errorValidation); + await performAction('enterApplicationDetails', { + question1: enterGenappApplication.whichPartyMadeAppQuestion, option1: allPartyDetails[0], + question2: enterGenappApplication.typeOfAppQuestion, option2: enterGenappApplication.adjournRadioOption, + label: enterGenappApplication.whichCategoriesHiddenTextLabel, + input: enterGenappApplication.whichCategoriesHiddenTextInput, + label1: enterGenappApplication.dayTextLabel, + label2: enterGenappApplication.monthTextLabel, + label3: enterGenappApplication.yearTextLabel, + dateType: enterGenappApplication.dateTypeHiddenUserInput, + nextPage: enterGenAppHearingDate.mainHeader + }) + await performAction('errorValidationHearingDatePage', enterGenAppHearingDate.errorValidation); + await performAction('confirmIfCourtHearingInNext14Days', { + question: enterGenAppHearingDate.hearingInNext14DaysQuestion, + option: enterGenAppHearingDate.yesRadioOption, + nextPage: enterGenAppapplicationFee.mainHeader + }); + }); + + test('Case management - Case Worker Enter a General application SET ASIDE Journey @CM', async () => { + await performAction('selectAnEvent', { eventType: caseSummary.enterAGenApp }); + await performValidation('mainHeader', enterGenappApplication.mainHeader); + await performAction('enterApplicationDetails', { + question1: enterGenappApplication.whichPartyMadeAppQuestion, option1: allPartyDetails[1], + question2: enterGenappApplication.typeOfAppQuestion, option2: enterGenappApplication.setAsideRadioOption, + label: enterGenappApplication.whichCategoriesHiddenTextLabel, + input: enterGenappApplication.whichCategoriesHiddenTextInput, + label1: enterGenappApplication.dayTextLabel, + label2: enterGenappApplication.monthTextLabel, + label3: enterGenappApplication.yearTextLabel, + dateType: enterGenappApplication.dateTypeHiddenUserInput, + nextPage: enterGenAppapplicationFee.mainHeader + }) + }); + + test('Case management - Case Worker Enter a General application SOMETHING ELSE Journey @CM', async () => { + await performAction('selectAnEvent', { eventType: caseSummary.enterAGenApp }); + await performValidation('mainHeader', enterGenappApplication.mainHeader); + await performAction('enterApplicationDetails', { + question1: enterGenappApplication.whichPartyMadeAppQuestion, option1: allPartyDetails[2], + question2: enterGenappApplication.typeOfAppQuestion, option2: enterGenappApplication.somethingElseRadioOption, + label: enterGenappApplication.whichCategoriesHiddenTextLabel, + input: enterGenappApplication.whichCategoriesHiddenTextInput, + label1: enterGenappApplication.dayTextLabel, + label2: enterGenappApplication.monthTextLabel, + label3: enterGenappApplication.yearTextLabel, + dateType: enterGenappApplication.dateTypeHiddenUserInput, + nextPage: enterGenAppapplicationFee.mainHeader + }) + }); +}); 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..60562dd0b6 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 @@ -3,11 +3,12 @@ import { expect, Page } from '@playwright/test'; import { IAction, actionData, actionRecord } from '@utils/interfaces'; import { createCaseApiData } from '@data/api-data'; import { getCaseTypeId } from '@utils/common/caseType.utils'; -import { performAction, performValidation } from '@utils/controller-caseManagement'; +import { performAction, performActions, 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 { changeCaseState, confirmCaseStateChange, enterGenappApplication, enterGenAppHearingDate, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; import { caseInfo } from '../createCaseAPI.action'; +import { CaseManagementCommonUtils } from './caseManagementUtils.action'; export const addressInfo = { @@ -17,7 +18,7 @@ export const addressInfo = { engOrWalPostcode: createCaseApiData.createCasePayload.propertyAddress.PostCode }; const cyaMap = new Map(); -export let defendantDetails: string[] = []; +export let allPartyDetails: string[] = []; export class CaseManagementAction implements IAction { async execute(page: Page, action: string, fieldName: actionData | actionRecord): Promise { @@ -27,6 +28,9 @@ export class CaseManagementAction implements IAction { ['selectDocumentToAmend', () => this.selectDocumentToAmend(fieldName as actionRecord)], ['changeCaseState', () => this.changeCaseState(fieldName as actionRecord)], ['confirmCaseStateChange', () => this.confirmCaseStateChange()], + ['getAllPartyDetails', () => this.getAllPartyDetails(fieldName as actionRecord)], + ['enterApplicationDetails', () => this.enterApplicationDetails(fieldName as actionRecord)], + ['confirmIfCourtHearingInNext14Days', () => this.confirmIfCourtHearingInNext14Days(fieldName as actionRecord)], ['inputErrorValidation', () => this.inputErrorValidation(page, fieldName as actionRecord)], ]); @@ -54,13 +58,13 @@ export class CaseManagementAction implements IAction { await performAction('clickButton', caseSummary.go); } - private async selectDocumentToAmend(selectDoc: actionRecord){ + private async selectDocumentToAmend(selectDoc: actionRecord) { await performAction('select', selectDoc.question, selectDoc.option); await performAction('clickRadioButton', { question: selectDoc.question1, option: selectDoc.option1 }); await performAction('reTryOnCallBackError', selectDocument.continueButton, selectDoc.nextPage as string); } - private async changeCaseState(caseState: actionRecord){ + private async changeCaseState(caseState: actionRecord) { await performValidation('text', { elementType: 'paragraph', text: 'Case number: ' + caseInfo.fid }); await performValidation('text', { elementType: 'paragraph', @@ -85,52 +89,151 @@ export class CaseManagementAction implements IAction { await performAction('clickButton', confirmCaseStateChange.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 () => { - await performAction('clickButton', validationArr.button); - await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); - }).toPass({ - timeout: VERY_LONG_TIMEOUT, - }); - await performAction('select', validationArr.dropQn, validationArr.option); - break; - - default: - throw new Error(`Validation type :"${validationArr.validationType}" is not valid`); - }; - } + private async getAllPartyDetails(allPartiesDetails: actionRecord) { + + let originalDefendantDetails: string[] = []; + const payLoad = allPartiesDetails.payLoad as Record; + if (allPartiesDetails.defendant1NameKnown === 'YES') { + originalDefendantDetails.push( + `${payLoad.defendant1.firstName} ${payLoad.defendant1.lastName} - Defendant 1` + ); + } else { + originalDefendantDetails.push( + `null null` + ); + } + + if (allPartiesDetails.additionalDefendants === 'YES') { + + for (const [index, defendant] of payLoad.additionalDefendants.entries()) { + if (defendant.value.nameKnown === 'YES') { + originalDefendantDetails.push(`${defendant.value.firstName} ${defendant.value.lastName} - Defendant ${index + 2}`); + } else { + originalDefendantDetails.push( + `null null` + ); } - if (validationArr.buttonRemove) { - await performAction('removeFile'); - await page.waitForTimeout(6000); } } + + allPartyDetails = [...new Set(originalDefendantDetails.filter(n => n.trim().toLowerCase() !== "null null")), + ...originalDefendantDetails.filter(n => n.trim().toLowerCase() === "null null") + ]; + allPartyDetails.push(`${payLoad.claimantName} - Claimant 1`); + } + + private async enterApplicationDetails(appDetails: actionRecord) { + let date = CaseManagementCommonUtils.getRandomDate(appDetails.dateType as string); + await performAction('clickRadioButton', { question: appDetails.question1, option: appDetails.option1 }); + + await performActions('Enter Date', + ['inputText', appDetails.label1, date.split('/')[0]], + ['inputText', appDetails.label2, date.split('/')[1]], + ['inputText', appDetails.label3, date.split('/')[2]]); + await performAction('clickRadioButton', { question: appDetails.question2, option: appDetails.option2 }); + if (appDetails.option2 === 'Something else') { + performAction('inputText', appDetails.label, CaseManagementCommonUtils.generateRandomString(appDetails.input as number)) + } + await performAction('reTryOnCallBackError', enterGenappApplication.continueButton, appDetails.nextPage as string); + } + + private async confirmIfCourtHearingInNext14Days(courtHearing: 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}` }); + await performAction('clickRadioButton', { + question: courtHearing.question, + option: courtHearing.option, + }); + await performAction('reTryOnCallBackError', enterGenAppHearingDate.continueButton, courtHearing.nextPage as string); + } + + 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 () => { + await performAction('clickButton', validationArr.button); + await performValidation('errorMessage', !validationArr?.header ? validationArr.header = 'There is a problem' : validationArr.header, item.errMessage); + }).toPass({ + timeout: VERY_LONG_TIMEOUT, + }); + 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; + + default: + throw new Error(`Validation type :"${validationArr.validationType}" is not valid`); + }; + } + } + if (validationArr.buttonRemove) { + await performAction('removeFile'); + await page.waitForTimeout(6000); + } + } } 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..f258132a24 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,14 +1,16 @@ 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 { changeCaseState, enterGenappApplication, enterGenAppHearingDate, selectDocument } from '@data/page-data-figma/page-data-caseManagement-figma'; +import { allPartyDetails } from './caseManagement.action'; 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)], ['errorValidationChangeCaseStatePage', () => this.errorValidationChangeCaseStatePage(errorFlag as string)], - + ['errorValidationEnterGeneralAppPage', () => this.errorValidationEnterGeneralAppPage(errorFlag as string)], + ['errorValidationHearingDatePage', () => this.errorValidationHearingDatePage(errorFlag as string)], ]); const actionToPerform = actionsMap.get(action); if (!actionToPerform) throw new Error(`No action found for '${action}'`); @@ -46,4 +48,59 @@ export class ErrorValidationAction implements IAction { } } + private async errorValidationEnterGeneralAppPage(validationReq: string) { + if (validationReq === 'YES') { + await performAction('inputErrorValidation', { + validationType: enterGenappApplication.errorValidationType.two, + inputArray: enterGenappApplication.errorValidationField.errorRadioOption1, + question: enterGenappApplication.whichPartyMadeAppQuestion, + option: allPartyDetails[0], + button: enterGenappApplication.continueButton + }); + + await performAction('inputErrorValidation', { + validationType: enterGenappApplication.errorValidationType.two, + inputArray: enterGenappApplication.errorValidationField.errorRadioOption2, + question: enterGenappApplication.typeOfAppQuestion, + option: enterGenappApplication.adjournRadioOption, + button: enterGenappApplication.continueButton + }); + await performAction('inputErrorValidation', { + validationType: enterGenappApplication.errorValidationType.five, + inputArray: enterGenappApplication.errorValidationField.errorDateField, + header: enterGenappApplication.eventCouldNotBeCreatedErrorMessageHeader, + header1: enterGenappApplication.thereIsProbErrorMessageHeader, + question: enterGenappApplication.whatDateAppReceivedQuestion, + label1: enterGenappApplication.dayTextLabel, + label2: enterGenappApplication.monthTextLabel, + label3: enterGenappApplication.yearTextLabel, + button: enterGenappApplication.continueButton + }); + await performAction('clickRadioButton', { + question: enterGenappApplication.typeOfAppQuestion, + option: enterGenappApplication.somethingElseRadioOption, + }); + await performAction('inputErrorValidation', { + validationType: enterGenappApplication.errorValidationType.one, + inputArray: enterGenappApplication.errorValidationField.errorTextField, + header: enterGenappApplication.eventCouldNotBeCreatedErrorMessageHeader, + label: enterGenappApplication.whichCategoriesHiddenTextLabel, + button: enterGenappApplication.continueButton + }); + + } + } + + private async errorValidationHearingDatePage(validationReq: string) { + if (validationReq === 'YES') { + await performAction('inputErrorValidation', { + validationType: enterGenAppHearingDate.errorValidationType.two, + inputArray: enterGenAppHearingDate.errorValidationField.errorRadioOption, + question: enterGenAppHearingDate.hearingInNext14DaysQuestion, + option: enterGenAppHearingDate.yesRadioOption, + button: enterGenAppHearingDate.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(''); + } + +} diff --git a/src/e2eTest/utils/controller-caseManagement.ts b/src/e2eTest/utils/controller-caseManagement.ts index b2ce79aa06..f4a340833a 100644 --- a/src/e2eTest/utils/controller-caseManagement.ts +++ b/src/e2eTest/utils/controller-caseManagement.ts @@ -70,7 +70,7 @@ async function validatePageIfNavigated(action: string): Promise { } function captureDataForCYA(action: string, fieldName?: actionData | actionRecord, value?: actionData | actionRecord): void { - if (action === 'changeCaseState') { + if (action === 'changeCaseState' || action === 'enterAppDetails') { captureDataForCYAPage = true; } 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..84ee1ddf79 100644 --- a/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts +++ b/src/e2eTest/utils/registry/registry-caseManagement/action-caseManagement.registry.ts @@ -38,9 +38,13 @@ export class ActionCMRegistry { ['selectDocumentToAmend', new CaseManagementAction()], ['changeCaseState', new CaseManagementAction()], ['confirmCaseStateChange', new CaseManagementAction()], + ['getAllPartyDetails', new CaseManagementAction()], + ['enterApplicationDetails', new CaseManagementAction()], + ['confirmIfCourtHearingInNext14Days', new CaseManagementAction()], ['errorValidationSelectDocumentPage', new ErrorValidationAction()], ['errorValidationChangeCaseStatePage', new ErrorValidationAction()], - ['errorValidationSelectDocumentPage', new ErrorValidationAction()], + ['errorValidationEnterGeneralAppPage', new ErrorValidationAction()], + ['errorValidationHearingDatePage', new ErrorValidationAction()], ['inputErrorValidation', new CaseManagementAction()], ['reTryOnCallBackError', new RetryOnCallBackError()], diff --git a/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts b/src/e2eTest/utils/validations/element-validations/pageContent.validation.ts index 7594c6e49e..098fe7ebe6 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", "enterGenApp"].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", "enterGenApp"].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", "enterGenApp"].some(str => url.includes(str) )) { mappingPath = path.join(__dirname, '../../../data/page-data-figma/page-data-caseManagement-figma/urlToFileMappingCM.ts');