From 4817a0a544f7bf292c75816f008a4be0f3bc3bd5 Mon Sep 17 00:00:00 2001 From: Alistair Osborne Date: Wed, 20 Nov 2024 10:33:12 +0000 Subject: [PATCH] DFPL-2454: Add Attach document to Judicial Message flow (#5655) * DFPL-2454: Add Attach document to Judicial Message flow * remove old reply message tests, tests no longer required and add tests for document selecting * update controller test + mid event name * update controller test + mid event name * add validation and list population tests * add about to start tests and remove old one + checkstyle * fix old tests and add remove temp fields from controller for email validation * checkstyle * add playwright tests and add back remove transient fields * update to use only existing documents and rename method * fix tests * checkstyle * fix test mock --------- Co-authored-by: Braimah101 <41795070+Braimah101@users.noreply.github.com> --- .../CareSupervision/court-admin.json | 23 +- .../CareSupervision/gatekeeper.json | 23 +- .../CareSupervision/judiciary.json | 23 +- .../CareSupervision/messageJudge.json | 104 ++-- .../CareSupervision/messageJudge.json | 34 +- .../MessageAttachmentSelector.json | 23 + .../messageJudgeOrLegalAdviserEvent.page.js | 10 +- .../caseData/mandatorySubmissionFields.json | 19 + playwright-e2e/pages/judicial-message.ts | 32 +- playwright-e2e/tests/judicial-message.spec.ts | 18 +- ...essageJudgeControllerAboutToStartTest.java | 57 +-- ...ssageJudgeControllerAboutToSubmitTest.java | 31 +- ...ControllerPopulateLabelsMidEventTest.java} | 93 ++-- ...geControllerPopulateListsMidEventTest.java | 183 +++++++ ...ssageJudgeControllerAboutToSubmitTest.java | 7 +- ...nageDocumentsControllerV2MidEventTest.java | 12 +- .../controllers/MessageJudgeController.java | 26 +- .../ManageDocumentsControllerV2.java | 6 +- .../fpl/enums/MessageRegardingDocuments.java | 5 + .../model/event/MessageJudgeEventData.java | 11 +- .../fpl/service/MessageJudgeService.java | 4 + .../service/SendNewMessageJudgeService.java | 92 +++- .../document/ManageDocumentService.java | 26 +- .../service/ManageDocumentServiceTest.java | 32 +- .../SendNewMessageJudgeServiceTest.java | 471 ++++++++---------- 25 files changed, 896 insertions(+), 469 deletions(-) create mode 100644 ccd-definition/FixedLists/CareSupervision/MessageAttachmentSelector.json rename service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/{MessageJudgeControllerMidEventTest.java => MessageJudgeControllerPopulateLabelsMidEventTest.java} (63%) create mode 100644 service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateListsMidEventTest.java create mode 100644 service/src/main/java/uk/gov/hmcts/reform/fpl/enums/MessageRegardingDocuments.java diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/court-admin.json b/ccd-definition/AuthorisationCaseField/CareSupervision/court-admin.json index fc4a23691b7..8ef98f58910 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/court-admin.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/court-admin.json @@ -3866,7 +3866,7 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "isMessageRegardingAdditionalApplications", + "CaseFieldID": "isMessageRegardingDocuments", "UserRole": "caseworker-publiclaw-courtadmin", "CRUD": "CRUD" }, @@ -3877,6 +3877,20 @@ "UserRole": "caseworker-publiclaw-courtadmin", "CRUD": "CRUD" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentTypesDynamicList", + "UserRole": "caseworker-publiclaw-courtadmin", + "CRUD": "CRUD" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentDynamicList", + "UserRole": "caseworker-publiclaw-courtadmin", + "CRUD": "CRUD" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", @@ -3898,6 +3912,13 @@ "UserRole": "caseworker-publiclaw-courtadmin", "CRUD": "CRD" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "attachDocumentLabel", + "UserRole": "caseworker-publiclaw-courtadmin", + "CRUD": "CRD" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json index 68f0cd71f78..ce04be8da4f 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json @@ -2571,7 +2571,21 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "isMessageRegardingAdditionalApplications", + "CaseFieldID": "isMessageRegardingDocuments", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRUD" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentTypesDynamicList", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRUD" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentDynamicList", "UserRole": "caseworker-publiclaw-gatekeeper", "CRUD": "CRUD" }, @@ -3086,6 +3100,13 @@ "UserRole": "caseworker-publiclaw-gatekeeper", "CRUD": "CRD" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "attachDocumentLabel", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRD" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json index c17726864c1..0da8e4c7d56 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json @@ -2746,7 +2746,21 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "isMessageRegardingAdditionalApplications", + "CaseFieldID": "isMessageRegardingDocuments", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRUD" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentTypesDynamicList", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRUD" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "documentDynamicList", "UserRole": "caseworker-publiclaw-judiciary", "CRUD": "CRUD" }, @@ -3268,6 +3282,13 @@ "UserRole": "caseworker-publiclaw-judiciary", "CRUD": "CRD" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "attachDocumentLabel", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRD" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/CaseEventToFields/CareSupervision/messageJudge.json b/ccd-definition/CaseEventToFields/CareSupervision/messageJudge.json index ec01083998c..d8fc51db12f 100644 --- a/ccd-definition/CaseEventToFields/CareSupervision/messageJudge.json +++ b/ccd-definition/CaseEventToFields/CareSupervision/messageJudge.json @@ -3,93 +3,130 @@ "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "isJudiciary", - "PageDisplayOrder": 2, + "CaseFieldID": "hasAdditionalApplications", "PageFieldDisplayOrder": 1, - "PageID": "NewMessageMetaData", "DisplayContext": "READONLY", + "PageID": "AttachmentSelectorPage", "ShowSummaryChangeOption": "N", - "FieldShowCondition": "hasAdditionalApplications=\"DO NOT SHOW\"" + "PageDisplayOrder": 1, + "FieldShowCondition": "isMessageRegardingDocuments=\"DO_NOT_SHOW\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "hasAdditionalApplications", + "CaseFieldID": "isMessageRegardingDocuments", + "PageFieldDisplayOrder": 2, + "DisplayContext": "MANDATORY", + "PageID": "AttachmentSelectorPage", + "ShowSummaryChangeOption": "Y", + "PageDisplayOrder": 1 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "messageJudgeOrLegalAdviser", + "CaseFieldID": "documentTypesDynamicList", + "PageFieldDisplayOrder": 3, + "PageID": "AttachmentSelectorPage", + "DisplayContext": "MANDATORY", + "ShowSummaryChangeOption": "Y", + "PageDisplayOrder": 1, + "FieldShowCondition": "isMessageRegardingDocuments=\"DOCUMENT\"", + "CallBackURLMidEvent": "${CCD_DEF_CASE_SERVICE_BASE_URL}/callback/message-judge/populate-lists/mid-event" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "messageJudgeOrLegalAdviser", + "CaseFieldID": "attachDocumentLabel", "PageFieldDisplayOrder": 1, "DisplayContext": "READONLY", - "PageID": "NewMessageMetaData", + "PageLabel": "Attachments", + "PageID": "MessageDocumentSelector", "ShowSummaryChangeOption": "N", "PageDisplayOrder": 2, - "FieldShowCondition": "isMessageRegardingAdditionalApplications=\"DO_NOT_SHOW\"", - "CallBackURLMidEvent": "${CCD_DEF_CASE_SERVICE_BASE_URL}/callback/message-judge/mid-event" + "PageShowCondition": "isMessageRegardingDocuments!=\"NONE\"", + "CallBackURLMidEvent": "${CCD_DEF_CASE_SERVICE_BASE_URL}/callback/message-judge/populate-document-labels/mid-event" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "isMessageRegardingAdditionalApplications", + "CaseFieldID": "additionalApplicationsDynamicList", "PageFieldDisplayOrder": 2, "DisplayContext": "MANDATORY", - "PageID": "NewMessageMetaData", + "PageID": "MessageDocumentSelector", "ShowSummaryChangeOption": "Y", "PageDisplayOrder": 2, - "FieldShowCondition": "hasAdditionalApplications=\"Yes\"" + "FieldShowCondition": "isMessageRegardingDocuments=\"APPLICATION\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "additionalApplicationsDynamicList", + "CaseFieldID": "documentDynamicList", "PageFieldDisplayOrder": 3, "DisplayContext": "MANDATORY", - "PageID": "NewMessageMetaData", + "PageID": "MessageDocumentSelector", "ShowSummaryChangeOption": "Y", "PageDisplayOrder": 2, - "FieldShowCondition": "isMessageRegardingAdditionalApplications=\"Yes\"" + "FieldShowCondition": "isMessageRegardingDocuments=\"DOCUMENT\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "messageJudgeOrLegalAdviser", + "CaseFieldID": "relatedDocumentsLabel", + "PageFieldDisplayOrder": 1, + "DisplayContext": "READONLY", + "PageID": "NewMessageMetaData", + "ShowSummaryChangeOption": "N", + "PageDisplayOrder": 3, + "FieldShowCondition": "isMessageRegardingDocuments=\"DOCUMENT\" OR isMessageRegardingDocuments=\"APPLICATION\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", "CaseFieldID": "judicialMessageMetaData", - "PageFieldDisplayOrder": 4, + "PageFieldDisplayOrder": 2, "DisplayContext": "COMPLEX", "PageID": "NewMessageMetaData", "ShowSummaryChangeOption": "Y", - "PageDisplayOrder": 2 + "PageDisplayOrder": 3 }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "nextHearingLabel", - "PageFieldDisplayOrder": 1, + "CaseFieldID": "isJudiciary", + "PageDisplayOrder": 3, + "PageFieldDisplayOrder": 3, + "PageID": "NewMessageMetaData", "DisplayContext": "READONLY", - "PageID": "NewMessageNote", "ShowSummaryChangeOption": "N", - "PageDisplayOrder": 3 + "FieldShowCondition": "hasAdditionalApplications=\"DO NOT SHOW\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", - "CaseFieldID": "relatedDocumentsLabel", - "PageFieldDisplayOrder": 2, + "CaseFieldID": "nextHearingLabel", + "PageFieldDisplayOrder": 4, "DisplayContext": "READONLY", - "PageID": "NewMessageNote", + "PageID": "NewMessageMetaData", "ShowSummaryChangeOption": "N", - "PageDisplayOrder": 3, - "FieldShowCondition": "isMessageRegardingAdditionalApplications=\"Yes\"" + "PageDisplayOrder": 3 }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", "CaseFieldID": "judicialMessageNote", - "PageFieldDisplayOrder": 4, + "PageFieldDisplayOrder": 5, "DisplayContext": "MANDATORY", - "PageID": "NewMessageNote", + "PageID": "NewMessageMetaData", "ShowSummaryChangeOption": "Y", "PageDisplayOrder": 3 }, @@ -98,25 +135,24 @@ "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", "CaseFieldID": "latestRoleSent", - "PageFieldDisplayOrder": 5, + "PageFieldDisplayOrder": 6, "DisplayContext": "MANDATORY", - "PageID": "NewMessageNote", + "PageID": "NewMessageMetaData", "ShowSummaryChangeOption": "N", "PageDisplayOrder": 3, "Publish": "Y", - "FieldShowCondition": "isMessageRegardingAdditionalApplications=\"DO_NOT_SHOW\"" + "FieldShowCondition": "isMessageRegardingDocuments=\"DO_NOT_SHOW\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "messageJudgeOrLegalAdviser", "CaseFieldID": "court", - "PageFieldDisplayOrder": 100, + "PageFieldDisplayOrder": 7, "DisplayContext": "READONLY", - "PageID": "NewMessageNote", + "PageID": "NewMessageMetaData", "PageDisplayOrder": 3, - "PageColumnNumber": 1, "Publish": "Y", - "FieldShowCondition": "isMessageRegardingAdditionalApplications=\"DO_NOT_SHOW\"" + "FieldShowCondition": "isMessageRegardingDocuments=\"DO_NOT_SHOW\"" } ] diff --git a/ccd-definition/CaseField/CareSupervision/messageJudge.json b/ccd-definition/CaseField/CareSupervision/messageJudge.json index ee3fb8f906c..4f6a9cef087 100644 --- a/ccd-definition/CaseField/CareSupervision/messageJudge.json +++ b/ccd-definition/CaseField/CareSupervision/messageJudge.json @@ -11,9 +11,28 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "ID": "isMessageRegardingAdditionalApplications", - "Label": "Is it about an Application?", - "FieldType": "YesOrNo", + "ID": "isMessageRegardingDocuments", + "Label": "Is it about an Application or Document?", + "FieldType": "FixedRadioList", + "FieldTypeParameter": "MessageAttachmentSelector", + "SecurityClassification": "Public", + "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "attachDocumentLabel", + "Label": "Attach a document or application", + "FieldType": "TextArea", + "SecurityClassification": "Public", + "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "documentDynamicList", + "FieldType": "DynamicList", + "Label": "Which document?", "SecurityClassification": "Public", "Searchable": "N" }, @@ -26,6 +45,15 @@ "SecurityClassification": "Public", "Searchable": "N" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "documentTypesDynamicList", + "FieldType": "DynamicList", + "Label": "Document type", + "SecurityClassification": "Public", + "Searchable": "N" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/FixedLists/CareSupervision/MessageAttachmentSelector.json b/ccd-definition/FixedLists/CareSupervision/MessageAttachmentSelector.json new file mode 100644 index 00000000000..9715e6d80dc --- /dev/null +++ b/ccd-definition/FixedLists/CareSupervision/MessageAttachmentSelector.json @@ -0,0 +1,23 @@ +[ + { + "LiveFrom": "01/01/2017", + "ID": "MessageAttachmentSelector", + "ListElementCode": "DOCUMENT", + "ListElement": "Document", + "DisplayOrder": 1 + }, + { + "LiveFrom": "01/01/2017", + "ID": "MessageAttachmentSelector", + "ListElementCode": "APPLICATION", + "ListElement": "Application", + "DisplayOrder": 2 + }, + { + "LiveFrom": "01/01/2017", + "ID": "MessageAttachmentSelector", + "ListElementCode": "NONE", + "ListElement": "No attachment", + "DisplayOrder": 3 + } +] diff --git a/e2e/pages/events/messageJudgeOrLegalAdviserEvent.page.js b/e2e/pages/events/messageJudgeOrLegalAdviserEvent.page.js index 16a5b328c9b..77fdaa16984 100644 --- a/e2e/pages/events/messageJudgeOrLegalAdviserEvent.page.js +++ b/e2e/pages/events/messageJudgeOrLegalAdviserEvent.page.js @@ -2,9 +2,9 @@ const {I} = inject(); module.exports = { fields: { - isMessageRegardingAdditionalApplications: { - yes: '#isMessageRegardingAdditionalApplications_Yes', - no: '#isMessageRegardingAdditionalApplications_No', + isMessageRegardingDocuments: { + yes: '#isMessageRegardingDocuments_Yes', + no: '#isMessageRegardingDocuments_No', }, eventOptions: { newMessage: '#messageJudgeOption-NEW_MESSAGE', @@ -49,11 +49,11 @@ module.exports = { }, selectMessageRelatedToAdditionalApplication() { - I.click(this.fields.isMessageRegardingAdditionalApplications.yes); + I.click(this.fields.isMessageRegardingDocuments.yes); }, selectMessageNotRelatedToAdditionalApplication() { - I.click(this.fields.isMessageRegardingAdditionalApplications.no); + I.click(this.fields.isMessageRegardingDocuments.no); }, async selectAdditionalApplication() { diff --git a/playwright-e2e/caseData/mandatorySubmissionFields.json b/playwright-e2e/caseData/mandatorySubmissionFields.json index 252e0bf3d17..be6ffe40beb 100644 --- a/playwright-e2e/caseData/mandatorySubmissionFields.json +++ b/playwright-e2e/caseData/mandatorySubmissionFields.json @@ -166,6 +166,25 @@ } } ], + "skeletonArgumentList": [ + { + "id": "87ac3aa1-5183-4cd3-8d02-3af704c994e4", + "value": { + "document": { + "document_url": "${TEST_DOCUMENT_URL}", + "document_filename": "Test.txt", + "document_binary_url": "${TEST_DOCUMENT_BINARY_URL}" + }, + "uploaderType": "HMCTS", + "uploaderCaseRoles": [], + "markAsConfidential": "No", + "documentAcknowledge": [ + "ACK_RELATED_TO_CASE" + ], + "hasConfidentialAddress": "No" + } + } + ], "dateSubmitted": "TO BE FILLED WITH VALID DATA", "submittedForm": { "document_url": "${TEST_DOCUMENT_URL}", diff --git a/playwright-e2e/pages/judicial-message.ts b/playwright-e2e/pages/judicial-message.ts index c33b0c6ec9e..99bd554539f 100644 --- a/playwright-e2e/pages/judicial-message.ts +++ b/playwright-e2e/pages/judicial-message.ts @@ -14,36 +14,54 @@ export class JudicialMessage extends BasePage readonly messageToReply:Locator; readonly haveToReply : Locator; readonly reply: Locator; + readonly documentType: Locator; + readonly whichDocument: Locator; constructor(page:Page){ super(page); this.whichApplication =page.getByLabel('Which application?'); - this.sender =page.getByLabel('Sender', { exact: true }); + this.sender = page.getByLabel('Sender', { exact: true }); this.recipient = page.getByLabel('Recipient', { exact: true }); this.subject = page.getByLabel('Message subject'); this.urgency = page.getByLabel('Urgency (Optional)'); this.recipientEmail =page.getByLabel('Recipient\'s email address'); - this.message = page.getByLabel('Message'); + this.message = page.getByLabel('Message', { exact: true }); this.messageToReply = page.getByLabel('Your messages'); this.haveToReply = page.getByRole('group', { name: 'Do you need to reply?' }); this.reply = page.getByRole('textbox', { name: 'Reply' }); - + this.documentType = page.getByLabel('Document type'); + this.whichDocument = page.getByLabel('Which document?'); } - async sendMessageToAllocatedJudge(){ - await this.page.getByRole('group',{name: 'Is it about an Application?'}).getByLabel('Yes').check(); + async sendMessageToAllocatedJudgeWithApplication(){ + await this.page.getByRole('group',{name: 'Is it about an Application or Document?'}).getByLabel('Application').check(); + await this.clickContinue(); await this.whichApplication.selectOption('C2, 25 March 2021, 3:16pm'); + await this.clickContinue(); await this.sender.selectOption('CTSC'); await this.recipient.selectOption('Allocated Judge'); await this.page.getByLabel('Recipient\'s email address').click(); await this.recipientEmail.fill('Judge@email.com'); await this.subject.fill('Message To the allocated Judge'); await this.urgency.fill('Urgent'); - await this.clickContinue(); - await this.message.click(); await this.message.fill('message send to allocated Judge'); await this.clickContinue(); + } + async sendMessageToAllocatedJudgeWithDocument(){ + await this.page.getByRole('group',{name: 'Is it about an Application or Document?'}).getByLabel('Document').check(); + await this.documentType.selectOption('Skeleton arguments'); + await this.clickContinue(); + await this.whichDocument.selectOption('Test.txt'); + await this.clickContinue(); + await this.sender.selectOption('CTSC'); + await this.recipient.selectOption('Allocated Judge'); + await this.page.getByLabel('Recipient\'s email address').click(); + await this.recipientEmail.fill('Judge@email.com'); + await this.subject.fill('Message To the allocated Judge'); + await this.urgency.fill('Urgent'); + await this.message.fill('message send to allocated Judge'); + await this.clickContinue(); } async judgeReplyMessage(){ diff --git a/playwright-e2e/tests/judicial-message.spec.ts b/playwright-e2e/tests/judicial-message.spec.ts index b18f51ceb25..030ff274360 100644 --- a/playwright-e2e/tests/judicial-message.spec.ts +++ b/playwright-e2e/tests/judicial-message.spec.ts @@ -15,7 +15,7 @@ test.describe('send and reply message',()=>{ caseNumber = await createCase('e2e case',newSwanseaLocalAuthorityUserOne); }); - test('CTSC admin send message to Judge', + test('CTSC admin send message to Judge with application', async ({page,signInPage,judicialMessages}) => { casename = 'CTSC message Judge ' + dateTime.slice(0, 10); await updateCase(casename,caseNumber,caseData); @@ -23,7 +23,21 @@ test.describe('send and reply message',()=>{ await signInPage.login(CTSCUser.email,CTSCUser.password); await signInPage.navigateTOCaseDetails(caseNumber); await judicialMessages.gotoNextStep('Send messages'); - await judicialMessages.sendMessageToAllocatedJudge(); + await judicialMessages.sendMessageToAllocatedJudgeWithApplication(); + await judicialMessages.checkYourAnsAndSubmit(); + await judicialMessages.tabNavigation('Judicial messages'); + await expect(page.getByText('FamilyPublicLaw+ctsc@gmail.com - Message send to Allocated Judge')).toBeVisible(); + }); + + test('CTSC admin send message to Judge with document', + async ({page,signInPage,judicialMessages}) => { + casename = 'CTSC message Judge ' + dateTime.slice(0, 10); + await updateCase(casename,caseNumber,caseData); + await signInPage.visit(); + await signInPage.login(CTSCUser.email,CTSCUser.password); + await signInPage.navigateTOCaseDetails(caseNumber); + await judicialMessages.gotoNextStep('Send messages'); + await judicialMessages.sendMessageToAllocatedJudgeWithDocument(); await judicialMessages.checkYourAnsAndSubmit(); await judicialMessages.tabNavigation('Judicial messages'); await expect(page.getByText('FamilyPublicLaw+ctsc@gmail.com - Message send to Allocated Judge')).toBeVisible(); diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToStartTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToStartTest.java index 08ea8103f39..e820c77d635 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToStartTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToStartTest.java @@ -1,21 +1,21 @@ package uk.gov.hmcts.reform.fpl.controllers; -import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; -import uk.gov.hmcts.reform.fpl.config.CtscEmailLookupConfiguration; import uk.gov.hmcts.reform.fpl.enums.UserRole; +import uk.gov.hmcts.reform.fpl.enums.notification.DocumentUploaderType; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.OtherApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; import uk.gov.hmcts.reform.fpl.service.UserService; +import uk.gov.hmcts.reform.fpl.service.document.ManageDocumentService; import java.util.List; import java.util.Map; @@ -24,19 +24,17 @@ import static java.util.UUID.randomUUID; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.OtherApplicationType.C1_APPOINTMENT_OF_A_GUARDIAN; import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; -import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.buildDynamicList; @WebMvcTest(MessageJudgeController.class) @OverrideAutoConfiguration(enabled = true) class MessageJudgeControllerAboutToStartTest extends AbstractCallbackTest { - - @SpyBean - private CtscEmailLookupConfiguration ctscEmailLookupConfiguration; - + @MockBean + ManageDocumentService manageDocumentService; @MockBean private UserService userService; @@ -45,7 +43,7 @@ class MessageJudgeControllerAboutToStartTest extends AbstractCallbackTest { } @Test - void shouldInitialiseCaseFieldsWhenAdditionalApplicationsDocumentsExist() { + void shouldInitialiseCaseFieldsForApplicationsAndDocTypes() { UUID c2DocumentBundleId = randomUUID(); UUID otherApplicationsBundleId = randomUUID(); @@ -68,32 +66,29 @@ void shouldInitialiseCaseFieldsWhenAdditionalApplicationsDocumentsExist() { .additionalApplicationsBundle(additionalApplicationsBundles) .build(); - AboutToStartOrSubmitCallbackResponse response = postAboutToStartEvent(caseData); + DynamicListElement documentTypeElement1 = DynamicListElement.builder() + .code("SKELETON_ARGUMENTS") + .label("Skeleton arguments") + .build(); - DynamicList additionalApplicationsDynamicList = mapper.convertValue(response.getData() - .get("additionalApplicationsDynamicList"), DynamicList.class); + DynamicListElement documentTypeElement2 = DynamicListElement.builder() + .code("COURT_BUNDLE") + .label("Court Bundles") + .build(); - DynamicList expectedAdditionalApplicationsDynamicList = buildDynamicList( - Pair.of(otherApplicationsBundleId, "C1, 1 January 2021, 12:00pm"), - Pair.of(c2DocumentBundleId, "C2, 1 January 2021, 12:00pm") - ); + DynamicList docTypeDynamicList = DynamicList.builder() + .listItems(List.of(documentTypeElement1, documentTypeElement2)).build(); - assertThat(additionalApplicationsDynamicList).isEqualTo(expectedAdditionalApplicationsDynamicList); + when(manageDocumentService.buildExistingDocumentTypeDynamicList(any())).thenReturn(docTypeDynamicList); - assertThat(response.getData().get("hasAdditionalApplications")).isEqualTo(YES.getValue()); - } + AboutToStartOrSubmitCallbackResponse response = postAboutToStartEvent(caseData); - @Test - void shouldInitialiseOnlySenderAndRecipientEmailAddressesWhenApplicationDocumentsDoNotExist() { - CaseData caseData = CaseData.builder().id(1111L).build(); - Map caseDetails = postAboutToStartEvent(caseData).getData(); - - assertThat(caseDetails.get("additionalApplicationsDynamicList")).isNull(); - assertThat(caseDetails.get("hasAdditional" - + "Applications")).isNull(); - assertThat(caseDetails.get("judicialMessageMetaData")) - .extracting("sender", "recipient") - .containsExactly(EMPTY, EMPTY); + DynamicList builtDynamicList = mapper.convertValue( + response.getData().get("documentTypesDynamicList"), DynamicList.class + ); + + assertThat(response.getData().get("hasAdditionalApplications")).isEqualTo(YES.getValue()); + assertThat(builtDynamicList).isEqualTo(docTypeDynamicList); } @Test @@ -102,7 +97,7 @@ void shouldPrePopulateRecipientIfCaseInitiatedByJudge() { when(userService.getUserEmail()).thenReturn("sender@mail.com"); when(userService.hasUserRole(UserRole.JUDICIARY)).thenReturn(true); - + when(manageDocumentService.getUploaderType(any())).thenReturn(DocumentUploaderType.HMCTS); Map caseDetails = postAboutToStartEvent(caseData, UserRole.JUDICIARY.getRoleName()).getData(); assertThat(caseDetails.get("judicialMessageMetaData")).extracting("sender", "recipient") diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToSubmitTest.java index ea993787bb4..777f0035a6c 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToSubmitTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerAboutToSubmitTest.java @@ -34,7 +34,6 @@ class MessageJudgeControllerAboutToSubmitTest extends AbstractCallbackTest { private static final JudicialMessageRoleType RECIPIENT_TYPE = JudicialMessageRoleType.OTHER; private static final String SENDER = "ben@fpla.com"; private static final String MESSAGE = "Some message"; - private static final String MESSAGE_REQUESTED_BY = "request review from some court"; private static final String MESSAGE_RECIPIENT = "recipient@fpla.com"; private static final UUID SELECTED_DYNAMIC_LIST_ITEM_ID = UUID.randomUUID(); @@ -100,9 +99,14 @@ void shouldAddNewJudicialMessageAndSortIntoExistingJudicialMessageList() { void shouldRemoveTransientFields() { CaseDetails caseDetails = CaseDetails.builder() .data(Map.ofEntries( + Map.entry("documentDynamicList", + buildDynamicList(0, Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "some data"))), + Map.entry("documentTypesDynamicList", + buildDynamicList(0, Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "some data"))), Map.entry("hasAdditionalApplications", "some data"), - Map.entry("isMessageRegardingAdditionalApplications", "some data"), - Map.entry("additionalApplicationsDynamicList", "some data"), + Map.entry("isMessageRegardingDocuments", "APPLICATION"), + Map.entry("judicialMessageDynamicList", + buildDynamicList(0, Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "some data"))), Map.entry("relatedDocumentsLabel", "some data"), Map.entry("nextHearingLabel", "some data"), Map.entry("judicialMessageMetaData", JudicialMessageMetaData.builder() @@ -111,8 +115,6 @@ void shouldRemoveTransientFields() { .urgency("some data") .build()), Map.entry("judicialMessageNote", "some data"), - Map.entry("judicialMessageDynamicList", - buildDynamicList(0, Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "some data"))), Map.entry("judicialMessageReply", JudicialMessage.builder().build()) )) .build(); @@ -120,28 +122,17 @@ void shouldRemoveTransientFields() { AboutToStartOrSubmitCallbackResponse response = postAboutToSubmitEvent(caseDetails); assertThat(response.getData()).doesNotContainKeys( + "documentDynamicList", + "documentTypesDynamicList", "hasAdditionalApplications", - "isMessageRegardingAdditionalApplications", + "isMessageRegardingDocuments", + "judicialMessageDynamicList", "additionalApplicationsDynamicList", "relatedDocumentsLabel", "nextHearingLabel", "judicialMessageMetaData", "judicialMessageNote", - "judicialMessageDynamicList", "judicialMessageReply" ); } - - private JudicialMessage buildJudicialMessage(String dateSent, String latestMessage) { - return JudicialMessage.builder() - .sender(SENDER) - .recipient(MESSAGE_RECIPIENT) - .updatedTime(now().minusDays(2)) - .status(OPEN) - .subject(MESSAGE_REQUESTED_BY) - .latestMessage(latestMessage) - .messageHistory(String.format("%s - %s", SENDER, MESSAGE)) - .dateSent(dateSent) - .build(); - } } diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerMidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateLabelsMidEventTest.java similarity index 63% rename from service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerMidEventTest.java rename to service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateLabelsMidEventTest.java index 31793eab191..37a537fbcba 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerMidEventTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateLabelsMidEventTest.java @@ -5,8 +5,13 @@ import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments; import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.CourtBundle; import uk.gov.hmcts.reform.fpl.model.HearingBooking; +import uk.gov.hmcts.reform.fpl.model.HearingCourtBundle; +import uk.gov.hmcts.reform.fpl.model.HearingDocuments; +import uk.gov.hmcts.reform.fpl.model.SkeletonArgument; import uk.gov.hmcts.reform.fpl.model.SupportingEvidenceBundle; import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; @@ -14,12 +19,13 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.OtherApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; import uk.gov.hmcts.reform.fpl.model.event.MessageJudgeEventData; -import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessageMetaData; import java.util.List; import java.util.UUID; +import static java.lang.String.format; import static java.util.UUID.randomUUID; import static org.assertj.core.api.Assertions.assertThat; import static uk.gov.hmcts.reform.fpl.enums.HearingType.CASE_MANAGEMENT; @@ -29,14 +35,17 @@ import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.wrapElements; import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.buildDynamicList; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; @WebMvcTest(MessageJudgeController.class) @OverrideAutoConfiguration(enabled = true) -class MessageJudgeControllerMidEventTest extends AbstractCallbackTest { +class MessageJudgeControllerPopulateLabelsMidEventTest extends AbstractCallbackTest { private static final UUID DYNAMIC_LIST_ITEM_ID = UUID.randomUUID(); + private static final DocumentReference DOCUMENT_REFERENCE_1 = testDocumentReference("Test Doc One"); + private static final DocumentReference DOCUMENT_REFERENCE_2 = testDocumentReference("Test Doc Two"); - MessageJudgeControllerMidEventTest() { - super("message-judge"); + MessageJudgeControllerPopulateLabelsMidEventTest() { + super("message-judge/populate-document-labels"); } @Test @@ -67,7 +76,7 @@ void shouldSetHearingLabelWhenNextHearingExists() { } @Test - void shouldPopulateRelatedDocumentsFieldsWhenSendingANewJudicialMessage() { + void shouldPopulateRelatedDocumentsFieldsWhenSendingANewJudicialMessageWithApplication() { DocumentReference mainDocument = DocumentReference.builder() .filename("c2.doc") .build(); @@ -99,9 +108,15 @@ void shouldPopulateRelatedDocumentsFieldsWhenSendingANewJudicialMessage() { .build() )); + DynamicList dynamicList = buildDynamicList(1, + Pair.of(notSelectedBundleId, "C1, 1 January 2021, 12:00pm"), + Pair.of(DYNAMIC_LIST_ITEM_ID, "C2, 1 January 2021, 12:00pm") + ); + CaseData caseData = CaseData.builder() .messageJudgeEventData(MessageJudgeEventData.builder() - .additionalApplicationsDynamicList(DYNAMIC_LIST_ITEM_ID) + .additionalApplicationsDynamicList(dynamicList) + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) .build()) .additionalApplicationsBundle(additionalApplicationsBundles) .build(); @@ -110,51 +125,53 @@ void shouldPopulateRelatedDocumentsFieldsWhenSendingANewJudicialMessage() { AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); - DynamicList builtDynamicList = mapper.convertValue( - response.getData().get("additionalApplicationsDynamicList"), DynamicList.class - ); - - DynamicList expectedDynamicList = buildDynamicList(1, - Pair.of(notSelectedBundleId, "C1, 1 January 2021, 12:00pm"), - Pair.of(DYNAMIC_LIST_ITEM_ID, "C2, 1 January 2021, 12:00pm") - ); - assertThat(response.getData().get("relatedDocumentsLabel")).isEqualTo(expectedDocumentLabel); - assertThat(builtDynamicList).isEqualTo(expectedDynamicList); } @Test - void shouldNotReturnAValidationErrorWhenEmailIsValid() { - CaseData caseData = CaseData.builder() - .messageJudgeEventData(MessageJudgeEventData - .builder() - .judicialMessageMetaData(JudicialMessageMetaData - .builder() - .recipient("valid-email@test.com") - .build()) - .build()) + void shouldPopulateRelatedDocumentsFieldsWhenSendingANewJudicialMessageWithDocument() { + UUID notSelectedBundleId = randomUUID(); + + final SkeletonArgument skeletonArgument = SkeletonArgument.builder() + .document(DOCUMENT_REFERENCE_1) .build(); - AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); + final HearingCourtBundle courtBundle = HearingCourtBundle.builder() + .courtBundle(List.of(element(notSelectedBundleId, CourtBundle.builder() + .document(DOCUMENT_REFERENCE_2) + .build()))) + .build(); - assertThat(response.getErrors()).isNull(); - } + DynamicListElement skeletonArgumentElement = DynamicListElement.builder() + .code(format("hearingDocuments.skeletonArgumentList###%s", DYNAMIC_LIST_ITEM_ID)) + .label(DOCUMENT_REFERENCE_1.getFilename()) + .build(); + + DynamicListElement courtBundleElement = DynamicListElement.builder() + .code(format("hearingDocuments.courtBundleListV2###%s", notSelectedBundleId)) + .label(DOCUMENT_REFERENCE_2.getFilename()) + .build(); + + DynamicList dynamicList = DynamicList.builder() + .listItems(List.of(skeletonArgumentElement, courtBundleElement)) + .value(skeletonArgumentElement) + .build(); - @Test - void shouldReturnAValidationErrorWhenEmailIsInvalid() { CaseData caseData = CaseData.builder() - .messageJudgeEventData(MessageJudgeEventData - .builder() - .judicialMessageMetaData(JudicialMessageMetaData - .builder() - .recipient("Test user ") - .build()) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.DOCUMENT) + .documentDynamicList(dynamicList) + .build()) + .hearingDocuments(HearingDocuments.builder() + .skeletonArgumentList(List.of(element(DYNAMIC_LIST_ITEM_ID, skeletonArgument))) + .courtBundleListV2(List.of(element(notSelectedBundleId, courtBundle))) .build()) .build(); + String expectedDocumentLabel = skeletonArgument.getDocument().getFilename(); + AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); - assertThat(response.getErrors()).contains( - "Enter an email address in the correct format, for example name@example.com"); + assertThat(response.getData().get("relatedDocumentsLabel")).isEqualTo(expectedDocumentLabel); } } diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateListsMidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateListsMidEventTest.java new file mode 100644 index 00000000000..2043f6f4c58 --- /dev/null +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeControllerPopulateListsMidEventTest.java @@ -0,0 +1,183 @@ +package uk.gov.hmcts.reform.fpl.controllers; + +import org.apache.commons.lang3.tuple.Pair; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.fpl.enums.CaseRole; +import uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.HearingDocuments; +import uk.gov.hmcts.reform.fpl.model.SkeletonArgument; +import uk.gov.hmcts.reform.fpl.model.SupportingEvidenceBundle; +import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; +import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; +import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; +import uk.gov.hmcts.reform.fpl.model.common.Element; +import uk.gov.hmcts.reform.fpl.model.common.OtherApplicationsBundle; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; +import uk.gov.hmcts.reform.fpl.model.event.MessageJudgeEventData; +import uk.gov.hmcts.reform.fpl.service.document.ManageDocumentService; + +import java.util.List; +import java.util.UUID; + +import static java.lang.String.format; +import static java.util.UUID.randomUUID; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.fpl.enums.OtherApplicationType.C1_APPOINTMENT_OF_A_GUARDIAN; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.buildDynamicList; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; + +@WebMvcTest(MessageJudgeController.class) +@OverrideAutoConfiguration(enabled = true) +class MessageJudgeControllerPopulateListsMidEventTest extends AbstractCallbackTest { + @MockBean + ManageDocumentService manageDocumentService; + private static final DocumentReference DOCUMENT_REFERENCE_1 = testDocumentReference("Test Doc One"); + private static final UUID DOCUMENT_1_ID = randomUUID(); + private static final DocumentReference DOCUMENT_REFERENCE_2 = testDocumentReference("Test Doc Two"); + private static final UUID DOCUMENT_2_ID = randomUUID(); + + MessageJudgeControllerPopulateListsMidEventTest() { + super("message-judge/populate-lists"); + } + + @Test + void shouldPopulateApplicationListWhenSelectingApplicationAttachmentType() { + SupportingEvidenceBundle supportingEvidenceBundle = SupportingEvidenceBundle.builder() + .name("Supporting evidence") + .document(DOCUMENT_REFERENCE_2) + .build(); + + List> additionalApplicationsBundles = List.of( + element(AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .id(DOCUMENT_1_ID) + .uploadedDateTime("1 January 2021, 12:00pm") + .document(DOCUMENT_REFERENCE_1) + .supportingEvidenceBundle(wrapElements(supportingEvidenceBundle)) + .build()) + .otherApplicationsBundle(OtherApplicationsBundle.builder() + .id(DOCUMENT_2_ID) + .uploadedDateTime("1 January 2021, 12:00pm") + .applicationType(C1_APPOINTMENT_OF_A_GUARDIAN) + .build()) + .build() + )); + + DynamicList expectedDynamicList = buildDynamicList( + Pair.of(DOCUMENT_2_ID, "C1, 1 January 2021, 12:00pm"), + Pair.of(DOCUMENT_1_ID, "C2, 1 January 2021, 12:00pm") + ); + + CaseData caseData = CaseData.builder() + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) + .build()) + .additionalApplicationsBundle(additionalApplicationsBundles) + .build(); + + AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); + + DynamicList builtDynamicList = mapper.convertValue( + response.getData().get("additionalApplicationsDynamicList"), DynamicList.class + ); + + assertThat(builtDynamicList).isEqualTo(expectedDynamicList); + } + + @Test + void shouldPopulateDocumentListWhenSelectingDocumentAttachmentType() { + final SkeletonArgument skeletonArgument1 = SkeletonArgument.builder() + .document(DOCUMENT_REFERENCE_1) + .build(); + + final SkeletonArgument skeletonArgument2 = SkeletonArgument.builder() + .document(DOCUMENT_REFERENCE_2) + .build(); + + DynamicListElement skeletonArgumentElement1 = DynamicListElement.builder() + .code(format("hearingDocuments.skeletonArgumentList###%s", DOCUMENT_1_ID)) + .label(DOCUMENT_REFERENCE_1.getFilename()) + .build(); + + DynamicListElement skeletonArgumentElement2 = DynamicListElement.builder() + .code(format("hearingDocuments.skeletonArgumentList###%s", DOCUMENT_2_ID)) + .label(DOCUMENT_REFERENCE_2.getFilename()) + .build(); + + DynamicListElement documentTypeElement = DynamicListElement.builder() + .code("SKELETON_ARGUMENTS") + .label("Skeleton arguments") + .build(); + + DynamicList expectedDynamicList = DynamicList.builder() + .listItems(List.of(skeletonArgumentElement1, skeletonArgumentElement2)) + .build(); + + CaseData caseData = CaseData.builder() + .id(12345L) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.DOCUMENT) + .documentTypesDynamicList(DynamicList.builder().value(documentTypeElement).build()) + .build()) + .hearingDocuments(HearingDocuments.builder() + .skeletonArgumentList(List.of( + element(DOCUMENT_1_ID, skeletonArgument1), element(DOCUMENT_2_ID, skeletonArgument2))) + .build()) + .build(); + + when(manageDocumentService.getUploaderCaseRoles(any())).thenReturn(List.of(CaseRole.LAMANAGING)); + when(manageDocumentService.buildAvailableDocumentsDynamicList(any(), any())).thenReturn(expectedDynamicList); + + AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); + + DynamicList builtDynamicList = mapper.convertValue( + response.getData().get("documentDynamicList"), DynamicList.class + ); + + assertThat(builtDynamicList).isEqualTo(expectedDynamicList); + } + + @Test + void shouldReturnErrorWhenNoDocumentsOnCaseOfSelectedType() { + final SkeletonArgument skeletonArgument1 = SkeletonArgument.builder() + .document(DOCUMENT_REFERENCE_1) + .build(); + + DynamicListElement documentTypeElement = DynamicListElement.builder() + .code("COURT_BUNDLE") + .label("Court Bundles") + .build(); + + CaseData caseData = CaseData.builder() + .id(12345L) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.DOCUMENT) + .documentTypesDynamicList(DynamicList.builder().value(documentTypeElement).build()) + .build()) + .hearingDocuments(HearingDocuments.builder() + .skeletonArgumentList(List.of( + element(DOCUMENT_1_ID, skeletonArgument1))) + .build()) + .build(); + + when(manageDocumentService.getUploaderCaseRoles(any())).thenReturn(List.of(CaseRole.LAMANAGING)); + when(manageDocumentService.buildAvailableDocumentsDynamicList(any(), any())) + .thenReturn(DynamicList.builder().listItems(List.of()).build()); + + AboutToStartOrSubmitCallbackResponse response = postMidEvent(asCaseDetails(caseData)); + + List expectedErrors = List.of("No documents available of type: Court Bundles"); + + assertThat(response.getErrors()).isEqualTo(expectedErrors); + } +} diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ReplyToMessageJudgeControllerAboutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ReplyToMessageJudgeControllerAboutToSubmitTest.java index 31e41c25e82..c36a3281242 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ReplyToMessageJudgeControllerAboutToSubmitTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ReplyToMessageJudgeControllerAboutToSubmitTest.java @@ -140,8 +140,9 @@ void shouldRemoveTransientFields() { CaseDetails caseDetails = CaseDetails.builder() .data(Map.ofEntries( Map.entry("hasAdditionalApplications", "some data"), - Map.entry("isMessageRegardingAdditionalApplications", "some data"), - Map.entry("additionalApplicationsDynamicList", "some data"), + Map.entry("isMessageRegardingDocuments", "APPLICATION"), + Map.entry("additionalApplicationsDynamicList", + buildDynamicList(0, Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "some data"))), Map.entry("relatedDocumentsLabel", "some data"), Map.entry("replyToMessageJudgeNextHearingLabel", "some data"), Map.entry("judicialMessageMetaData", JudicialMessageMetaData.builder() @@ -161,7 +162,7 @@ void shouldRemoveTransientFields() { assertThat(response.getData()).doesNotContainKeys( "hasAdditionalApplications", - "isMessageRegardingAdditionalApplications", + "isMessageRegardingDocuments", "additionalApplicationsDynamicList", "relatedDocumentsLabel", "nextHearingLabel", diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2MidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2MidEventTest.java index 05da775a681..d86c23f79d6 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2MidEventTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2MidEventTest.java @@ -75,9 +75,9 @@ void shouldPopulateAllowSelectDocumentTypeToRemoveDocument(boolean allow) { .build(); when(manageDocumentService.allowSelectDocumentTypeToRemoveDocument(any())).thenReturn(allow); - when(manageDocumentService.buildDocumentTypeDynamicListForRemoval(any())) + when(manageDocumentService.buildExistingDocumentTypeDynamicList(any())) .thenReturn(DynamicList.builder().listItems(List.of()).build()); - when(manageDocumentService.buildAvailableDocumentsToBeRemoved(any())) + when(manageDocumentService.buildAvailableDocumentsDynamicList(any())) .thenReturn(DynamicList.builder().listItems(List.of()).build()); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, @@ -202,7 +202,7 @@ void shouldReturnNoDocumentErrorMessageWhenThereIsNoAvailableDocumentToBeRemoved .build(); when(manageDocumentService.allowSelectDocumentTypeToRemoveDocument(any())).thenReturn(true); - when(manageDocumentService.buildDocumentTypeDynamicListForRemoval(any())).thenReturn(DynamicList.builder() + when(manageDocumentService.buildExistingDocumentTypeDynamicList(any())).thenReturn(DynamicList.builder() .listItems(List.of()) .build()); @@ -212,7 +212,7 @@ void shouldReturnNoDocumentErrorMessageWhenThereIsNoAvailableDocumentToBeRemoved assertThat(callbackResponse.getErrors()).contains("There is no document to be removed."); when(manageDocumentService.allowSelectDocumentTypeToRemoveDocument(any())).thenReturn(false); - when(manageDocumentService.buildAvailableDocumentsToBeRemoved(any())).thenReturn(DynamicList.builder() + when(manageDocumentService.buildAvailableDocumentsDynamicList(any())).thenReturn(DynamicList.builder() .listItems(List.of()) .build()); @@ -475,7 +475,7 @@ void shouldPopulateDocumentsToBeRemovedAfterSelectingDocumentType() { .build(); DynamicList expectedDynamicList = DynamicList.builder().listItems(List.of()).build(); - when(manageDocumentService.buildAvailableDocumentsToBeRemoved(any(), eq(DocumentType.CASE_SUMMARY))) + when(manageDocumentService.buildAvailableDocumentsDynamicList(any(), eq(DocumentType.CASE_SUMMARY))) .thenReturn(expectedDynamicList); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, @@ -501,7 +501,7 @@ void shouldPopulateDocumentsToBeRemovedAfterSelectingLegacyDocument(DocumentType .build(); DynamicList expectedDynamicList = DynamicList.builder().listItems(List.of()).build(); - when(manageDocumentService.buildAvailableDocumentsToBeRemoved(any(), eq(documentType))) + when(manageDocumentService.buildAvailableDocumentsDynamicList(any(), eq(documentType))) .thenReturn(expectedDynamicList); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeController.java index 654907107f0..4def9feaafc 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/MessageJudgeController.java @@ -43,7 +43,19 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToStart(@RequestBody Call return respond(caseDetailsMap); } - @PostMapping("/mid-event") + @PostMapping("/populate-lists/mid-event") + public AboutToStartOrSubmitCallbackResponse handleDocumentListEvent(@RequestBody CallbackRequest callbackRequest) { + CaseDetails caseDetails = callbackRequest.getCaseDetails(); + CaseData caseData = getCaseData(caseDetails); + CaseDetailsMap caseDetailsMap = caseDetailsMap(caseDetails); + + caseDetailsMap.putAll(messageJudgeService.populateDynamicLists(caseData)); + List errors = messageJudgeService.validateDynamicLists(caseData); + + return respond(caseDetailsMap, errors); + } + + @PostMapping("/populate-document-labels/mid-event") public AboutToStartOrSubmitCallbackResponse handleMidEvent(@RequestBody CallbackRequest callbackRequest) { CaseDetails caseDetails = callbackRequest.getCaseDetails(); CaseData caseData = getCaseData(caseDetails); @@ -51,11 +63,6 @@ public AboutToStartOrSubmitCallbackResponse handleMidEvent(@RequestBody Callback caseDetailsMap.putAll(messageJudgeService.populateNewMessageFields(caseData)); - Optional emailError = messageJudgeService.validateRecipientEmail(caseData); - if (!emailError.isEmpty()) { - return respond(caseDetailsMap, List.of(emailError.get())); - } - return respond(caseDetailsMap); } @@ -66,13 +73,18 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody Cal CaseDetailsMap caseDetailsMap = caseDetailsMap(caseDetails); List> updatedMessages; + Optional emailError = messageJudgeService.validateRecipientEmail(caseData); + if (!emailError.isEmpty()) { + removeTemporaryFields(caseDetailsMap, transientFields()); + return respond(caseDetailsMap, List.of(emailError.get())); + } + updatedMessages = messageJudgeService.addNewJudicialMessage(caseData); caseDetailsMap.put("judicialMessages", messageJudgeService.sortJudicialMessages(updatedMessages)); caseDetailsMap.put("latestRoleSent", caseData.getMessageJudgeEventData().getJudicialMessageMetaData() .getRecipientType()); removeTemporaryFields(caseDetailsMap, transientFields()); - return respond(caseDetailsMap); } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2.java index a5e12d3c907..ce77d9b8f45 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/documents/ManageDocumentsControllerV2.java @@ -67,7 +67,7 @@ public AboutToStartOrSubmitCallbackResponse handleManageDocumentTypeSelected( } DynamicList availableDocumentsToBeRemoved = manageDocumentService - .buildAvailableDocumentsToBeRemoved(caseData, documentTypeSelected); + .buildAvailableDocumentsDynamicList(caseData, documentTypeSelected); caseDetails.getData().put("documentsToBeRemoved", availableDocumentsToBeRemoved); } @@ -89,7 +89,7 @@ public AboutToStartOrSubmitCallbackResponse handleManageDocumentActionSelected( if (allowSelectDocumentTypeToRemoveDocument) { // for HMCTS admin DynamicList availableDocumentTypesForRemoval = manageDocumentService - .buildDocumentTypeDynamicListForRemoval(caseData); + .buildExistingDocumentTypeDynamicList(caseData); if (!availableDocumentTypesForRemoval.getListItems().isEmpty()) { caseDetails.getData().put("availableDocumentTypesForRemoval", availableDocumentTypesForRemoval); } else { @@ -98,7 +98,7 @@ public AboutToStartOrSubmitCallbackResponse handleManageDocumentActionSelected( } else { // for LA or external solicitor DynamicList availableDocumentsToBeRemoved = manageDocumentService - .buildAvailableDocumentsToBeRemoved(caseData); + .buildAvailableDocumentsDynamicList(caseData); if (!availableDocumentsToBeRemoved.getListItems().isEmpty()) { caseDetails.getData().put("documentsToBeRemoved", availableDocumentsToBeRemoved); } else { diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/MessageRegardingDocuments.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/MessageRegardingDocuments.java new file mode 100644 index 00000000000..de570501735 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/MessageRegardingDocuments.java @@ -0,0 +1,5 @@ +package uk.gov.hmcts.reform.fpl.enums; + +public enum MessageRegardingDocuments { + APPLICATION, DOCUMENT, NONE +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/MessageJudgeEventData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/MessageJudgeEventData.java index 3bf4e694cd4..b7092037184 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/MessageJudgeEventData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/MessageJudgeEventData.java @@ -3,7 +3,9 @@ import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Builder; import lombok.Value; +import uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments; import uk.gov.hmcts.reform.fpl.enums.YesNo; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessage; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessageMetaData; @@ -11,18 +13,21 @@ @Builder @JsonInclude(JsonInclude.Include.NON_EMPTY) public class MessageJudgeEventData { - Object additionalApplicationsDynamicList; + DynamicList additionalApplicationsDynamicList; Object judicialMessageDynamicList; String judicialMessageNote; JudicialMessageMetaData judicialMessageMetaData; String relatedDocumentsLabel; JudicialMessage judicialMessageReply; YesNo isJudiciary; + DynamicList documentTypesDynamicList; + DynamicList documentDynamicList; + MessageRegardingDocuments isMessageRegardingDocuments; public static String[] transientFields() { return new String[]{ - "hasAdditionalApplications", "isMessageRegardingAdditionalApplications", - "additionalApplicationsDynamicList", "relatedDocumentsLabel", + "hasAdditionalApplications", "isMessageRegardingDocuments", "additionalApplicationsDynamicList", + "documentTypesDynamicList", "documentDynamicList", "relatedDocumentsLabel","attachDocumentLabel", "nextHearingLabel", "judicialMessageMetaData", "judicialMessageNote", "judicialMessageDynamicList", "judicialMessageReply", "replyToMessageJudgeNextHearingLabel", "isJudiciary" }; diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/MessageJudgeService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/MessageJudgeService.java index 7309d114ae6..46d3723dda2 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/MessageJudgeService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/MessageJudgeService.java @@ -6,6 +6,7 @@ import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessage; +import uk.gov.hmcts.reform.fpl.service.document.ManageDocumentService; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.util.Comparator; @@ -26,6 +27,9 @@ public abstract class MessageJudgeService { @Autowired protected UserService userService; + @Autowired + protected ManageDocumentService manageDocumentService; + protected boolean isJudiciary() { return userService.hasUserRole(JUDICIARY); } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeService.java index 1503a7a9292..d00cfba2a93 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeService.java @@ -5,6 +5,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.fpl.enums.JudicialMessageRoleType; +import uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments; +import uk.gov.hmcts.reform.fpl.enums.cfv.DocumentType; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Placement; import uk.gov.hmcts.reform.fpl.model.PlacementConfidentialDocument; @@ -15,14 +17,17 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.OtherApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; import uk.gov.hmcts.reform.fpl.model.event.MessageJudgeEventData; import uk.gov.hmcts.reform.fpl.model.event.PlacementEventData; import uk.gov.hmcts.reform.fpl.model.interfaces.SelectableItem; +import uk.gov.hmcts.reform.fpl.model.interfaces.WithDocument; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessage; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessageMetaData; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,6 +36,7 @@ import java.util.UUID; import java.util.function.Function; +import static java.lang.String.format; import static java.lang.String.join; import static java.util.Comparator.comparing; import static java.util.Objects.nonNull; @@ -39,6 +45,8 @@ import static java.util.stream.Collectors.toList; import static org.apache.commons.lang3.StringUtils.EMPTY; import static uk.gov.hmcts.reform.fpl.enums.JudicialMessageStatus.OPEN; +import static uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments.APPLICATION; +import static uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments.DOCUMENT; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE_TIME; @@ -57,10 +65,8 @@ public class SendNewMessageJudgeService extends MessageJudgeService { @Autowired private ValidateEmailService validateEmailService; - @Autowired private IdentityService identityService; - @Autowired private ObjectMapper mapper; @@ -69,9 +75,23 @@ public Map initialiseCaseFields(CaseData caseData) { if (hasAdditionalApplications(caseData) || hasC2s(caseData)) { data.put("hasAdditionalApplications", YES.getValue()); - data.put("additionalApplicationsDynamicList", getApplicationsLists(caseData, null)); } + data.putAll(prePopulateSenderAndRecipient()); + data.put("documentTypesDynamicList", manageDocumentService.buildExistingDocumentTypeDynamicList(caseData)); + + return data; + } + + public Map populateDynamicLists(CaseData caseData) { + Map data = new HashMap<>(); + MessageRegardingDocuments type = getMessageAttachmentType(caseData); + + if (type == DOCUMENT) { + data.put("documentDynamicList", getDocumentList(caseData)); + } else if (type == APPLICATION) { + data.put("additionalApplicationsDynamicList", getApplicationsLists(caseData)); + } return data; } @@ -88,8 +108,13 @@ public Map populateNewMessageFields(CaseData caseData) { final SelectableItem selectedApplication = getElement(selectedApplicationId, applications).getValue(); data.put("relatedDocumentsLabel", getRelatedDocumentNames(selectedApplication)); - data.put("additionalApplicationsDynamicList", getApplicationsLists(caseData, selectedApplicationId)); + } else if (hasSelectedDocument(caseData)) { + final String selectedDocumentLabel = + caseData.getMessageJudgeEventData().getDocumentDynamicList().getValueLabel(); + + data.put("relatedDocumentsLabel", selectedDocumentLabel); } + data.put("nextHearingLabel", getNextHearingLabel(caseData)); return data; @@ -104,6 +129,21 @@ public Optional validateRecipientEmail(CaseData caseData) { return Optional.empty(); } + public List validateDynamicLists(CaseData caseData) { + MessageJudgeEventData messageJudgeEventData = caseData.getMessageJudgeEventData(); + + if (messageJudgeEventData.getIsMessageRegardingDocuments().equals(DOCUMENT) + && getDocumentList(caseData).getListItems().isEmpty()) { + return List.of(format("No documents available of type: %s", + messageJudgeEventData.getDocumentTypesDynamicList().getValue().getLabel())); + } else if (messageJudgeEventData.getIsMessageRegardingDocuments().equals(APPLICATION) + && getApplicationsLists(caseData).getListItems().isEmpty()) { + return List.of("No applications available"); + } + + return Collections.emptyList(); + } + public List> addNewJudicialMessage(CaseData caseData) { List> judicialMessages = caseData.getJudicialMessages(); MessageJudgeEventData messageJudgeEventData = caseData.getMessageJudgeEventData(); @@ -151,6 +191,12 @@ public List> addNewJudicialMessage(CaseData caseData) { } judicialMessageBuilder.applicationType(selectedApplicationBundle.toLabel()); + } else if (hasSelectedDocument(caseData)) { + Optional relatedDocument = getSelectedDocumentReference(caseData); + if (relatedDocument.isPresent()) { + judicialMessageBuilder.relatedDocuments(wrapElements(relatedDocument.get())); + judicialMessageBuilder.relatedDocumentFileNames(relatedDocument.get().getFilename()); + } } judicialMessages.add(element(identityService.generateId(), judicialMessageBuilder.build())); @@ -199,8 +245,21 @@ private boolean hasPlacementApplications(CaseData caseData) { } private boolean hasSelectedAdditionalApplication(CaseData caseData) { + MessageJudgeEventData messageJudgeEventData = caseData.getMessageJudgeEventData(); + return (hasAdditionalApplications(caseData) || hasC2s(caseData) || hasPlacementApplications(caseData)) - && caseData.getMessageJudgeEventData().getAdditionalApplicationsDynamicList() != null; + && messageJudgeEventData.getAdditionalApplicationsDynamicList() != null + && messageJudgeEventData.getIsMessageRegardingDocuments().equals(APPLICATION); + } + + private boolean hasSelectedDocument(CaseData caseData) { + MessageJudgeEventData messageJudgeEventData = caseData.getMessageJudgeEventData(); + return messageJudgeEventData.getDocumentDynamicList() != null + && messageJudgeEventData.getIsMessageRegardingDocuments().equals(DOCUMENT); + } + + private MessageRegardingDocuments getMessageAttachmentType(CaseData caseData) { + return caseData.getMessageJudgeEventData().getIsMessageRegardingDocuments(); } private Map prePopulateSenderAndRecipient() { @@ -227,7 +286,7 @@ private SelectableItem getApplication(CaseData caseData, UUID applicationId) { return getElement(applicationId, getApplications(caseData)).getValue(); } - private DynamicList getApplicationsLists(CaseData caseData, UUID selected) { + private DynamicList getApplicationsLists(CaseData caseData) { final List> applications = getApplications(caseData); @@ -238,7 +297,26 @@ private DynamicList getApplicationsLists(CaseData caseData, UUID selected) { applications.sort(comparing(sortOrderExtractor).thenComparing(comparing(timeExtractor).reversed())); - return asDynamicList(applications, selected, SelectableItem::toLabel); + return asDynamicList(applications, SelectableItem::toLabel); + } + + public DynamicList getDocumentList(CaseData caseData) { + DocumentType documentTypeSelected = DocumentType.valueOf(caseData.getMessageJudgeEventData() + .getDocumentTypesDynamicList().getValue().getCode()); + + return manageDocumentService + .buildAvailableDocumentsDynamicList(caseData, documentTypeSelected); + } + + private Optional getSelectedDocumentReference(CaseData caseData) { + DynamicListElement selected = caseData.getMessageJudgeEventData().getDocumentDynamicList().getValue(); + + List> targetElements = manageDocumentService.getSelectedDocuments( + caseData, selected, Optional.empty()); + + return targetElements.stream().findFirst() + .map(Element::getValue) + .map(WithDocument::getDocument); } private List getRelatedDocuments(Placement placement) { diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/document/ManageDocumentService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/document/ManageDocumentService.java index a7314cc5d57..fefa497dc12 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/document/ManageDocumentService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/document/ManageDocumentService.java @@ -93,7 +93,7 @@ public class ManageDocumentService { public static final String DOCUMENT_ACKNOWLEDGEMENT_KEY = "ACK_RELATED_TO_CASE"; - private static final String DOCUMENT_TO_BE_REMOVED_SEPARATOR = "###"; + public static final String DOCUMENT_TO_BE_REMOVED_SEPARATOR = "###"; private final CaseConverter caseConverter; @@ -480,15 +480,24 @@ public Map removeDocuments(CaseData caseData) { removalReason = eventData.getManageDocumentRemoveDocReason().getDescription(); } + final Map output = new HashMap<>(); DynamicListElement selected = eventData.getDocumentsToBeRemoved().getValue(); + List> targetElements = getSelectedDocuments( + caseData, selected, Optional.of(output)); + targetElements.forEach(t -> t.getValue().setRemovalReason(removalReason)); + + return output; + } + public List> getSelectedDocuments(CaseData caseData, DynamicListElement selected, + Optional> fieldsToUpdate) { String[] split = selected.getCode().split(DOCUMENT_TO_BE_REMOVED_SEPARATOR); String fieldName = split[0]; DocumentType documentType = DocumentType.fromFieldName(fieldName); UUID documentElementId = UUID.fromString(split[1]); List> targetElements = new ArrayList<>(); - final Map output = new HashMap<>(); + final Map output = fieldsToUpdate.orElse(new HashMap<>()); if (documentType == PLACEMENT_RESPONSES) { targetElements.add(handlePlacementResponseRemoval(caseData, documentElementId, output)); } else { @@ -499,8 +508,8 @@ public Map removeDocuments(CaseData caseData) { documentElementId, output)); } } - targetElements.forEach(t -> t.getValue().setRemovalReason(removalReason)); - return output; + + return targetElements; } @SuppressWarnings("unchecked") @@ -619,6 +628,7 @@ private boolean isHiddenFromUpload(DocumentType documentType, DocumentUploaderTy } } + // Also used in SendNewJudgeMessageService for document attachment type dropdown public DynamicList buildDocumentTypeDynamicList(CaseData caseData) { boolean hasPlacementNotices = caseData.getPlacementEventData().getPlacements().stream() .anyMatch(el -> el.getValue().getPlacementNotice() != null); @@ -798,12 +808,12 @@ private List> toListOfPair(CaseData caseData, return ret; } - public DynamicList buildAvailableDocumentsToBeRemoved(CaseData caseData) { - return buildAvailableDocumentsToBeRemoved(caseData, null); + public DynamicList buildAvailableDocumentsDynamicList(CaseData caseData) { + return buildAvailableDocumentsDynamicList(caseData, null); } // Return all documents when documentType is null - public DynamicList buildAvailableDocumentsToBeRemoved(CaseData caseData, DocumentType documentType) { + public DynamicList buildAvailableDocumentsDynamicList(CaseData caseData, DocumentType documentType) { DocumentUploaderType currentUserType = getUploaderType(caseData); Map>> fieldNameToListOfElementMap = new LinkedHashMap<>(); @@ -847,7 +857,7 @@ private List> getC2Applications(CaseData c } // For HMCTS admin's journey - public DynamicList buildDocumentTypeDynamicListForRemoval(CaseData caseData) { + public DynamicList buildExistingDocumentTypeDynamicList(CaseData caseData) { Map map = caseConverter.toMap(caseData); Set availableDocumentTypes = Arrays.stream(DocumentType.values()) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/ManageDocumentServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/ManageDocumentServiceTest.java index 0a7c59e6de6..de731007881 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/ManageDocumentServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/ManageDocumentServiceTest.java @@ -1455,7 +1455,7 @@ void shouldShowAnEmptyDynamicList() { when(caseConverter.toMap(any())).thenReturn(Map.of()); when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder().build()); + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder().build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } @@ -1483,7 +1483,7 @@ void shouldShowASingleDocumentType() { Pair.of(COURT_BUNDLE.name(), COURT_BUNDLE.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder().build()); + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder().build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } @@ -1515,7 +1515,7 @@ void shouldShowMultipleDocumentTypes() { Pair.of(TRANSCRIPTS.name(), TRANSCRIPTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder().build()); + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder().build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } @@ -1548,7 +1548,7 @@ void shouldShowPlacementResponseInDocumentTypes() { Pair.of(PLACEMENT_RESPONSES.name(), PLACEMENT_RESPONSES.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .placementEventData(PlacementEventData.builder() .placements(List.of(element(Placement.builder() .noticeDocuments(List.of(element(PlacementNoticeDocument.builder().build()))) @@ -1569,7 +1569,7 @@ void shouldShowC1SupportingDocumentsInDocumentTypes() { Pair.of(C1_APPLICATION_DOCUMENTS.name(), C1_APPLICATION_DOCUMENTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .additionalApplicationsBundle(List.of(element(AdditionalApplicationsBundle.builder() .otherApplicationsBundle(OtherApplicationsBundle.builder() .supportingEvidenceBundle(List.of(element(SupportingEvidenceBundle.builder() @@ -1594,7 +1594,7 @@ void shouldShowC1SupportingDocumentsInDocumentTypesForSubmittedC1WithSupplementB Pair.of(C1_APPLICATION_DOCUMENTS.name(), C1_APPLICATION_DOCUMENTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .submittedC1WithSupplement(SubmittedC1WithSupplementBundle.builder() .supportingEvidenceBundle(List.of(element(SupportingEvidenceBundle.builder() .document(testDocumentReference()) @@ -1617,7 +1617,7 @@ void shouldShowC2SupportingDocumentsInDocumentTypes() { Pair.of(C2_APPLICATION_DOCUMENTS.name(), C2_APPLICATION_DOCUMENTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .additionalApplicationsBundle(List.of(element(AdditionalApplicationsBundle.builder() .c2DocumentBundle(C2DocumentBundle.builder() .supportingEvidenceBundle(List.of(element(SupportingEvidenceBundle.builder() @@ -1642,7 +1642,7 @@ void shouldShowConfidentialC2SupportingDocumentsInDocumentTypes() { Pair.of(C2_APPLICATION_DOCUMENTS.name(), C2_APPLICATION_DOCUMENTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .additionalApplicationsBundle(List.of(element(AdditionalApplicationsBundle.builder() .c2DocumentBundleConfidential(C2DocumentBundle.builder() .supportingEvidenceBundle(List.of(element(SupportingEvidenceBundle.builder() @@ -1672,7 +1672,7 @@ void shouldShowConfidentialC2SupportingDocumentsUploadedByOthersInDocumentTypes( Pair.of(C2_APPLICATION_DOCUMENTS.name(), C2_APPLICATION_DOCUMENTS.getDescription()) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildDocumentTypeDynamicListForRemoval(CaseData.builder() + DynamicList dynamicList = underTest.buildExistingDocumentTypeDynamicList(CaseData.builder() .additionalApplicationsBundle(List.of(element( toConfidentialAdditionalApplicationsBundleBuilder(modifier, C2DocumentBundle.builder() @@ -1742,7 +1742,7 @@ void testForNonConfidentialCourtBundleUploadedByThemselves(int loginType) { Pair.of(format("hearingDocuments.courtBundleListV2###%s", elementId2), filename2) ))).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } @@ -1775,7 +1775,7 @@ void testForNonConfidentialCourtBundleUploadedByHMCTS(int loginType) { ))).thenReturn(expectedDynamicList1); when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList2); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); if (uploaderType == DocumentUploaderType.HMCTS) { assertThat(dynamicList).isEqualTo(expectedDynamicList1); } else { @@ -1812,7 +1812,7 @@ void testForNonConfidentialCourtBundleUploadedByLA(int loginType) { ))).thenReturn(expectedDynamicList1); when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList2); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); if (uploaderType == DocumentUploaderType.HMCTS || uploaderType == DocumentUploaderType.DESIGNATED_LOCAL_AUTHORITY || uploaderType == DocumentUploaderType.SECONDARY_LOCAL_AUTHORITY) { @@ -1850,7 +1850,7 @@ void testForNonConfidentialCourtBundleUploadedBySolicitor(int loginType) { ))).thenReturn(expectedDynamicList1); when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList2); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); if (loginType == LA_LOGIN_TYPE || loginType == 2) { // LAs should get an empty dynamic list assertThat(dynamicList).isEqualTo(expectedDynamicList2); } else { @@ -1892,7 +1892,7 @@ void shouldReturnEmptyDynamicListWhenNonConfidentialCourtBundleAreUploadedByOthe when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } @@ -1944,7 +1944,7 @@ void testForConfidentialCTSCUploadedAndNonConfidentialCourtBundleExist( ))).thenReturn(expectedDynamicList2); when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList3); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); if (uploaderType == DocumentUploaderType.HMCTS) { assertThat(dynamicList).isEqualTo(expectedDynamicList2); } else if (uploaderType == DocumentUploaderType.DESIGNATED_LOCAL_AUTHORITY @@ -1984,7 +1984,7 @@ void laShouldGetEmptyDynamicListWhenConfidentialC2ApplicationSupportingDocumentU when(dynamicListService.asDynamicList(List.of())).thenReturn(expectedDynamicList1); - DynamicList dynamicList = underTest.buildAvailableDocumentsToBeRemoved(builder.build()); + DynamicList dynamicList = underTest.buildAvailableDocumentsDynamicList(builder.build()); assertThat(dynamicList).isEqualTo(expectedDynamicList1); } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeServiceTest.java index 3f8ccb44f66..556a69265cf 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/SendNewMessageJudgeServiceTest.java @@ -18,15 +18,20 @@ import uk.gov.hmcts.reform.fpl.enums.HearingType; import uk.gov.hmcts.reform.fpl.enums.JudicialMessageRoleType; import uk.gov.hmcts.reform.fpl.enums.JudicialMessageStatus; +import uk.gov.hmcts.reform.fpl.enums.MessageRegardingDocuments; import uk.gov.hmcts.reform.fpl.enums.OtherApplicationType; import uk.gov.hmcts.reform.fpl.enums.UserRole; import uk.gov.hmcts.reform.fpl.enums.YesNo; import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.CourtBundle; import uk.gov.hmcts.reform.fpl.model.HearingBooking; +import uk.gov.hmcts.reform.fpl.model.HearingCourtBundle; +import uk.gov.hmcts.reform.fpl.model.HearingDocuments; import uk.gov.hmcts.reform.fpl.model.Placement; import uk.gov.hmcts.reform.fpl.model.PlacementConfidentialDocument; import uk.gov.hmcts.reform.fpl.model.PlacementNoticeDocument; import uk.gov.hmcts.reform.fpl.model.PlacementSupportingDocument; +import uk.gov.hmcts.reform.fpl.model.SkeletonArgument; import uk.gov.hmcts.reform.fpl.model.SupportingEvidenceBundle; import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; @@ -39,6 +44,7 @@ import uk.gov.hmcts.reform.fpl.model.event.PlacementEventData; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessage; import uk.gov.hmcts.reform.fpl.model.judicialmessage.JudicialMessageMetaData; +import uk.gov.hmcts.reform.fpl.service.document.ManageDocumentService; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.time.LocalDateTime; @@ -48,10 +54,12 @@ import java.util.UUID; import java.util.stream.Stream; +import static java.lang.String.format; import static java.util.Map.entry; import static java.util.UUID.randomUUID; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.HearingType.CASE_MANAGEMENT; import static uk.gov.hmcts.reform.fpl.enums.JudicialMessageStatus.OPEN; @@ -75,10 +83,12 @@ class SendNewMessageJudgeServiceTest { private static final String MESSAGE_RECIPIENT = "recipient@fpla.com"; private static final String C2_FILE_NAME = "c2.doc"; private static final String C2_SUPPORTING_DOCUMENT_FILE_NAME = "c2_supporting.doc"; - private static final String OTHER_FILE_NAME = "other.doc"; - private static final String OTHER_SUPPORTING_DOCUMENT_FILE_NAME = "other_supporting.doc"; private static final UUID SELECTED_DYNAMIC_LIST_ITEM_ID = randomUUID(); private static final UUID NEW_ELEMENT_ID = randomUUID(); + private static final DocumentReference DOCUMENT_REFERENCE_1 = testDocumentReference("Test Doc One"); + private static final UUID DOCUMENT_1_ID = randomUUID(); + private static final DocumentReference DOCUMENT_REFERENCE_2 = testDocumentReference("Test Doc Two"); + private static final UUID DOCUMENT_2_ID = randomUUID(); @Mock private Time time; @@ -87,6 +97,8 @@ class SendNewMessageJudgeServiceTest { @Mock private UserService userService; @Mock + private ManageDocumentService manageDocumentService; + @Mock private CtscEmailLookupConfiguration ctscEmailLookupConfiguration; @Spy private ObjectMapper mapper = new ObjectMapper(); @@ -97,30 +109,16 @@ class SendNewMessageJudgeServiceTest { void init() { when(ctscEmailLookupConfiguration.getEmail()).thenReturn(COURT_EMAIL); when(time.now()).thenReturn(LocalDateTime.now()); + when(manageDocumentService.buildExistingDocumentTypeDynamicList(any())) + .thenReturn(buildBasicDocumentTypeDynamicList()); + when(manageDocumentService.buildAvailableDocumentsDynamicList(any())) + .thenReturn(buildBasicDocumentDynamicList()); + when(manageDocumentService.getSelectedDocuments(any(), any(), any())) + .thenReturn(List.of(element(SkeletonArgument.builder().document(DOCUMENT_REFERENCE_1).build()))); } @Test - void shouldInitialiseCaseFieldsWhenAdditionalApplicationDocumentsAndJudicialMessagesExist() { - - final String longUrgency = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sollicitudin eu felis " - + "tincidunt volutpat. Donec tempus quis metus congue placerat. Sed ligula nisl, tempor at eleifend ac, " - + "consequat condimentum sem. In sed porttitor turpis, at laoreet quam. Fusce bibendum vehicula ipsum, et " - + "tempus ante fermentum non."; - - final List> judicialMessages = List.of( - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .urgency(longUrgency) - .dateSent("01 Dec 2020") - .build()), - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .dateSent("02 Dec 2020") - .urgency("High") - .build())); - + void shouldPopulateDynamicListWhenAttachingAdditionalApplication() { final C2DocumentBundle c2DocumentBundle = C2DocumentBundle.builder() .id(randomUUID()) .uploadedDateTime("1 December 2020, 12:00pm") @@ -147,145 +145,114 @@ void shouldInitialiseCaseFieldsWhenAdditionalApplicationDocumentsAndJudicialMess .build()); final CaseData caseData = CaseData.builder() - .judicialMessages(judicialMessages) .additionalApplicationsBundle(additionalApplicationsBundle) .placementEventData(PlacementEventData.builder() .placements(List.of(placement)) .build()) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) + .build()) .build(); - final Map expectedEventData = sendNewMessageJudgeService.initialiseCaseFields(caseData); + final Map expectedEventData = sendNewMessageJudgeService.populateDynamicLists(caseData); final DynamicList expectedAdditionalApplicationsDynamicList = buildDynamicList( Pair.of(confC2DocumentBundle.getId(), "C2, 2 December 2020, 12:00pm"), Pair.of(c2DocumentBundle.getId(), "C2, 1 December 2020, 12:00pm"), Pair.of(placement.getId(), "A50, Alex Green, 12 October 2020, 1:00pm")); - final String expectedUrgencyText = "Lorem ipsum dolor sit amet, consectetur adipiscing " - + "elit. Sed sollicitudin eu felis tincidunt volutpat. Donec tempus quis metus congue placerat. Sed ligula " - + "nisl, tempor at eleifend ac, consequat condimentum sem. In sed porttitor turpis..."; - final Map expectedData = Map.of( - "hasAdditionalApplications", "Yes", - "additionalApplicationsDynamicList", expectedAdditionalApplicationsDynamicList, - "judicialMessageMetaData", JudicialMessageMetaData.builder() - .sender(EMPTY) - .recipient(EMPTY).build(), - "isJudiciary", YesNo.NO); + "additionalApplicationsDynamicList", expectedAdditionalApplicationsDynamicList); assertThat(expectedEventData).isEqualTo(expectedData); } @Test - void shouldInitialiseAdditionalApplicationDocumentFieldsOnlyWhenJudicialMessagesDoNotExist() { - UUID applicationId = randomUUID(); - - List> additionalApplicationsBundle = List.of(element( - AdditionalApplicationsBundle.builder() - .c2DocumentBundle(C2DocumentBundle.builder() - .id(applicationId) - .uploadedDateTime("01 Dec 2020") - .author("Some author") - .build()) - .build()) - ); - - CaseData caseData = CaseData.builder() - .additionalApplicationsBundle(additionalApplicationsBundle) + void shouldPopulateRelatedDocumentsLabelWithAdditionalApplicationSelected() { + final C2DocumentBundle c2DocumentBundle = C2DocumentBundle.builder() + .id(randomUUID()) + .uploadedDateTime("1 December 2020, 12:00pm") + .author("Some author") .build(); - Map data = sendNewMessageJudgeService.initialiseCaseFields(caseData); - - DynamicList expectedAdditionalApplicationsDynamicList = buildDynamicList( - Pair.of(applicationId, "C2, 01 Dec 2020") + List> supportingEvidenceBundle = List.of( + element(SupportingEvidenceBundle.builder().document(DOCUMENT_REFERENCE_1).build()), + element(SupportingEvidenceBundle.builder().document(DOCUMENT_REFERENCE_2).build()) ); - Map expectedData = Map.of( - "hasAdditionalApplications", "Yes", - "additionalApplicationsDynamicList", expectedAdditionalApplicationsDynamicList, - "judicialMessageMetaData", JudicialMessageMetaData.builder() - .sender(EMPTY) - .recipient(EMPTY).build(), - "isJudiciary", YesNo.NO - ); + final List> additionalApplicationsBundle = List.of(element(randomUUID(), + AdditionalApplicationsBundle.builder() + .c2DocumentBundle(c2DocumentBundle) + .otherApplicationsBundle(OtherApplicationsBundle.builder() + .supportingEvidenceBundle(supportingEvidenceBundle).build()) + .build())); - assertThat(data).isEqualTo(expectedData); - } + final Element placement = element(Placement.builder() + .childName("Alex Green") + .placementUploadDateTime(LocalDateTime.of(2020, 10, 12, 13, 0)) + .build()); - @Test - void shouldInitialiseJudicialFieldsOnlyWhenDocumentsDoNotExist() { - List> judicialMessages = List.of( - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .dateSent("01 Dec 2020") - .build()), - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .dateSent("02 Dec 2020") - .build()) - ); + final DynamicList dynamicListWithSelectedValue = buildDynamicList(1, + Pair.of(c2DocumentBundle.getId(), "C2, 1 December 2020, 12:00pm")); - CaseData caseData = CaseData.builder() - .judicialMessages(judicialMessages) + final CaseData caseData = CaseData.builder() + .additionalApplicationsBundle(additionalApplicationsBundle) + .placementEventData(PlacementEventData.builder() + .placements(List.of(placement)) + .build()) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) + .additionalApplicationsDynamicList(dynamicListWithSelectedValue) + .build()) .build(); - Map data = sendNewMessageJudgeService.initialiseCaseFields(caseData); + final Map expectedEventData = sendNewMessageJudgeService.populateNewMessageFields(caseData); - Map expectedData = Map.of( - "judicialMessageMetaData", JudicialMessageMetaData.builder() - .sender(EMPTY) - .recipient(EMPTY).build(), - "isJudiciary", YesNo.NO - ); + final Map expectedData = Map.of( + "nextHearingLabel", "", + "relatedDocumentsLabel", + format("%s\n%s", DOCUMENT_REFERENCE_1.getFilename(), DOCUMENT_REFERENCE_2.getFilename())); - assertThat(data).isEqualTo(expectedData); + assertThat(expectedEventData).isEqualTo(expectedData); } @Test - void shouldInitialiseJudicialMessagesWithEmailAddressesWhenDocumentsDoNotExist() { - List> judicialMessages = List.of( - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .dateSent("01 Dec 2020") - .build()) - ); + void shouldPopulateDynamicListWhenDocument() { + UUID applicationId = randomUUID(); - List> closedJudicialMessages = List.of( - element(JudicialMessage.builder() - .latestMessage("some note") - .messageHistory("some history") - .dateSent("02 Dec 2020") + List> additionalApplicationsBundle = List.of(element( + AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .id(applicationId) + .uploadedDateTime("01 Dec 2020") + .author("Some author") + .build()) .build()) ); CaseData caseData = CaseData.builder() - .judicialMessages(judicialMessages) - .closedJudicialMessages(closedJudicialMessages) + .additionalApplicationsBundle(additionalApplicationsBundle) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION).build()) .build(); - Map data = sendNewMessageJudgeService.initialiseCaseFields(caseData); + Map data = sendNewMessageJudgeService.populateDynamicLists(caseData); + + DynamicList expectedAdditionalApplicationsDynamicList = buildDynamicList( + Pair.of(applicationId, "C2, 01 Dec 2020") + ); Map expectedData = Map.of( - "judicialMessageMetaData", JudicialMessageMetaData.builder() - .sender(EMPTY) - .recipient(EMPTY).build(), - "isJudiciary", YesNo.NO + "additionalApplicationsDynamicList", expectedAdditionalApplicationsDynamicList ); assertThat(data).isEqualTo(expectedData); } @Test - void shouldPopulateOnlyEmailAddressesWhenDocumentsDoNotExist() { + void shouldNotPopulateApplicationWhenAppsDoNotExist() { assertThat(sendNewMessageJudgeService.initialiseCaseFields(CaseData.builder().build())) - .containsOnly( - entry("judicialMessageMetaData", JudicialMessageMetaData.builder() - .sender(EMPTY) - .recipient(EMPTY).build()), - entry("isJudiciary", YesNo.NO)); + .doesNotContain(entry("hasAdditionalApplications", YesNo.YES)); } @Test @@ -300,7 +267,9 @@ void shouldPrePopulateSenderAndRecipientEmailsWhenNewMessageIsInitiatedByJudge() entry("judicialMessageMetaData", JudicialMessageMetaData.builder() .recipient(EMPTY) .sender(MESSAGE_SENDER).build()), - entry("isJudiciary", YesNo.YES)); + entry("isJudiciary", YesNo.YES), + entry("documentTypesDynamicList", + manageDocumentService.buildExistingDocumentTypeDynamicList(caseData))); } @Test @@ -314,155 +283,13 @@ void shouldNotPrePopulateSenderAndRecipientEmailsWhenNewMessageIsInitiatedNotByJ entry("judicialMessageMetaData", JudicialMessageMetaData.builder() .sender(EMPTY) .recipient(EMPTY).build()), - entry("isJudiciary", YesNo.NO)); - } - - @Test - void shouldRebuildAdditionalApplicationDynamicListAndFormatDocumentsCorrectlyWhenOtherApplicationSelected() { - UUID c2DocumentBundleId = randomUUID(); - - OtherApplicationsBundle selectedOtherDocumentBundle = OtherApplicationsBundle.builder() - .id(SELECTED_DYNAMIC_LIST_ITEM_ID) - .uploadedDateTime("1 January 2021, 12:00pm") - .applicationType(OtherApplicationType.C1_APPOINTMENT_OF_A_GUARDIAN) - .document(DocumentReference.builder() - .filename(OTHER_FILE_NAME) - .build()) - .supportingEvidenceBundle(List.of( - element(SupportingEvidenceBundle.builder() - .document(DocumentReference.builder() - .filename(OTHER_SUPPORTING_DOCUMENT_FILE_NAME) - .build()) - .build()))) - .build(); - - C2DocumentBundle c2DocumentBundle = C2DocumentBundle.builder() - .id(c2DocumentBundleId) - .uploadedDateTime("2 January 2021, 12:00pm") - .document(DocumentReference.builder() - .filename(C2_FILE_NAME) - .build()) - .build(); - - AdditionalApplicationsBundle additionalApplicationsBundle = AdditionalApplicationsBundle.builder() - .otherApplicationsBundle(selectedOtherDocumentBundle) - .c2DocumentBundle(c2DocumentBundle) - .build(); - - MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() - .additionalApplicationsDynamicList(DynamicList.builder() - .value(DynamicListElement.builder() - .code(SELECTED_DYNAMIC_LIST_ITEM_ID) - .build()) - .build()) - .build(); - - CaseData caseData = CaseData.builder() - .messageJudgeEventData(messageJudgeEventData) - .additionalApplicationsBundle(wrapElements(additionalApplicationsBundle)) - .build(); - - String expectedRelatedDocumentsLabel = OTHER_FILE_NAME + "\n" + OTHER_SUPPORTING_DOCUMENT_FILE_NAME; - - assertThat(sendNewMessageJudgeService.populateNewMessageFields(caseData)) - .extracting("relatedDocumentsLabel", "additionalApplicationsDynamicList") - .containsExactly( - expectedRelatedDocumentsLabel, - buildDynamicList(0, - Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "C1, 1 January 2021, 12:00pm"), - Pair.of(c2DocumentBundleId, "C2, 2 January 2021, 12:00pm") - ) - ); + entry("isJudiciary", YesNo.NO), + entry("documentTypesDynamicList", + manageDocumentService.buildExistingDocumentTypeDynamicList(caseData))); } @Test - void shouldRebuildAdditionalApplicationDynamicListAndFormatDocumentsCorrectlyWhenC2ApplicationSelected() { - UUID otherDocumentBundleId = randomUUID(); - - OtherApplicationsBundle selectedOtherDocumentBundle = OtherApplicationsBundle.builder() - .id(otherDocumentBundleId) - .uploadedDateTime("1 January 2021, 12:00pm") - .applicationType(OtherApplicationType.C1_APPOINTMENT_OF_A_GUARDIAN) - .document(DocumentReference.builder() - .filename(OTHER_FILE_NAME) - .build()) - .build(); - - C2DocumentBundle c2DocumentBundle = C2DocumentBundle.builder() - .id(SELECTED_DYNAMIC_LIST_ITEM_ID) - .uploadedDateTime("2 January 2021, 12:00pm") - .document(DocumentReference.builder() - .filename(C2_FILE_NAME) - .build()) - .supportingEvidenceBundle(List.of( - element(SupportingEvidenceBundle.builder() - .document(DocumentReference.builder() - .filename(C2_SUPPORTING_DOCUMENT_FILE_NAME) - .build()) - .build()))) - .build(); - - AdditionalApplicationsBundle additionalApplicationsBundle = AdditionalApplicationsBundle.builder() - .otherApplicationsBundle(selectedOtherDocumentBundle) - .c2DocumentBundle(c2DocumentBundle) - .build(); - - MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() - .additionalApplicationsDynamicList(DynamicList.builder() - .value(DynamicListElement.builder() - .code(SELECTED_DYNAMIC_LIST_ITEM_ID) - .build()) - .build()) - .build(); - - CaseData caseData = CaseData.builder() - .messageJudgeEventData(messageJudgeEventData) - .additionalApplicationsBundle(wrapElements(additionalApplicationsBundle)) - .build(); - - String expectedRelatedDocumentsLabel = C2_FILE_NAME + "\n" + C2_SUPPORTING_DOCUMENT_FILE_NAME; - - assertThat(sendNewMessageJudgeService.populateNewMessageFields(caseData)) - .extracting("relatedDocumentsLabel", "additionalApplicationsDynamicList") - .containsExactly( - expectedRelatedDocumentsLabel, - buildDynamicList(1, - Pair.of(otherDocumentBundleId, "C1, 1 January 2021, 12:00pm"), - Pair.of(SELECTED_DYNAMIC_LIST_ITEM_ID, "C2, 2 January 2021, 12:00pm") - ) - ); - } - - @Test - void shouldReturnEmptyMapWhenC2DocumentHasNotBeenSelected() { - C2DocumentBundle selectedC2DocumentBundle = C2DocumentBundle.builder() - .document(DocumentReference.builder() - .filename(C2_FILE_NAME) - .build()) - .supportingEvidenceBundle(List.of( - element(SupportingEvidenceBundle.builder() - .document(DocumentReference.builder() - .filename(C2_SUPPORTING_DOCUMENT_FILE_NAME) - .build()) - .build()))) - .build(); - - CaseData caseData = CaseData.builder() - .c2DocumentBundle(List.of( - element(SELECTED_DYNAMIC_LIST_ITEM_ID, selectedC2DocumentBundle), - element(randomUUID(), C2DocumentBundle.builder() - .document(DocumentReference.builder() - .filename("other_c2.doc") - .build()) - .build()) - )) - .build(); - - assertThat(sendNewMessageJudgeService.populateNewMessageFields(caseData)).containsOnlyKeys("nextHearingLabel"); - } - - @Test - void shouldReturnEmptyMapWhenAdditionalApplicationDocumentHasNotBeenSelected() { + void shouldReturnEmptyMapWhenNoAttachmentSelected() { C2DocumentBundle selectedC2DocumentBundle = C2DocumentBundle.builder() .document(DocumentReference.builder() .filename(C2_FILE_NAME) @@ -493,20 +320,14 @@ void shouldReturnEmptyMapWhenAdditionalApplicationDocumentHasNotBeenSelected() { .build() ) ) + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.NONE) + .build()) .build(); assertThat(sendNewMessageJudgeService.populateNewMessageFields(caseData)).containsOnlyKeys("nextHearingLabel"); } - @Test - void shouldNotPrePopulateRecipientWhenMessageIsInitiatedNotByJudge() { - when(userService.hasUserRole(UserRole.JUDICIARY)).thenReturn(false); - - CaseData caseData = CaseData.builder().build(); - - assertThat(sendNewMessageJudgeService.populateNewMessageFields(caseData)).containsOnlyKeys("nextHearingLabel"); - } - @Test void shouldAppendNewJudicialMessageToJudicialMessageListWhenDocumentNotSelected() { JudicialMessageMetaData judicialMessageMetaData = JudicialMessageMetaData.builder() @@ -518,6 +339,7 @@ void shouldAppendNewJudicialMessageToJudicialMessageListWhenDocumentNotSelected( MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.NONE) .judicialMessageMetaData(judicialMessageMetaData) .build(); @@ -537,7 +359,7 @@ void shouldAppendNewJudicialMessageToJudicialMessageListWhenDocumentNotSelected( .recipient(MESSAGE_RECIPIENT) .subject(MESSAGE_REQUESTED_BY) .urgency("High urgency") - .messageHistory(String.format("%s - %s", MESSAGE_SENDER, MESSAGE_NOTE)) + .messageHistory(format("%s - %s", MESSAGE_SENDER, MESSAGE_NOTE)) .build()); assertThat(updatedMessages).hasSize(1).first().isEqualTo(expectedJudicialMessageElement); @@ -568,6 +390,7 @@ void shouldAppendNewJudicialMessageToJudicialMessageListWhenAdditionalApplicatio MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) .judicialMessageMetaData(judicialMessageMetaData) .additionalApplicationsDynamicList(DynamicList.builder() .value(DynamicListElement.builder() @@ -622,6 +445,7 @@ void shouldAppendNewJudicialMessageToJudicialMessageListWhenOtherApplicationDocu MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) .judicialMessageMetaData(judicialMessageMetaData) .additionalApplicationsDynamicList(DynamicList.builder() .value(DynamicListElement.builder() @@ -684,6 +508,7 @@ void shouldAppendNewJudicialMessageToJudicialMessageListWhenPlacementApplication final MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) .judicialMessageMetaData(JudicialMessageMetaData.builder() .recipient(MESSAGE_RECIPIENT) .build()) @@ -735,6 +560,7 @@ void shouldAppendJudicialMessageToJudicialMessageListWhenPlacementApplicationWit final MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.APPLICATION) .judicialMessageMetaData(JudicialMessageMetaData.builder() .recipient(MESSAGE_RECIPIENT) .build()) @@ -765,6 +591,52 @@ void shouldAppendJudicialMessageToJudicialMessageListWhenPlacementApplicationWit .containsExactly(placementApplication); } + @Test + void shouldAppendJudicialMessageToJudicialMessageListWhenSkeletonArgumentHasBeenSelected() { + + final SkeletonArgument skeletonArgument = SkeletonArgument.builder() + .document(DOCUMENT_REFERENCE_1) + .build(); + + final HearingCourtBundle courtBundle = HearingCourtBundle.builder() + .courtBundle(List.of(element(DOCUMENT_2_ID, CourtBundle.builder() + .document(DOCUMENT_REFERENCE_2) + .build()))) + .build(); + + final MessageJudgeEventData messageJudgeEventData = MessageJudgeEventData.builder() + .judicialMessageNote(MESSAGE_NOTE) + .isMessageRegardingDocuments(MessageRegardingDocuments.DOCUMENT) + .judicialMessageMetaData(JudicialMessageMetaData.builder() + .recipient(MESSAGE_RECIPIENT) + .build()) + .documentDynamicList(DynamicList.builder() + .value(DynamicListElement.builder() + .code(format("hearingDocuments.skeletonArgumentList###%s", DOCUMENT_1_ID)) + .build()) + .build()) + .build(); + + final CaseData caseData = CaseData.builder() + .messageJudgeEventData(messageJudgeEventData) + .hearingDocuments(HearingDocuments.builder() + .skeletonArgumentList(List.of(element(DOCUMENT_1_ID, skeletonArgument))) + .courtBundleListV2(List.of(element(courtBundle))).build()) + .build(); + + final List> updatedMessages = + sendNewMessageJudgeService.addNewJudicialMessage(caseData); + + final JudicialMessage newMessage = updatedMessages.get(0).getValue(); + + assertThat(newMessage.getRelatedDocumentFileNames()) + .isEqualTo("Test Doc One"); + + assertThat(newMessage.getRelatedDocuments()) + .extracting(Element::getValue) + .containsExactly(DOCUMENT_REFERENCE_1); + } + private static Stream argForShouldAppendNewJudicialMessageToExistingJudicialMessageList() { List args = new ArrayList<>(); List judicialMessageRoleTypes = @@ -839,7 +711,7 @@ void shouldAppendNewJudicialMessageToExistingJudicialMessageList(JudicialMessage .status(OPEN) .subject(MESSAGE_REQUESTED_BY) .latestMessage(MESSAGE_NOTE) - .messageHistory(String.format("%s - %s", expectedSender, MESSAGE_NOTE)) + .messageHistory(format("%s - %s", expectedSender, MESSAGE_NOTE)) .dateSent(formatLocalDateTimeBaseUsingFormat(time.now(), DATE_TIME_AT)) .build(); @@ -885,7 +757,7 @@ void shouldPopulateFirstHearingLabelWhenHearingExists() { .build(); assertThat(sendNewMessageJudgeService.getNextHearingLabel(caseData)) - .isEqualTo(String.format("Next hearing in the case: %s hearing, %s", hearingType.getLabel(), + .isEqualTo(format("Next hearing in the case: %s hearing, %s", hearingType.getLabel(), formatLocalDateTimeBaseUsingFormat(hearingStartDate, DATE))); } @@ -896,8 +768,61 @@ void shouldNotPopulateFirstHearingLabelWhenHearingDoesNotExists() { assertThat(sendNewMessageJudgeService.getNextHearingLabel(caseData)).isEmpty(); } + @Test + void shouldShowErrorWhenNoDocumentOfSelectedType() { + DynamicListElement skeletonArgumentElement = DynamicListElement.builder() + .code("SKELETON_ARGUMENTS") + .label("Skeleton arguments") + .build(); + + CaseData caseData = CaseData.builder() + .messageJudgeEventData(MessageJudgeEventData.builder() + .isMessageRegardingDocuments(MessageRegardingDocuments.DOCUMENT) + .documentTypesDynamicList(DynamicList.builder().value(skeletonArgumentElement).build()) + .build()) + .build(); + + when(sendNewMessageJudgeService.getDocumentList(caseData)) + .thenReturn(DynamicList.builder().listItems(List.of()).build()); + + List expectedError = List.of("No documents available of type: Skeleton arguments"); + + assertThat(sendNewMessageJudgeService.validateDynamicLists(caseData)).isEqualTo(expectedError); + } + private Element buildJudicialMessageElement(LocalDateTime dateTime, JudicialMessageStatus status) { return element(JudicialMessage.builder().updatedTime(dateTime).status(status).build()); } + private DynamicList buildBasicDocumentTypeDynamicList() { + DynamicListElement skeletonArgumentElement = DynamicListElement.builder() + .code("SKELETON_ARGUMENTS") + .label("Skeleton arguments") + .build(); + + DynamicListElement courtBundleElement = DynamicListElement.builder() + .code("COURT_BUNDLE") + .label("Court Bundle") + .build(); + + return DynamicList.builder() + .listItems(List.of(skeletonArgumentElement, courtBundleElement)) + .build(); + } + + private DynamicList buildBasicDocumentDynamicList() { + DynamicListElement skeletonArgumentElement = DynamicListElement.builder() + .code(format("hearingDocuments.skeletonArgumentList###%s", DOCUMENT_1_ID)) + .label(DOCUMENT_REFERENCE_1.getFilename()) + .build(); + + DynamicListElement courtBundleElement = DynamicListElement.builder() + .code(format("hearingDocuments.courtBundleListV2###%s", DOCUMENT_2_ID)) + .label(DOCUMENT_REFERENCE_2.getFilename()) + .build(); + + return DynamicList.builder() + .listItems(List.of(skeletonArgumentElement, courtBundleElement)) + .build(); + } }