From d927d1004ef7e43f7fcaf03f05053f91a80d7e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Burkard?= Date: Tue, 24 Sep 2024 15:00:26 +0200 Subject: [PATCH] add test to isAllowedConventionTransition --- .../conventions/ConventionManageActions.tsx | 38 +++++------- .../utils/IsAllowedConventionTransition.ts | 22 +++++++ ...IsAllowedConventionTransition.unit.test.ts | 62 +++++++++++++++++++ 3 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 front/src/app/utils/IsAllowedConventionTransition.ts create mode 100644 front/src/app/utils/IsAllowedConventionTransition.unit.test.ts diff --git a/front/src/app/components/admin/conventions/ConventionManageActions.tsx b/front/src/app/components/admin/conventions/ConventionManageActions.tsx index 2105f73bad..aa87193869 100644 --- a/front/src/app/components/admin/conventions/ConventionManageActions.tsx +++ b/front/src/app/components/admin/conventions/ConventionManageActions.tsx @@ -28,7 +28,6 @@ import { isConventionValidated, reasonableSchedule, renewConventionParamsSchema, - statusTransitionConfigs, userHasEnoughRightsOnConvention, } from "shared"; import { BroadcastAgainButton } from "src/app/components/admin/conventions/BroadcastAgainButton"; @@ -48,6 +47,7 @@ import { } from "src/app/hooks/formContents.hooks"; import { useAppSelector } from "src/app/hooks/reduxHooks"; import { routes } from "src/app/routes/routes"; +import { isAllowedConventionTransition } from "src/app/utils/IsAllowedConventionTransition"; import { conventionSelectors } from "src/core-logic/domain/convention/convention.selectors"; import { ConventionFeedbackKind, @@ -158,7 +158,7 @@ export const ConventionManageActions = ({ justifyContent: "center", }} > - {isAllowedTransition(convention, "REJECTED", roles) && ( + {isAllowedConventionTransition(convention, "REJECTED", roles) && ( )} - {isAllowedTransition(convention, "DEPRECATED", roles) && ( + {isAllowedConventionTransition(convention, "DEPRECATED", roles) && ( )} - {isAllowedTransition(convention, "DRAFT", roles) && ( + {isAllowedConventionTransition(convention, "DRAFT", roles) && ( )} - {isAllowedTransition(convention, "ACCEPTED_BY_COUNSELLOR", roles) && ( + {isAllowedConventionTransition( + convention, + "ACCEPTED_BY_COUNSELLOR", + roles, + ) && ( )} - {isAllowedTransition(convention, "ACCEPTED_BY_VALIDATOR", roles) && ( + {isAllowedConventionTransition( + convention, + "ACCEPTED_BY_VALIDATOR", + roles, + ) && ( )} - {isAllowedTransition(convention, "CANCELLED", roles) && ( + {isAllowedConventionTransition(convention, "CANCELLED", roles) && ( <> ); }; - -const isAllowedTransition = ( - convention: ConventionReadDto, - targetStatus: ConventionStatus, - actingRoles: Role[], -): boolean => { - const transitionConfig = statusTransitionConfigs[targetStatus]; - - return ( - transitionConfig.validInitialStatuses.includes(convention.status) && - actingRoles.some((actingRole) => - transitionConfig.validRoles.includes(actingRole), - ) && - (!transitionConfig.refine?.(convention).isError ?? true) - ); -}; diff --git a/front/src/app/utils/IsAllowedConventionTransition.ts b/front/src/app/utils/IsAllowedConventionTransition.ts new file mode 100644 index 0000000000..0cd6d5a964 --- /dev/null +++ b/front/src/app/utils/IsAllowedConventionTransition.ts @@ -0,0 +1,22 @@ +import { + ConventionReadDto, + ConventionStatus, + Role, + statusTransitionConfigs, +} from "shared"; + +export const isAllowedConventionTransition = ( + convention: ConventionReadDto, + targetStatus: ConventionStatus, + actingRoles: Role[], +): boolean => { + const transitionConfig = statusTransitionConfigs[targetStatus]; + + return ( + transitionConfig.validInitialStatuses.includes(convention.status) && + actingRoles.some((actingRole) => + transitionConfig.validRoles.includes(actingRole), + ) && + (!transitionConfig.refine?.(convention).isError ?? true) + ); +}; diff --git a/front/src/app/utils/IsAllowedConventionTransition.unit.test.ts b/front/src/app/utils/IsAllowedConventionTransition.unit.test.ts new file mode 100644 index 0000000000..f2172b73b1 --- /dev/null +++ b/front/src/app/utils/IsAllowedConventionTransition.unit.test.ts @@ -0,0 +1,62 @@ +import { + ConventionDtoBuilder, + ConventionReadDto, + ConventionStatus, + Role, +} from "shared"; +import { isAllowedConventionTransition } from "src/app/utils/IsAllowedConventionTransition"; + +const convention: ConventionReadDto = { + ...new ConventionDtoBuilder().withStatus("IN_REVIEW").build(), + agencyKind: "cap-emploi", + agencySiret: "11112222333300", + agencyCounsellorEmails: ["counsellor@mail.com"], + agencyValidatorEmails: ["validator@mail.com"], + agencyName: "Agence de cap emploi", + agencyDepartment: "75", +}; + +type TestCase = { + convention: ConventionReadDto; + targetStatus: ConventionStatus; + roles: Role[]; + expected: boolean; +}; + +const cases: TestCase[] = [ + { + convention, + targetStatus: "ACCEPTED_BY_COUNSELLOR", + roles: ["counsellor"], + expected: true, + }, + { + convention, + targetStatus: "ACCEPTED_BY_VALIDATOR", + roles: ["beneficiary"], + expected: false, + }, + { + convention, + targetStatus: "ACCEPTED_BY_VALIDATOR", + roles: ["counsellor"], + expected: false, + }, + { + convention, + targetStatus: "ACCEPTED_BY_VALIDATOR", + roles: ["validator"], + expected: false, + }, +]; + +describe("isAllowedTransition", () => { + it.each(cases)( + `Transition allowed should be $expected. With roles $roles, and target status: $targetStatus, from status ${convention.status}`, + ({ convention, targetStatus, roles, expected }) => { + expect( + isAllowedConventionTransition(convention, targetStatus, roles), + ).toBe(expected); + }, + ); +});