1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-07-26 13:48:33 +02:00

fix: constraint validation affecting disabled button (#4183)

This commit is contained in:
Mateusz Kwasniewski 2023-07-07 14:50:13 +02:00 committed by GitHub
parent 1b99b700d6
commit 748bfaad7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 73 additions and 9 deletions

View File

@ -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 <div>{valid ? 'Valid' : 'Invalid'}</div>;
};
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(<TestComponent constraints={validConstraints} />);
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(<TestComponent constraints={emptyValueAndValues} />);
await screen.findByText('Invalid');
});

View File

@ -2,6 +2,14 @@ import useFeatureApi from 'hooks/api/actions/useFeatureApi/useFeatureApi';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { IConstraint } from 'interfaces/strategy'; 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 = ( export const useConstraintsValidation = (
constraints?: IConstraint[] constraints?: IConstraint[]
): boolean => { ): boolean => {
@ -16,15 +24,14 @@ export const useConstraintsValidation = (
return; return;
} }
const validationRequests = constraints const invalidConstraints = constraints.find(item => !isValid(item));
.filter(constraint => { if (invalidConstraints) {
const hasValues = setValid(false);
Array.isArray(constraint.values) && return;
constraint.values.length > 0; }
const hasValue = Boolean(constraint.value);
return hasValues || hasValue; const validationRequests = constraints
}) .filter(isValid)
.map(constraint => { .map(constraint => {
return validateConstraint(constraint); return validateConstraint(constraint);
}); });
@ -34,7 +41,7 @@ export const useConstraintsValidation = (
.catch(() => setValid(false)); .catch(() => setValid(false));
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [constraints]); }, [JSON.stringify(constraints)]);
return valid; return valid;
}; };