Skip to content

Commit

Permalink
add test to isAllowedConventionTransition
Browse files Browse the repository at this point in the history
  • Loading branch information
JeromeBu committed Sep 24, 2024
1 parent a32558c commit d927d10
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import {
isConventionValidated,
reasonableSchedule,
renewConventionParamsSchema,
statusTransitionConfigs,
userHasEnoughRightsOnConvention,
} from "shared";
import { BroadcastAgainButton } from "src/app/components/admin/conventions/BroadcastAgainButton";
Expand All @@ -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,
Expand Down Expand Up @@ -158,7 +158,7 @@ export const ConventionManageActions = ({
justifyContent: "center",
}}
>
{isAllowedTransition(convention, "REJECTED", roles) && (
{isAllowedConventionTransition(convention, "REJECTED", roles) && (
<VerificationActionButton
disabled={disabled}
initialStatus={convention.status}
Expand All @@ -172,7 +172,7 @@ export const ConventionManageActions = ({
</VerificationActionButton>
)}

{isAllowedTransition(convention, "DEPRECATED", roles) && (
{isAllowedConventionTransition(convention, "DEPRECATED", roles) && (
<VerificationActionButton
disabled={disabled}
initialStatus={convention.status}
Expand All @@ -195,7 +195,7 @@ export const ConventionManageActions = ({
/>
)}

{isAllowedTransition(convention, "DRAFT", roles) && (
{isAllowedConventionTransition(convention, "DRAFT", roles) && (
<VerificationActionButton
disabled={disabled}
initialStatus={convention.status}
Expand All @@ -211,7 +211,11 @@ export const ConventionManageActions = ({
</VerificationActionButton>
)}

{isAllowedTransition(convention, "ACCEPTED_BY_COUNSELLOR", roles) && (
{isAllowedConventionTransition(
convention,
"ACCEPTED_BY_COUNSELLOR",
roles,
) && (
<VerificationActionButton
initialStatus={convention.status}
newStatus="ACCEPTED_BY_COUNSELLOR"
Expand All @@ -234,7 +238,11 @@ export const ConventionManageActions = ({
</VerificationActionButton>
)}

{isAllowedTransition(convention, "ACCEPTED_BY_VALIDATOR", roles) && (
{isAllowedConventionTransition(
convention,
"ACCEPTED_BY_VALIDATOR",
roles,
) && (
<VerificationActionButton
initialStatus={convention.status}
newStatus="ACCEPTED_BY_VALIDATOR"
Expand All @@ -261,7 +269,7 @@ export const ConventionManageActions = ({
</VerificationActionButton>
)}

{isAllowedTransition(convention, "CANCELLED", roles) && (
{isAllowedConventionTransition(convention, "CANCELLED", roles) && (
<>
<VerificationActionButton
initialStatus={convention.status}
Expand Down Expand Up @@ -454,19 +462,3 @@ export const RenewConventionForm = ({
</FormProvider>
);
};

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)
);
};
22 changes: 22 additions & 0 deletions front/src/app/utils/IsAllowedConventionTransition.ts
Original file line number Diff line number Diff line change
@@ -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)
);
};
62 changes: 62 additions & 0 deletions front/src/app/utils/IsAllowedConventionTransition.unit.test.ts
Original file line number Diff line number Diff line change
@@ -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);
},
);
});

0 comments on commit d927d10

Please sign in to comment.