diff --git a/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.test.tsx b/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.test.tsx
new file mode 100644
index 0000000000..b635989c73
--- /dev/null
+++ b/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.test.tsx
@@ -0,0 +1,57 @@
+import { render, screen } from '@testing-library/react';
+import { IConstraint } from 'interfaces/strategy'; // Assuming you have your component in this path
+import { FC } from 'react';
+import { useConstraintsValidation } from './useConstraintsValidation';
+import { testServerRoute, testServerSetup } from 'utils/testServer';
+
+const server = testServerSetup();
+
+const TestComponent: FC<{ constraints: IConstraint[] }> = ({ constraints }) => {
+ const valid = useConstraintsValidation(constraints);
+
+ return
{valid ? 'Valid' : 'Invalid'}
;
+};
+
+it('should display Valid when constraints are valid', async () => {
+ testServerRoute(
+ server,
+ '/api/admin/constraints/validate',
+ { data: 'OK' },
+ 'post'
+ );
+
+ const validConstraints: IConstraint[] = [
+ {
+ value: 'test',
+ values: ['test'],
+ operator: 'IN',
+ contextName: 'irrelevant',
+ },
+ {
+ value: 'test',
+ values: ['test'],
+ operator: 'IN',
+ contextName: 'irrelevant',
+ },
+ ];
+
+ render();
+
+ await screen.findByText('Valid');
+});
+
+it('should display Invalid when constraints are invalid', async () => {
+ const emptyValueAndValues: IConstraint[] = [
+ { value: '', values: [], operator: 'IN', contextName: 'irrelevant' },
+ {
+ value: '',
+ values: [],
+ operator: 'IN',
+ contextName: 'irrelevant',
+ },
+ ];
+
+ render();
+
+ await screen.findByText('Invalid');
+});
diff --git a/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.ts b/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.ts
index c3e759119d..0af96004c5 100644
--- a/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.ts
+++ b/frontend/src/hooks/api/getters/useConstraintsValidation/useConstraintsValidation.ts
@@ -2,6 +2,14 @@ import useFeatureApi from 'hooks/api/actions/useFeatureApi/useFeatureApi';
import { useEffect, useState } from 'react';
import { IConstraint } from 'interfaces/strategy';
+const isValid = (constraint: IConstraint) => {
+ const hasValues =
+ Array.isArray(constraint.values) && constraint.values.length > 0;
+ const hasValue = Boolean(constraint.value);
+
+ return hasValues || hasValue;
+};
+
export const useConstraintsValidation = (
constraints?: IConstraint[]
): boolean => {
@@ -16,15 +24,14 @@ export const useConstraintsValidation = (
return;
}
- const validationRequests = constraints
- .filter(constraint => {
- const hasValues =
- Array.isArray(constraint.values) &&
- constraint.values.length > 0;
- const hasValue = Boolean(constraint.value);
+ const invalidConstraints = constraints.find(item => !isValid(item));
+ if (invalidConstraints) {
+ setValid(false);
+ return;
+ }
- return hasValues || hasValue;
- })
+ const validationRequests = constraints
+ .filter(isValid)
.map(constraint => {
return validateConstraint(constraint);
});
@@ -34,7 +41,7 @@ export const useConstraintsValidation = (
.catch(() => setValid(false));
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [constraints]);
+ }, [JSON.stringify(constraints)]);
return valid;
};