Skip to content

Commit aa4329f

Browse files
authored
Merge pull request #4158 from flexion/10191-critical-bug
10191: critical bug: consolidated case practitioner association
2 parents b586bc1 + 16c7bff commit aa4329f

File tree

4 files changed

+135
-7
lines changed

4 files changed

+135
-7
lines changed

shared/src/business/useCaseHelper/caseAssociation/updateCaseAndAssociations.test.ts

+61-5
Original file line numberDiff line numberDiff line change
@@ -663,11 +663,37 @@ describe('updateCaseAndAssociations', () => {
663663
userId: practitionerId,
664664
});
665665
});
666+
667+
it('calls updateIrsPractitionerOnCase to update gsi1pk for unchanged irsPractitioners when the case is part of a consolidated group', async () => {
668+
await updateCaseAndAssociations({
669+
applicationContext,
670+
caseToUpdate: {
671+
...mockCaseWithIrsPractitioners,
672+
leadDocketNumber: '101-23',
673+
},
674+
});
675+
676+
expect(
677+
applicationContext.getPersistenceGateway()
678+
.removePrivatePractitionerOnCase,
679+
).not.toHaveBeenCalled();
680+
expect(
681+
applicationContext.getPersistenceGateway().updateIrsPractitionerOnCase,
682+
).toHaveBeenCalled();
683+
expect(
684+
applicationContext.getPersistenceGateway().updateIrsPractitionerOnCase
685+
.mock.calls[0][0],
686+
).toMatchObject({
687+
docketNumber: validMockCase.docketNumber,
688+
practitioner: mockCaseWithIrsPractitioners.irsPractitioners![0],
689+
userId: practitionerId,
690+
});
691+
});
666692
});
667693

