From 24bc6c53e1581d09e60bd3dc5301b53772dca338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Burkard?= Date: Tue, 10 Dec 2024 17:31:22 +0100 Subject: [PATCH] refetch convention on status change (pre-validation, validation, modification asked...) --- .../domain/convention/convention.epics.ts | 38 +++++++++++------- .../domain/convention/convention.slice.ts | 4 +- .../domain/convention/convention.test.ts | 39 ++++++++++++++++++- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/front/src/core-logic/domain/convention/convention.epics.ts b/front/src/core-logic/domain/convention/convention.epics.ts index a3670ec4ab..87c27e04e0 100644 --- a/front/src/core-logic/domain/convention/convention.epics.ts +++ b/front/src/core-logic/domain/convention/convention.epics.ts @@ -57,9 +57,18 @@ const getConventionEpic: ConventionEpic = ( filter( (action) => conventionSlice.actions.fetchConventionRequested.match(action) || - conventionSlice.actions.signConventionSucceeded.match(action), + conventionSlice.actions.signConventionSucceeded.match(action) || + conventionSlice.actions.statusChangeSucceeded.match(action), ), - switchMap(({ payload }) => conventionGateway.retrieveFromToken$(payload)), + switchMap((action) => { + const params = conventionSlice.actions.statusChangeSucceeded.match(action) + ? { + conventionId: action.payload.updateStatusParams.conventionId, + jwt: action.payload.jwt, + } + : action.payload; + return conventionGateway.retrieveFromToken$(params); + }), map(conventionSlice.actions.fetchConventionSucceeded), catchEpicError((error: Error) => conventionSlice.actions.fetchConventionFailed(error.message), @@ -118,19 +127,22 @@ const conventionStatusChangeEpic: ConventionEpic = ( conventionGateway .updateConventionStatus$(payload.updateStatusParams, payload.jwt) .pipe( - map(() => - conventionSlice.actions.statusChangeSucceeded(payload.feedbackKind), - ), + map(() => conventionSlice.actions.statusChangeSucceeded(payload)), + catchEpicError((error: Error) => { + if ( + error.message.includes( + "Convention should be reviewed by counsellor", + ) + ) + return conventionSlice.actions.statusChangeSucceeded({ + ...payload, + feedbackKind: "missingCounsellorValidationError", + }); + + return conventionSlice.actions.statusChangeFailed(error.message); + }), ), ), - catchEpicError((error: Error) => { - if (error.message.includes("Convention should be reviewed by counsellor")) - return conventionSlice.actions.statusChangeSucceeded( - "missingCounsellorValidationError", - ); - - return conventionSlice.actions.statusChangeFailed(error.message); - }), ); const getConventionStatusDashboardUrl: ConventionEpic = ( diff --git a/front/src/core-logic/domain/convention/convention.slice.ts b/front/src/core-logic/domain/convention/convention.slice.ts index a14cd102e0..e565da5c0f 100644 --- a/front/src/core-logic/domain/convention/convention.slice.ts +++ b/front/src/core-logic/domain/convention/convention.slice.ts @@ -194,10 +194,10 @@ export const conventionSlice = createSlice({ }, statusChangeSucceeded: ( state, - action: PayloadAction, + action: PayloadAction, ) => { state.isLoading = false; - state.feedback = { kind: action.payload }; + state.feedback = { kind: action.payload.feedbackKind }; }, statusChangeFailed: setFeedbackAsErrored, diff --git a/front/src/core-logic/domain/convention/convention.test.ts b/front/src/core-logic/domain/convention/convention.test.ts index 5d68352686..9855acd5b3 100644 --- a/front/src/core-logic/domain/convention/convention.test.ts +++ b/front/src/core-logic/domain/convention/convention.test.ts @@ -795,13 +795,34 @@ describe("Convention slice", () => { describe("Convention status change", () => { it("sends modification request with provided justification", () => { + const agencyFields = { + agencyCounsellorEmails: [], + agencyDepartment: "75", + agencyKind: "mission-locale" as const, + agencyName: "Agence Mission Locale", + agencyRefersTo: undefined, + agencySiret: "11110000111155", + agencyValidatorEmails: [], + }; + const convention: ConventionReadDto = { + ...agencyFields, + ...new ConventionDtoBuilder().withStatus("IN_REVIEW").build(), + }; + + ({ store, dependencies } = createTestStore({ + convention: { + ...initialConventionState, + convention, + }, + })); + const jwt = "some-correct-jwt"; store.dispatch( conventionSlice.actions.statusChangeRequested({ updateStatusParams: { status: "DRAFT", statusJustification: "There is a mistake in my last name", - conventionId: "some-id", + conventionId: convention.id, modifierRole: "beneficiary", }, feedbackKind: "modificationsAskedFromSignatory", @@ -812,8 +833,24 @@ describe("Convention slice", () => { isLoading: true, }); feedGatewayWithModificationSuccess(); + + expectConventionState({ + isLoading: false, + feedback: { kind: "modificationsAskedFromSignatory" }, + convention, + }); + + const updatedConvention: ConventionReadDto = { + ...convention, + status: "DRAFT", + statusJustification: "There is a mistake in my last name", + }; + + feedGatewayWithConvention(updatedConvention); + expectConventionState({ isLoading: false, + convention: updatedConvention, feedback: { kind: "modificationsAskedFromSignatory" }, }); });