Skip to content

Commit

Permalink
Merge branch 'master' into CIV-16469_e2e_ga_tests
Browse files Browse the repository at this point in the history
  • Loading branch information
CourtneySuhr-Solirius authored Feb 12, 2025
2 parents cb5eacb + 11280ac commit e7b9fde
Show file tree
Hide file tree
Showing 7 changed files with 472 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export const getHearingDocumentsCaseDocumentIdByType = ((hearingDocuments: CaseP

export class CaseProgressionHearing {
hearingDocuments?: CaseProgressionHearingDocuments[];
hearingDocumentsWelsh?: CaseProgressionHearingDocuments[];
hearingLocation?: HearingLocation;
hearingDate?: Date;
hearingTimeHourMinute?: string;
Expand Down
1 change: 1 addition & 0 deletions src/main/common/models/civilClaimResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ export interface CCDClaim extends ClaimUpdate {
detailsOfWhyDoesYouDisputeTheClaim?: string;
respondToAdmittedClaimOwingAmount?: string;
hearingDocuments?: CaseProgressionHearingDocuments[];
hearingDocumentsWelsh?: CaseProgressionHearingDocuments[];
hearingDate?: Date;
hearingLocation?: HearingLocation;
hearingTimeHourMinute?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {YesNo} from 'form/models/yesNo';
import {generateRedisKey, saveDraftClaim} from 'modules/draft-store/draftStoreService';
import {getSystemGeneratedCaseDocumentIdByType} from 'models/document/systemGeneratedCaseDocuments';
import {documentIdExtractor} from 'common/utils/stringUtils';
import {checkWelshHearingNotice} from 'services/features/caseProgression/hearing/hearingService';

const civilServiceApiBaseUrl = config.get<string>('services.civilService.url');
const civilServiceClient: CivilServiceClient = new CivilServiceClient(civilServiceApiBaseUrl);
Expand Down Expand Up @@ -48,6 +49,7 @@ async function getDashboardNotificationRedirectUrl(locationName: string, claimId

let redirectUrl;
const claim = await civilServiceClient.retrieveClaimDetails(claimId, req);
const lang = req.query.lang ? req.query.lang : req.cookies.lang;

switch(locationName) {
case 'VIEW_BUNDLE':
Expand All @@ -57,6 +59,13 @@ async function getDashboardNotificationRedirectUrl(locationName: string, claimId
redirectUrl = VIEW_ORDERS_AND_NOTICES_URL.replace(':id', claimId);
break;
case 'VIEW_HEARING_NOTICE':
if (claim?.caseProgressionHearing?.hearingDocumentsWelsh && claim.caseProgressionHearing.hearingDocumentsWelsh[0] && lang === 'cy') {
if (checkWelshHearingNotice(claim)) {
redirectUrl = CASE_DOCUMENT_VIEW_URL.replace(':id', claimId).replace(
':documentId', documentIdExtractor(claim.caseProgressionHearing.hearingDocumentsWelsh[0].value.documentLink.document_binary_url));
break;
}
}
redirectUrl = CASE_DOCUMENT_VIEW_URL.replace(':id', claimId).replace(
':documentId', documentIdExtractor(claim?.caseProgressionHearing?.hearingDocuments[0]?.value?.documentLink?.document_binary_url));
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@ import {Claim} from 'models/claim';
import {ClaimSummaryContent, ClaimSummarySection, ClaimSummaryType} from 'form/models/claimSummarySection';
import {SummaryRow} from 'models/summaryList/summaryList';
import {t} from 'i18next';
import {
formatDocumentAlignedViewURL,
formatDocumentWithHintText,
} from 'common/utils/formatDocumentURL';
import {formatDocumentAlignedViewURL, formatDocumentWithHintText} from 'common/utils/formatDocumentURL';
import {CaseProgressionHearingDocuments} from 'models/caseProgression/caseProgressionHearing';
import {constructResponseUrlWithIdParams} from 'common/utils/urlFormatter';
import {PageSectionBuilder} from 'common/utils/pageSectionBuilder';
import {alignText} from 'form/models/alignText';
import {ClaimBilingualLanguagePreference} from 'models/claimBilingualLanguagePreference';
import {LanguageOptions} from 'models/directionsQuestionnaire/languageOptions';

export function getHearingContent(claimId: string, claim: Claim, lang: string, redirectUrl:string): ClaimSummaryContent[] {

Expand Down Expand Up @@ -42,6 +41,7 @@ function getHearingsSummary(claim: Claim,lang: string): ClaimSummarySection {

const hearingRows = [] as SummaryRow[];
const hearingDocuments :CaseProgressionHearingDocuments[] = claim.caseProgressionHearing?.hearingDocuments;
const hearingDocumentsWelsh: CaseProgressionHearingDocuments[] = claim.caseProgressionHearing?.hearingDocumentsWelsh;

for(const hearingDocument of hearingDocuments){

Expand All @@ -54,6 +54,19 @@ function getHearingsSummary(claim: Claim,lang: string): ClaimSummarySection {
}
}

if(claim.caseProgressionHearing?.hearingDocumentsWelsh) {
for(const hearingDocumentWelsh of hearingDocumentsWelsh) {
if (checkWelshHearingNotice(claim)) {
if(hearingDocumentWelsh?.value) {
const hearingDocumentLink = formatDocumentAlignedViewURL(hearingDocumentWelsh.value?.documentName, claim.id, hearingDocumentWelsh.value?.documentLink.document_binary_url,alignText.ALIGN_TO_THE_RIGHT);
const hearingDoc = formatDocumentWithHintText(t('PAGES.DASHBOARD.HEARINGS.HEARING_NOTICE', {lng:lang}),hearingDocumentWelsh.value?.createdDatetime,lang);
hearingRows.push({key:{html:hearingDoc,classes:'govuk-!-width-one-half'}, value:{html: hearingDocumentLink},
});
}
}
}
}

return {type:ClaimSummaryType.SUMMARY, data:{rows:hearingRows}};
}
function getButton(claimId: string, claim: Claim, lang: string, redirectUrl:string): ClaimSummaryContent {
Expand All @@ -64,3 +77,24 @@ function getButton(claimId: string, claim: Claim, lang: string, redirectUrl:stri

return {contentSections: buttonSection, hasDivider: false};
}

export function checkWelshHearingNotice(claim: Claim): boolean {

const isWelshLanguage = (lang?: LanguageOptions): boolean => {
return lang === LanguageOptions.WELSH || lang === LanguageOptions.WELSH_AND_ENGLISH;
};

const docsLanguageClaimant = claim?.claimantResponse?.directionQuestionnaire?.welshLanguageRequirements?.language?.documentsLanguage;
const docsLanguageDefendant = claim?.directionQuestionnaire?.welshLanguageRequirements?.language?.documentsLanguage;
const isDocsLanguageWelsh = isWelshLanguage(docsLanguageClaimant);
const isDocsLanguageWelshDefendant = isWelshLanguage(docsLanguageDefendant);

const isClaimantWelshBilingual =
claim.claimantBilingualLanguagePreference === ClaimBilingualLanguagePreference.WELSH_AND_ENGLISH;

const isDefendantLipResponseBoth =
claim.respondent1LiPResponse?.respondent1ResponseLanguage === 'BOTH';

return ((claim.isClaimant() && (isClaimantWelshBilingual || isDocsLanguageWelsh)) ||
(claim.isDefendant() && (isDefendantLipResponseBoth || isDocsLanguageWelshDefendant)));
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export const toCUICaseProgressionHearing = (ccdClaim: CCDClaim): CaseProgression
if (ccdClaim) {
const caseProgressionHearing : CaseProgressionHearing = new CaseProgressionHearing();
caseProgressionHearing.hearingDocuments = ccdClaim.hearingDocuments;
caseProgressionHearing.hearingDocumentsWelsh = ccdClaim.hearingDocumentsWelsh;
caseProgressionHearing.hearingDate = ccdClaim.hearingDate;
caseProgressionHearing.hearingLocation = new HearingLocation(ccdClaim.hearingLocation?.value);
caseProgressionHearing.hearingTimeHourMinute = ccdClaim.hearingTimeHourMinute;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import {civilClaimResponseMock} from '../../../../utils/mockDraftStore';
import {CivilServiceClient} from 'client/civilServiceClient';
import * as StringUtils from 'common/utils/stringUtils';
import {getCaseProgressionHearingMock} from '../../../../utils/caseProgression/mockCaseProgressionHearing';
import {ClaimBilingualLanguagePreference} from 'models/claimBilingualLanguagePreference';
import {CaseRole} from 'form/models/caseRoles';
import {CCDRespondentLiPResponse, CCDRespondentResponseLanguage} from 'models/ccdResponse/ccdRespondentLiPResponse';
import {checkWelshHearingNotice} from 'services/features/caseProgression/hearing/hearingService';
import {CaseProgressionHearingDocuments} from 'models/caseProgression/caseProgressionHearing';

jest.mock('../../../../../main/modules/oidc');
jest.mock('../../../../../main/modules/draft-store');
Expand Down Expand Up @@ -355,4 +360,217 @@ describe('Notification Redirect Controller - Get', () => {
expect(res.text).toBe('Found. Redirecting to /case/123/view-documents/undefined');
});
});

it('Redirect to view welsh hearing notice claimant', async () => {
//given
const claim: Claim = new Claim();
claim.id = '123';

nock(civilServiceUrl)
.put(CIVIL_SERVICE_RECORD_NOTIFICATION_CLICK_URL.replace(':notificationId', '321'))
.reply(200, {});

claim.caseProgressionHearing = getCaseProgressionHearingMock();
claim.caseProgressionHearing.hearingDocumentsWelsh = claim.caseProgressionHearing.hearingDocuments;
claim.claimantBilingualLanguagePreference = ClaimBilingualLanguagePreference.WELSH_AND_ENGLISH;
claim.caseRole = CaseRole.CLAIMANT;
jest
.spyOn(CivilServiceClient.prototype, 'retrieveClaimDetails')
.mockResolvedValueOnce(claim);

//when
await request(app)
.get(DASHBOARD_NOTIFICATION_REDIRECT
.replace(':id', '123')
.replace(':locationName', 'VIEW_HEARING_NOTICE')
.replace(':notificationId', '321'))
//then
.expect((res: Response) => {
expect(res.status).toBe(302);
expect(res.text).toBe('Found. Redirecting to /case/123/view-documents/e9fd1e10-baf2-4d95-bc79-bdeb9f3a2ab6');
});
});

it('Redirect to view welsh hearing notice defendant', async () => {
//given
const claim: Claim = new Claim();
claim.id = '123';

nock(civilServiceUrl)
.put(CIVIL_SERVICE_RECORD_NOTIFICATION_CLICK_URL.replace(':notificationId', '321'))
.reply(200, {});

const ccdRespondLipResponse : CCDRespondentLiPResponse = {
respondent1MediationLiPResponse: undefined,
respondent1ResponseLanguage: CCDRespondentResponseLanguage.BOTH,
};

claim.caseProgressionHearing = getCaseProgressionHearingMock();
claim.caseProgressionHearing.hearingDocumentsWelsh = claim.caseProgressionHearing.hearingDocuments;
claim.caseRole = CaseRole.DEFENDANT;
claim.respondent1LiPResponse = ccdRespondLipResponse;

jest
.spyOn(CivilServiceClient.prototype, 'retrieveClaimDetails')
.mockResolvedValueOnce(claim);

//when
await request(app)
.get(DASHBOARD_NOTIFICATION_REDIRECT
.replace(':id', '123')
.replace(':locationName', 'VIEW_HEARING_NOTICE')
.replace(':notificationId', '321'))
//then
.expect((res: Response) => {
expect(res.status).toBe(302);
expect(res.text).toBe('Found. Redirecting to /case/123/view-documents/e9fd1e10-baf2-4d95-bc79-bdeb9f3a2ab6');
});
});

it('Redirect to english hearing notice if hearingDocumentsWelsh exists but user prefers only english (claimant)', async () => {
//given
const claim: Claim = new Claim();
claim.id = '123';

nock(civilServiceUrl)
.put(CIVIL_SERVICE_RECORD_NOTIFICATION_CLICK_URL.replace(':notificationId', '321'))
.reply(200, {});

claim.caseProgressionHearing = getCaseProgressionHearingMock();
claim.caseProgressionHearing.hearingDocumentsWelsh = claim.caseProgressionHearing.hearingDocuments;

claim.caseRole = CaseRole.CLAIMANT;
claim.claimantBilingualLanguagePreference = ClaimBilingualLanguagePreference.ENGLISH;

jest
.spyOn(CivilServiceClient.prototype, 'retrieveClaimDetails')
.mockResolvedValueOnce(claim);

//when
await request(app)
.get(DASHBOARD_NOTIFICATION_REDIRECT
.replace(':id', '123')
.replace(':locationName', 'VIEW_HEARING_NOTICE')
.replace(':notificationId', '321'))
//then
.expect((res: Response) => {
expect(res.status).toBe(302);
expect(res.text).toBe('Found. Redirecting to /case/123/view-documents/e9fd1e10-baf2-4d95-bc79-bdeb9f3a2ab6');
});
});

it('Redirect to english hearing notice if hearingDocumentsWelsh[0] is missing/invalid, even when user has welsh preference', async () => {
//given
const claim: Claim = new Claim();
claim.id = '123';

nock(civilServiceUrl)
.put(CIVIL_SERVICE_RECORD_NOTIFICATION_CLICK_URL.replace(':notificationId', '321'))
.reply(200, {});

claim.caseProgressionHearing = getCaseProgressionHearingMock();
claim.caseProgressionHearing.hearingDocumentsWelsh = [];

claim.caseRole = CaseRole.CLAIMANT;
claim.claimantBilingualLanguagePreference = ClaimBilingualLanguagePreference.WELSH_AND_ENGLISH;

jest
.spyOn(CivilServiceClient.prototype, 'retrieveClaimDetails')
.mockResolvedValueOnce(claim);

//when
await request(app)
.get(DASHBOARD_NOTIFICATION_REDIRECT
.replace(':id', '123')
.replace(':locationName', 'VIEW_HEARING_NOTICE')
.replace(':notificationId', '321'))
//then
.expect((res: Response) => {
expect(res.status).toBe(302);
expect(res.text).toBe('Found. Redirecting to /case/123/view-documents/e9fd1e10-baf2-4d95-bc79-bdeb9f3a2ab6');
});
});
});

jest.mock('client/civilServiceClient');
jest.mock('services/features/caseProgression/hearing/hearingService', () => {
const originalModule = jest.requireActual('services/features/caseProgression/hearing/hearingService');
return {
...originalModule,
checkWelshHearingNotice: jest.fn(),
};
});

describe('notificationRedirectController - VIEW_HEARING_NOTICE (Welsh block)', () => {
const mockCivilServiceClient = new CivilServiceClient(config.get('services.civilService.url'));
const baseUrl = DASHBOARD_NOTIFICATION_REDIRECT
.replace(':id', '123')
.replace(':notificationId', '456')
.replace(':locationName', 'VIEW_HEARING_NOTICE');

let claim: Claim;

beforeEach(() => {
claim = new Claim();
claim.id = '123';
claim.caseProgressionHearing = {
hearingDurationInMinutesAHN: '',
hearingFeePaymentDetails: undefined, getDurationOfDaysForHearing(): number {
return 0;
}, getHearingDateFormatted(lang: string): string {
return '';
}, getHearingTimeHourMinuteFormatted(): string {
return '';
}, hearingDocuments: [], hearingDocumentsWelsh: [] };
mockCivilServiceClient.retrieveClaimDetails = jest.fn().mockResolvedValue(claim);
CivilServiceClient.prototype.recordClick = jest.fn().mockResolvedValue({});
CivilServiceClient.prototype.retrieveClaimDetails = mockCivilServiceClient.retrieveClaimDetails;
(checkWelshHearingNotice as jest.Mock).mockReturnValue(false);
});

it('should not redirect to Welsh doc if hearingDocumentsWelsh is empty', async () => {
claim.caseProgressionHearing.hearingDocumentsWelsh = [];
(checkWelshHearingNotice as jest.Mock).mockReturnValue(true);
const res = await request(app).get(`${baseUrl}?lang=cy`).send();
expect(res.status).toBe(302);
expect(res.text).toContain('/case/123/view-documents/undefined');
});

it('should not redirect to Welsh doc if first item is missing', async () => {
claim.caseProgressionHearing.hearingDocumentsWelsh = null;
(checkWelshHearingNotice as jest.Mock).mockReturnValue(true);
const res = await request(app).get(`${baseUrl}?lang=cy`).send();
expect(res.status).toBe(302);
expect(res.text).toContain('/case/123/view-documents/undefined');
});

it('should not redirect to Welsh doc if lang != cy', async () => {
claim.caseProgressionHearing.hearingDocumentsWelsh = [
{ id: 'wDoc', value: { documentLink: { document_binary_url: 'http://doc/binary' } } } as CaseProgressionHearingDocuments,
];
(checkWelshHearingNotice as jest.Mock).mockReturnValue(true);
const res = await request(app).get(baseUrl).send();
expect(res.status).toBe(302);
expect(res.text).toContain('/case/123/view-documents/undefined');
});

it('should not redirect to Welsh doc if checkWelshHearingNotice is false', async () => {
claim.caseProgressionHearing.hearingDocumentsWelsh = [
{ id: 'wDoc', value: { documentLink: { document_binary_url: 'http://dm-store/binary' } } } as CaseProgressionHearingDocuments,
];
(checkWelshHearingNotice as jest.Mock).mockReturnValue(false);
const res = await request(app).get(`${baseUrl}?lang=cy`).send();
expect(res.status).toBe(302);
expect(res.text).toContain('/case/123/view-documents/undefined');
});

it('should redirect to Welsh doc if doc exists, lang=cy and checkWelshHearingNotice is true', async () => {
claim.caseProgressionHearing.hearingDocumentsWelsh = [
{ id: 'wDoc', value: { documentLink: { document_binary_url: 'http://dm-store/binary' } } } as CaseProgressionHearingDocuments,
];
(checkWelshHearingNotice as jest.Mock).mockReturnValue(true);
const res = await request(app).get(`${baseUrl}?lang=cy`).send();
expect(res.status).toBe(302);
expect(res.text).toContain('Found. Redirecting to /case/123/view-documents/undefined');
});
});
Loading

0 comments on commit e7b9fde

Please sign in to comment.