Skip to content

Commit fc04499

Browse files
authored
[frontend/backend] fix(healthcheck): placeholder inject must remain disabled (#5424)
Signed-off-by: Marine LM <marine.lemezo@filigran.io>
1 parent 0f817c0 commit fc04499

10 files changed

Lines changed: 66 additions & 21 deletions

File tree

openaev-api/src/main/java/io/openaev/healthcheck/utils/HealthCheckUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ public List<HealthCheck> runInjectorCheck(
166166
public List<HealthCheck> runMissingContentChecks(@NotNull final Scenario scenario) {
167167
List<HealthCheck> result = new ArrayList<>();
168168
boolean atLeastOneInjectIsNotReady =
169-
scenario.getInjects().stream().anyMatch(inject -> !inject.isReady());
169+
scenario.getInjects().stream()
170+
.filter(Inject::isEnabled)
171+
.anyMatch(inject -> !inject.isReady());
170172

171173
if (atLeastOneInjectIsNotReady) {
172174
result.add(

openaev-api/src/test/java/io/openaev/service/ScenarioServiceTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,30 @@ public void testRunChecksForMissingContentIssue() {
493493
assertEquals(HealthCheck.Status.WARNING, healthCheckToVerify.getStatus());
494494
}
495495

496+
@Test
497+
@Transactional
498+
public void given_disabledInject_should_notReturnMissingContent() {
499+
// Arrange
500+
Inject inject = new Inject();
501+
inject.setEnabled(false);
502+
Scenario scenario = new Scenario();
503+
scenario.setInjects(new HashSet<>(List.of(inject)));
504+
this.scenarioRepository.save(scenario);
505+
506+
// Act
507+
when(this.injectService.runChecks(any())).thenReturn(List.of());
508+
List<HealthCheck> healthchecks = scenarioService.runChecks(scenario.getId());
509+
510+
// Assert
511+
boolean hasMissingContent =
512+
healthchecks.stream()
513+
.anyMatch(
514+
hc ->
515+
HealthCheck.Type.INJECT.equals(hc.getType())
516+
&& HealthCheck.Detail.NOT_READY.equals(hc.getDetail()));
517+
assertFalse(hasMissingContent, "Disabled inject should not trigger MISSING_CONTENT check");
518+
}
519+
496520
@Test
497521
@Transactional
498522
public void testRunChecksForTeamsIssue() {

openaev-front/src/admin/components/common/injects/InjectPopover.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ interface Props {
3939
inject: InjectPopoverType;
4040
setSelectedInjectId: (injectId: Inject['inject_id']) => void;
4141
isDisabled?: boolean;
42+
isUpdateDisabled?: boolean;
4243
canBeTested?: boolean;
4344
canDone?: boolean;
4445
canTriggerNow?: boolean;
@@ -57,6 +58,7 @@ const InjectPopover: FunctionComponent<Props> = ({
5758
inject,
5859
setSelectedInjectId,
5960
isDisabled = false,
61+
isUpdateDisabled = true,
6062
canBeTested = false,
6163
canDone = false,
6264
canTriggerNow = false,
@@ -218,7 +220,7 @@ const InjectPopover: FunctionComponent<Props> = ({
218220
entries.push({
219221
label: 'Update',
220222
action: () => handleOpenEditContent(),
221-
disabled: isDisabled,
223+
disabled: isDisabled || isUpdateDisabled,
222224
userRight: permissions.canManage,
223225
});
224226
entries.push({

openaev-front/src/admin/components/common/injects/Injects.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,13 @@ const Injects: FunctionComponent<Props> = ({
196196
label: 'Status',
197197
isSortable: false,
198198
value: (inject: InjectOutputType, _: InjectorContractConverted['convertedContent']) => {
199-
let injectStatus = inject.inject_enabled
200-
? t('Enabled')
201-
: t('Disabled');
202-
if (!inject.inject_ready) {
199+
let injectStatus;
200+
if (!inject.inject_enabled) {
201+
injectStatus = t('Disabled');
202+
} else if (!inject.inject_ready) {
203203
injectStatus = t('Missing content');
204+
} else {
205+
injectStatus = t('Enabled');
204206
}
205207
return (
206208
<ItemBoolean
@@ -608,6 +610,7 @@ const Injects: FunctionComponent<Props> = ({
608610
canBeTested
609611
setSelectedInjectId={setSelectedInjectId}
610612
isDisabled={!injectContract}
613+
isUpdateDisabled={!inject.inject_enabled}
611614
onCreate={onCreate}
612615
onUpdate={onUpdate}
613616
onDelete={onDelete}

openaev-front/src/admin/components/common/injects/UpdateInject.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ const UpdateInject: React.FC<Props> = ({
184184
<InjectForm
185185
handleClose={handleClose}
186186
disabled={
187-
!injectorContractContent
187+
!inject.inject_enabled
188+
|| !injectorContractContent
188189
|| permissions.readOnly
189190
|| (inherited_context === INHERITED_CONTEXT.NONE
190191
&& ability.cannot(ACTIONS.MANAGE, SUBJECTS.RESOURCE, injectId))
@@ -222,8 +223,9 @@ const UpdateInject: React.FC<Props> = ({
222223
onUpdateInject={massUpdateInject}
223224
injects={injects}
224225
isDisabled={
225-
!permissions.canManage
226-
&& ability.cannot(ACTIONS.MANAGE, SUBJECTS.RESOURCE, injectId)
226+
!inject.inject_enabled
227+
|| (!permissions.canManage
228+
&& ability.cannot(ACTIONS.MANAGE, SUBJECTS.RESOURCE, injectId))
227229
}
228230
/>
229231
)}

openaev-front/src/admin/components/common/injects/expectations/InjectAddExpectation.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ const useStyles = makeStyles()(theme => ({
1919
interface InjectAddExpectationProps {
2020
predefinedExpectations: ExpectationInput[];
2121
handleAddExpectation: (data: ExpectationInput) => void;
22+
disabled?: boolean;
2223
}
2324

2425
const InjectAddExpectation: FunctionComponent<InjectAddExpectationProps> = ({
2526
predefinedExpectations,
2627
handleAddExpectation,
28+
disabled,
2729
}) => {
2830
// Standard hooks
2931
const { classes } = useStyles();
@@ -52,6 +54,7 @@ const InjectAddExpectation: FunctionComponent<InjectAddExpectationProps> = ({
5254
divider={true}
5355
onClick={handleOpen}
5456
color="primary"
57+
disabled={disabled}
5558
>
5659
<ListItemIcon color="primary">
5760
<ControlPointOutlined color="primary" />

openaev-front/src/admin/components/common/injects/expectations/InjectExpectations.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const InjectExpectations: FunctionComponent<InjectExpectationsProps> = ({
3535
handleExpectations,
3636
injectId,
3737
injectorContractId,
38+
readOnly,
3839
}) => {
3940
// Standard hooks
4041
const { classes } = useStyles();
@@ -147,6 +148,7 @@ const InjectExpectations: FunctionComponent<InjectExpectationsProps> = ({
147148
{ userCanAddExpectations && predefinedExpectations?.length !== 0
148149
&& (
149150
<InjectAddExpectation
151+
disabled={readOnly}
150152
handleAddExpectation={handleAddExpectation}
151153
predefinedExpectations={predefinedExpectations}
152154
/>

openaev-front/src/admin/components/common/injects/form/InjectContentForm.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,13 @@ const InjectContentForm = ({
5454
const ability = useContext(AbilityContext);
5555

5656
const renderTitle = (title: string, required: boolean = false, err: boolean = false) => {
57+
const getTitleColor = () => {
58+
if (err) return 'error';
59+
if (readOnly) return 'text.disabled';
60+
return 'textPrimary';
61+
};
5762
return (
58-
<Typography variant="h5" color={err ? 'error' : 'textPrimary'}>
63+
<Typography variant="h5" color={getTitleColor()}>
5964
{title}
6065
{required ? '*' : '' }
6166
</Typography>

openaev-front/src/admin/components/common/injects/form/InjectForm.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -483,9 +483,9 @@ const InjectForm = ({
483483
{!isAtomic && (
484484
<div className={`${classes.triggerBox} ${isSubmitting || disabled || permissions.readOnly ? classes.triggerBoxColorDisabled : classes.triggerBoxColor}`}>
485485
<div className={`${classes.triggerText} ${isSubmitting || disabled || permissions.readOnly ? classes.triggerTextColorDisabled : classes.triggerTextColor}`}>{t('Trigger after')}</div>
486-
<TextFieldController name="inject_depends_duration_days" label={t('Days')} type="number" disabled={permissions.readOnly} />
487-
<TextFieldController name="inject_depends_duration_hours" label={t('Hours')} type="number" disabled={permissions.readOnly} />
488-
<TextFieldController name="inject_depends_duration_minutes" label={t('Minutes')} type="number" disabled={permissions.readOnly} />
486+
<TextFieldController name="inject_depends_duration_days" label={t('Days')} type="number" disabled={permissions.readOnly || disabled} />
487+
<TextFieldController name="inject_depends_duration_hours" label={t('Hours')} type="number" disabled={permissions.readOnly || disabled} />
488+
<TextFieldController name="inject_depends_duration_minutes" label={t('Minutes')} type="number" disabled={permissions.readOnly || disabled} />
489489
</div>
490490
)}
491491

openaev-front/src/admin/components/common/injects/form/teams/InjectTeamsList.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GroupsOutlined } from '@mui/icons-material';
2-
import { FormHelperText, List, ListItem, ListItemIcon, ListItemText, Tooltip } from '@mui/material';
2+
import { FormHelperText, List, ListItem, ListItemIcon, ListItemText, Tooltip, Typography } from '@mui/material';
33
import { type FunctionComponent, useContext, useEffect, useState } from 'react';
44
import { useFormContext, useWatch } from 'react-hook-form';
55
import { makeStyles } from 'tss-react/mui';
@@ -63,6 +63,8 @@ const InjectTeamsList: FunctionComponent<Props> = ({ readOnly = false, hideEnabl
6363
setValue('inject_teams', updatedTeamIds, { shouldValidate: true });
6464
};
6565

66+
const textColor = readOnly ? 'text.disabled' : 'text.primary';
67+
6668
const teamListItem = (team: TeamOutput, userEnabled: number) => (
6769
<ListItem
6870
key={team.team_id}
@@ -76,20 +78,20 @@ const InjectTeamsList: FunctionComponent<Props> = ({ readOnly = false, hideEnabl
7678
)}
7779
>
7880
<ListItemIcon>
79-
<GroupsOutlined />
81+
<GroupsOutlined color={readOnly ? 'disabled' : 'inherit'} />
8082
</ListItemIcon>
8183
<ListItemText
8284
primary={(
8385
<div className={classes.column}>
84-
<div className={classes.bodyItem}>
86+
<Typography color={textColor} className={classes.bodyItem}>
8587
{team.team_name}
86-
</div>
87-
<Tooltip title={t('Number of users')} className={classes.bodyItem}>
88-
<span>{team.team_users_number}</span>
88+
</Typography>
89+
<Tooltip color={textColor} title={t('Number of users')} className={classes.bodyItem}>
90+
<Typography>{team.team_users_number}</Typography>
8991
</Tooltip>
9092
{!hideEnabledUsersNumber && (
91-
<Tooltip title={t('Number of enable user')} className={classes.bodyItem}>
92-
<span>{userEnabled}</span>
93+
<Tooltip color={textColor} title={t('Number of enable user')} className={classes.bodyItem}>
94+
<Typography>{userEnabled}</Typography>
9395
</Tooltip>
9496
)}
9597
<div className={classes.bodyItem}>

0 commit comments

Comments
 (0)