mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-04 00:18:01 +01:00
feat: skip change request in UI (#3495)
This commit is contained in:
parent
536230a364
commit
3b1157b869
@ -192,6 +192,10 @@ const otherRequests = (feature: string) => {
|
|||||||
version: 1,
|
version: 1,
|
||||||
tags: [],
|
tags: [],
|
||||||
});
|
});
|
||||||
|
testServerRoute(server, `api/admin/tag-types`, {
|
||||||
|
tagTypes: [],
|
||||||
|
version: 1,
|
||||||
|
});
|
||||||
testServerRoute(server, 'api/admin/user', {
|
testServerRoute(server, 'api/admin/user', {
|
||||||
user: {
|
user: {
|
||||||
isAPI: false,
|
isAPI: false,
|
||||||
|
@ -73,6 +73,10 @@ const setupOtherRoutes = (feature: string) => {
|
|||||||
version: 1,
|
version: 1,
|
||||||
tags: [],
|
tags: [],
|
||||||
});
|
});
|
||||||
|
testServerRoute(server, `api/admin/tag-types`, {
|
||||||
|
tagTypes: [],
|
||||||
|
version: 1,
|
||||||
|
});
|
||||||
testServerRoute(server, `api/admin/tags/simple`, {
|
testServerRoute(server, `api/admin/tags/simple`, {
|
||||||
version: 1,
|
version: 1,
|
||||||
tags: [],
|
tags: [],
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { ReactElement, ReactNode, useMemo } from 'react';
|
import { ReactElement, ReactNode, useMemo } from 'react';
|
||||||
import AccessContext, { IAccessContext } from 'contexts/AccessContext';
|
import AccessContext, { IAccessContext } from 'contexts/AccessContext';
|
||||||
import { ADMIN } from './permissions';
|
import { ADMIN, SKIP_CHANGE_REQUEST } from './permissions';
|
||||||
import { IPermission } from 'interfaces/user';
|
import { IPermission } from 'interfaces/user';
|
||||||
import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions';
|
import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions';
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ const checkPermission = (
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.permission === ADMIN) {
|
if (p.permission === ADMIN && permission !== SKIP_CHANGE_REQUEST) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
76
frontend/src/hooks/useChangeRequestsEnabled.test.tsx
Normal file
76
frontend/src/hooks/useChangeRequestsEnabled.test.tsx
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { render, screen } from '@testing-library/react';
|
||||||
|
import { AccessProviderMock } from '../component/providers/AccessProvider/AccessProviderMock';
|
||||||
|
import { useChangeRequestsEnabled } from './useChangeRequestsEnabled';
|
||||||
|
import { FC } from 'react';
|
||||||
|
import { testServerRoute, testServerSetup } from '../utils/testServer';
|
||||||
|
import {
|
||||||
|
SKIP_CHANGE_REQUEST,
|
||||||
|
ADMIN,
|
||||||
|
} from '../component/providers/AccessProvider/permissions';
|
||||||
|
|
||||||
|
const project = 'project';
|
||||||
|
const environment = 'production';
|
||||||
|
|
||||||
|
const TestComponent: FC = () => {
|
||||||
|
const { isChangeRequestConfigured } = useChangeRequestsEnabled(project);
|
||||||
|
|
||||||
|
const string = isChangeRequestConfigured('production')
|
||||||
|
? 'change request'
|
||||||
|
: 'regular mode';
|
||||||
|
|
||||||
|
return <div>{string}</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const server = testServerSetup();
|
||||||
|
|
||||||
|
testServerRoute(
|
||||||
|
server,
|
||||||
|
`/api/admin/projects/${project}/change-requests/config`,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
environment,
|
||||||
|
changeRequestEnabled: true,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
);
|
||||||
|
testServerRoute(server, '/api/admin/ui-config', {
|
||||||
|
versionInfo: {
|
||||||
|
current: { enterprise: 'present' },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SKIP_CHANGE_REQUEST disables change request mode', async () => {
|
||||||
|
render(
|
||||||
|
<AccessProviderMock
|
||||||
|
permissions={[
|
||||||
|
{
|
||||||
|
permission: ADMIN,
|
||||||
|
project,
|
||||||
|
environment,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<TestComponent />
|
||||||
|
</AccessProviderMock>
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = await screen.findByText('change request');
|
||||||
|
expect(result).toBeInTheDocument();
|
||||||
|
|
||||||
|
render(
|
||||||
|
<AccessProviderMock
|
||||||
|
permissions={[
|
||||||
|
{
|
||||||
|
permission: SKIP_CHANGE_REQUEST,
|
||||||
|
project,
|
||||||
|
environment,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<TestComponent />
|
||||||
|
</AccessProviderMock>
|
||||||
|
);
|
||||||
|
|
||||||
|
const regularModeElement = await screen.findByText('regular mode');
|
||||||
|
expect(regularModeElement).toBeInTheDocument();
|
||||||
|
});
|
@ -1,12 +1,21 @@
|
|||||||
|
import { SKIP_CHANGE_REQUEST } from 'component/providers/AccessProvider/permissions';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useChangeRequestConfig } from './api/getters/useChangeRequestConfig/useChangeRequestConfig';
|
import { useChangeRequestConfig } from './api/getters/useChangeRequestConfig/useChangeRequestConfig';
|
||||||
|
import { useCheckProjectPermissions } from './useHasAccess';
|
||||||
|
|
||||||
export const useChangeRequestsEnabled = (projectId: string) => {
|
export const useChangeRequestsEnabled = (projectId: string) => {
|
||||||
const { data } = useChangeRequestConfig(projectId);
|
const { data } = useChangeRequestConfig(projectId);
|
||||||
|
const checkAccess = useCheckProjectPermissions(projectId);
|
||||||
|
|
||||||
const isChangeRequestConfigured = React.useCallback(
|
const isChangeRequestConfigured = React.useCallback(
|
||||||
(environment: string): boolean => {
|
(environment: string): boolean => {
|
||||||
return data.some(draft => {
|
const canSkipChangeRequest = checkAccess(
|
||||||
|
SKIP_CHANGE_REQUEST,
|
||||||
|
environment
|
||||||
|
);
|
||||||
|
return canSkipChangeRequest
|
||||||
|
? false
|
||||||
|
: data.some(draft => {
|
||||||
return (
|
return (
|
||||||
draft.environment === environment &&
|
draft.environment === environment &&
|
||||||
draft.changeRequestEnabled
|
draft.changeRequestEnabled
|
||||||
|
@ -15,7 +15,7 @@ import useProject from './api/getters/useProject/useProject';
|
|||||||
* This is for features not integrated with change request.
|
* This is for features not integrated with change request.
|
||||||
* If the feature is integrated with change request, use useCheckProjectAccess instead.
|
* If the feature is integrated with change request, use useCheckProjectAccess instead.
|
||||||
*/
|
*/
|
||||||
const useCheckProjectPermissions = (projectId?: string) => {
|
export const useCheckProjectPermissions = (projectId?: string) => {
|
||||||
const { hasAccess } = useContext(AccessContext);
|
const { hasAccess } = useContext(AccessContext);
|
||||||
|
|
||||||
const checkPermission = (
|
const checkPermission = (
|
||||||
|
19
src/migrations/20230411085947-skip-change-request-ui.js
Normal file
19
src/migrations/20230411085947-skip-change-request-ui.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
exports.up = function (db, callback) {
|
||||||
|
db.runSql(
|
||||||
|
`
|
||||||
|
UPDATE permissions SET display_name = 'Skip change request process' WHERE permission = 'SKIP_CHANGE_REQUEST';
|
||||||
|
`,
|
||||||
|
callback,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.down = function (db, callback) {
|
||||||
|
db.runSql(
|
||||||
|
`
|
||||||
|
UPDATE permissions SET display_name = 'Skip change request process (API-only)' WHERE permission = 'SKIP_CHANGE_REQUEST';
|
||||||
|
`,
|
||||||
|
callback,
|
||||||
|
);
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user