From 065b11209563024c2216ca80893e19a96ed11659 Mon Sep 17 00:00:00 2001 From: daniele-mng Date: Tue, 9 Jul 2024 11:38:03 +0200 Subject: [PATCH 1/3] Add: conditional route component for feature flag --- .../conditionalRoute/ConditionalRoute.jsx | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/web/components/conditionalRoute/ConditionalRoute.jsx diff --git a/src/web/components/conditionalRoute/ConditionalRoute.jsx b/src/web/components/conditionalRoute/ConditionalRoute.jsx new file mode 100644 index 0000000000..02524e712f --- /dev/null +++ b/src/web/components/conditionalRoute/ConditionalRoute.jsx @@ -0,0 +1,29 @@ +/* SPDX-FileCopyrightText: 2024 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import PropTypes from 'prop-types'; + +import {Route, Redirect} from 'react-router-dom'; +import useCapabilities from 'web/hooks/useCapabilities'; + +const ConditionalRoute = ({component: Component, feature, ...rest}) => { + const capabilities = useCapabilities(); + const isEnabled = capabilities._featuresEnabled[feature]; + return ( + + isEnabled ? : + } + {...rest} + /> + ); +}; + +ConditionalRoute.propTypes = { + component: PropTypes.elementType.isRequired, + feature: PropTypes.string.isRequired, +}; + +export default ConditionalRoute; From 18a2ac289f3fea508ea7c04c3c19e9731970e85c Mon Sep 17 00:00:00 2001 From: daniele-mng Date: Tue, 9 Jul 2024 14:06:54 +0200 Subject: [PATCH 2/3] add test --- .../__tests__/ConditionalRoute.jsx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx diff --git a/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx new file mode 100644 index 0000000000..a88608e852 --- /dev/null +++ b/src/web/components/conditionalRoute/__tests__/ConditionalRoute.jsx @@ -0,0 +1,47 @@ +/* SPDX-FileCopyrightText: 2024 Greenbone AG + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import {describe, test, expect} from '@gsa/testing'; +import {screen, rendererWith} from 'web/utils/testing'; +import {Route, MemoryRouter} from 'react-router-dom'; +import ConditionalRoute from 'web/components/conditionalRoute/ConditionalRoute'; +import Capabilities from 'gmp/capabilities/capabilities'; + +const MockComponent = () =>
Mock Component
; + +describe('ConditionalRoute', () => { + const featureList = [ + {name: 'ENABLED_FEATURE', _enabled: 1}, + {name: 'DISABLED_FEATURE', _enabled: 0}, + ]; + const capabilities = new Capabilities(['everything'], featureList); + const {render} = rendererWith({capabilities, router: true}); + test.each([ + { + feature: 'ENABLED_FEATURE', + expectedText: 'Mock Component', + description: 'renders the component when the feature is enabled', + }, + { + feature: 'DISABLED_FEATURE', + expectedText: 'Not Found', + description: 'redirects when the feature is disabled', + }, + { + feature: 'unknown-feature', + expectedText: 'Not Found', + description: 'does not render the component for an unknown feature', + }, + ])('$description', ({feature, expectedText}) => { + render( + + +
Not Found
} /> +
, + ); + + expect(screen.getByText(expectedText)).toBeVisible(); + }); +}); From fc4198a87ec6703169996bf40788795384e32fd2 Mon Sep 17 00:00:00 2001 From: daniele-mng Date: Tue, 9 Jul 2024 15:26:15 +0200 Subject: [PATCH 3/3] Update ConditionalRoute.jsx --- src/web/components/conditionalRoute/ConditionalRoute.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/web/components/conditionalRoute/ConditionalRoute.jsx b/src/web/components/conditionalRoute/ConditionalRoute.jsx index 02524e712f..97323b30fc 100644 --- a/src/web/components/conditionalRoute/ConditionalRoute.jsx +++ b/src/web/components/conditionalRoute/ConditionalRoute.jsx @@ -10,7 +10,8 @@ import useCapabilities from 'web/hooks/useCapabilities'; const ConditionalRoute = ({component: Component, feature, ...rest}) => { const capabilities = useCapabilities(); - const isEnabled = capabilities._featuresEnabled[feature]; + const isEnabled = capabilities.featureEnabled(feature); + return (