668694
describe('Private practitioners', () => {
669695
const practitionerId = applicationContext.getUniqueId();
670-
const mockCaseWithIrsPractitioners = new Case(
696+
const mockCaseWithIrsAndPrivatePractitioners = new Case(
671697
{
672698
...MOCK_CASE,
673699
privatePractitioners: [
@@ -685,13 +711,15 @@ describe('updateCaseAndAssociations', () => {
685711
beforeAll(() => {
686712
applicationContext
687713
.getPersistenceGateway()
688-
.getCaseByDocketNumber.mockReturnValue(mockCaseWithIrsPractitioners);
714+
.getCaseByDocketNumber.mockReturnValue(
715+
mockCaseWithIrsAndPrivatePractitioners,
716+
);
689717
});
690718

691719
it('does not call updatePrivatePractitionerOnCase or removePrivatePractitionerOnCase if all private practitioners are unchanged', async () => {
692720
await updateCaseAndAssociations({
693721
applicationContext,
694-
caseToUpdate: mockCaseWithIrsPractitioners,
722+
caseToUpdate: mockCaseWithIrsAndPrivatePractitioners,
695723
});
696724
expect(
697725
applicationContext.getPersistenceGateway()
@@ -713,7 +741,7 @@ describe('updateCaseAndAssociations', () => {
713741
await updateCaseAndAssociations({
714742
applicationContext,
715743
caseToUpdate: {
716-
...mockCaseWithIrsPractitioners,
744+
...mockCaseWithIrsAndPrivatePractitioners,
717745
privatePractitioners: [updatedPractitioner],
718746
},
719747
});
@@ -736,11 +764,39 @@ describe('updateCaseAndAssociations', () => {
736764
});
737765
});
738766

767+
it('calls updatePrivatePractitionerOnCase to update gsi1pk for unchanged privatePractitioners when the case is part of a consolidated group', async () => {
768+
await updateCaseAndAssociations({
769+
applicationContext,
770+
caseToUpdate: {
771+
...mockCaseWithIrsAndPrivatePractitioners,
772+
leadDocketNumber: '101-23',
773+
},
774+
});
775+
776+
expect(
777+
applicationContext.getPersistenceGateway()
778+
.removePrivatePractitionerOnCase,
779+
).not.toHaveBeenCalled();
780+
expect(
781+
applicationContext.getPersistenceGateway()
782+
.updatePrivatePractitionerOnCase,
783+
).toHaveBeenCalled();
784+
expect(
785+
applicationContext.getPersistenceGateway()
786+
.updatePrivatePractitionerOnCase.mock.calls[0][0],
787+
).toMatchObject({
788+
docketNumber: validMockCase.docketNumber,
789+
practitioner:
790+
mockCaseWithIrsAndPrivatePractitioners.privatePractitioners![0],
791+
userId: practitionerId,
792+
});
793+
});
794+
739795
it('removes an privatePractitioner from a case with existing privatePractitioners', async () => {
740796
await updateCaseAndAssociations({
741797
applicationContext,
742798
caseToUpdate: {
743-
...mockCaseWithIrsPractitioners,
799+
...mockCaseWithIrsAndPrivatePractitioners,
744800
privatePractitioners: [],
745801
},
746802
});

shared/src/business/useCaseHelper/caseAssociation/updateCaseAndAssociations.ts

+22-2
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,21 @@ const updateIrsPractitioners = ({
213213
const {
214214
added: addedIrsPractitioners,
215215
removed: deletedIrsPractitioners,
216+
same: unchangedIrsPractitioners,
216217
updated: updatedIrsPractitioners,
217218
} = diff(oldCase.irsPractitioners, caseToUpdate.irsPractitioners, 'userId');
218219

220+
const currentIrsPractitioners = [
221+
...addedIrsPractitioners,
222+
...updatedIrsPractitioners,
223+
];
224+
225+
if (caseToUpdate.leadDocketNumber && unchangedIrsPractitioners.length) {
226+
currentIrsPractitioners.push(...unchangedIrsPractitioners);
227+
}
228+
219229
const validIrsPractitioners = IrsPractitioner.validateRawCollection(
220-
[...addedIrsPractitioners, ...updatedIrsPractitioners],
230+
currentIrsPractitioners,
221231
{ applicationContext },
222232
);
223233

@@ -269,15 +279,25 @@ const updatePrivatePractitioners = ({
269279
const {
270280
added: addedPrivatePractitioners,
271281
removed: deletedPrivatePractitioners,
282+
same: unchangedPrivatePractitioners,
272283
updated: updatedPrivatePractitioners,
273284
} = diff(
274285
oldCase.privatePractitioners,
275286
caseToUpdate.privatePractitioners,
276287
'userId',
277288
);
278289

290+
const currentPrivatePractitioners = [
291+
...addedPrivatePractitioners,
292+
...updatedPrivatePractitioners,
293+
];
294+
295+
if (caseToUpdate.leadDocketNumber && unchangedPrivatePractitioners.length) {
296+
currentPrivatePractitioners.push(...unchangedPrivatePractitioners);
297+
}
298+
279299
const validPrivatePractitioners = PrivatePractitioner.validateRawCollection(
280-
[...addedPrivatePractitioners, ...updatedPrivatePractitioners],
300+
currentPrivatePractitioners,
281301
{ applicationContext },
282302
);
283303

web-client/integration-tests/journey/docketClerkConsolidatesCases.ts

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ export const docketClerkConsolidatesCases = (
1212
expect(
1313
cerebralTest.getState('caseDetail.consolidatedCases').length,
1414
).toEqual(expectedNumberOfConsolidatedCases);
15+
expect(cerebralTest.getState('alertSuccess')).toEqual({
16+
message: 'Selected cases consolidated.',
17+
});
1518
expect(cerebralTest.getState('modal.showModal')).toBeUndefined();
1619
});
1720
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { docketClerkConsolidatesCases } from './journey/docketClerkConsolidatesCases';
2+
import { docketClerkOpensCaseConsolidateModal } from './journey/docketClerkOpensCaseConsolidateModal';
3+
import { docketClerkSearchesForCaseToConsolidateWith } from './journey/docketClerkSearchesForCaseToConsolidateWith';
4+
import { docketClerkUpdatesCaseStatusToReadyForTrial } from './journey/docketClerkUpdatesCaseStatusToReadyForTrial';
5+
import { loginAs, setupTest, viewCaseDetail } from './helpers';
6+
import { petitionsClerkAddsPractitionersToCase } from './journey/petitionsClerkAddsPractitionersToCase';
7+
import { petitionsClerkCreatesNewCase } from './journey/petitionsClerkCreatesNewCase';
8+
9+
describe('Practitioner case association journey', () => {
10+
const cerebralTest = setupTest();
11+
12+
afterAll(() => {
13+
cerebralTest.closeSocket();
14+
});
15+
16+
loginAs(cerebralTest, 'petitionsclerk@example.com');
17+
petitionsClerkCreatesNewCase(cerebralTest, { shouldServe: true });
18+
it('sets the lead docket number in state', () => {
19+
cerebralTest.leadDocketNumber = cerebralTest.docketNumber;
20+
});
21+
22+
petitionsClerkAddsPractitionersToCase(cerebralTest, true);
23+
24+
loginAs(cerebralTest, 'docketclerk@example.com');
25+
docketClerkUpdatesCaseStatusToReadyForTrial(cerebralTest);
26+
27+
loginAs(cerebralTest, 'petitionsclerk@example.com');
28+
petitionsClerkCreatesNewCase(cerebralTest, { shouldServe: true });
29+
30+
loginAs(cerebralTest, 'docketclerk@example.com');
31+
docketClerkUpdatesCaseStatusToReadyForTrial(cerebralTest);
32+
docketClerkOpensCaseConsolidateModal(cerebralTest);
33+
docketClerkSearchesForCaseToConsolidateWith(cerebralTest);
34+
docketClerkConsolidatesCases(cerebralTest, 2);
35+
36+
loginAs(cerebralTest, 'privatepractitioner@example.com');
37+
it('navigates to case detail and checks for case association', async () => {
38+
await viewCaseDetail({
39+
cerebralTest,
40+
docketNumber: cerebralTest.docketNumber,
41+
});
42+
43+
expect(cerebralTest.getState('currentPage')).toEqual('CaseDetail');
44+
expect(cerebralTest.getState('screenMetadata.isAssociated')).toBe(true);
45+
expect(cerebralTest.getState('screenMetadata.isDirectlyAssociated')).toBe(
46+
false,
47+
);
48+
});
49+
});

0 commit comments

Comments
 (0)