diff --git a/scm-ui/src/permissions/components/SetPermissions.js b/scm-ui/src/permissions/components/SetPermissions.js index d0b4a28d3a..e7e561d739 100644 --- a/scm-ui/src/permissions/components/SetPermissions.js +++ b/scm-ui/src/permissions/components/SetPermissions.js @@ -8,7 +8,6 @@ import { } from "@scm-manager/ui-components"; import { translate } from "react-i18next"; import { - loadAvailablePermissions, loadPermissionsForEntity, setPermissions } from "./handlePermissions"; @@ -68,35 +67,19 @@ class SetPermissions extends React.Component { }; componentDidMount(): void { - loadAvailablePermissions(this.props.availablePermissionLink).then( - response => { - const availablePermissions = response.permissions; - const permissions = {}; - availablePermissions.forEach(p => { - permissions[p] = false; - }); - this.setState({ permissions }, this.loadPermissionsForEntity); - } - ); + loadPermissionsForEntity( + this.props.availablePermissionLink, + this.props.selectedPermissionsLink.href + ).then(response => { + const { permissions, overwriteLink } = response; + this.setState({ + permissions: permissions, + loading: false, + overwritePermissionsLink: overwriteLink + }); + }); } - loadPermissionsForEntity = () => { - loadPermissionsForEntity(this.props.selectedPermissionsLink.href).then( - response => { - const checkedPermissions = response.permissions; - this.setState(state => { - const newPermissions = state.permissions; - checkedPermissions.forEach(name => (newPermissions[name] = true)); - return { - loading: false, - permissions: newPermissions, - overwritePermissionsLink: response._links.overwrite - }; - }); - } - ); - }; - submit = (event: Event) => { event.preventDefault(); if (this.state.permissions) { diff --git a/scm-ui/src/permissions/components/handlePermissions.js b/scm-ui/src/permissions/components/handlePermissions.js index 4ef9507ce7..6e48127d6d 100644 --- a/scm-ui/src/permissions/components/handlePermissions.js +++ b/scm-ui/src/permissions/components/handlePermissions.js @@ -12,14 +12,22 @@ export function setPermissions(url: string, permissions: string[]) { }); } -export function loadPermissionsForEntity(url: string) { - return apiClient.get(url).then(response => { - return response.json(); - }); -} - -export function loadAvailablePermissions(url: string) { - return apiClient.get(url).then(response => { - return response.json(); +export function loadPermissionsForEntity( + availableUrl: string, + userUrl: string +) { + return Promise.all([ + apiClient.get(availableUrl).then(response => { + return response.json(); + }), + apiClient.get(userUrl).then(response => { + return response.json(); + }) + ]).then(values => { + const [availablePermissions, checkedPermissions] = values; + const permissions = {}; + availablePermissions.permissions.forEach(p => (permissions[p] = false)); + checkedPermissions.permissions.forEach(p => (permissions[p] = true)); + return { permissions, overwriteLink: checkedPermissions._links.overwrite }; }); } diff --git a/scm-ui/src/permissions/components/handlePermissions.test.js b/scm-ui/src/permissions/components/handlePermissions.test.js new file mode 100644 index 0000000000..9fb697e938 --- /dev/null +++ b/scm-ui/src/permissions/components/handlePermissions.test.js @@ -0,0 +1,67 @@ +//@flow +import fetchMock from "fetch-mock"; +import { loadPermissionsForEntity } from "./handlePermissions"; + +describe("load permissions for entity", () => { + const AVAILABLE_PERMISSIONS_URL = "/permissions"; + const USER_PERMISSIONS_URL = "/user/scmadmin/permissions"; + + const availablePermissions = `{ + "permissions": [ + "repository:read,pull:*", + "repository:read,pull,push:*", + "repository:*:*" + ] + }`; + const userPermissions = `{ + "permissions": [ + "repository:read,pull:*" + ], + "_links": { + "self": { + "href": "/api/v2/users/rene/permissions" + }, + "overwrite": { + "href": "/api/v2/users/rene/permissions" + } + } + }`; + + beforeEach(() => { + fetchMock.getOnce( + "/api/v2" + AVAILABLE_PERMISSIONS_URL, + availablePermissions + ); + fetchMock.getOnce("/api/v2" + USER_PERMISSIONS_URL, userPermissions); + }); + + afterEach(() => { + fetchMock.reset(); + fetchMock.restore(); + }); + + it("should return permissions array", done => { + loadPermissionsForEntity( + AVAILABLE_PERMISSIONS_URL, + USER_PERMISSIONS_URL + ).then(result => { + const { permissions } = result; + expect(Object.entries(permissions).length).toBe(3); + expect(permissions["repository:read,pull:*"]).toBe(true); + expect(permissions["repository:read,pull,push:*"]).toBe(false); + expect(permissions["repository:*:*"]).toBe(false); + done(); + }); + }); + + it("should return overwrite link", done => { + loadPermissionsForEntity( + AVAILABLE_PERMISSIONS_URL, + USER_PERMISSIONS_URL + ).then(result => { + const { overwriteLink } = result; + expect(overwriteLink.href).toBe("/api/v2/users/rene/permissions"); + done(); + }); + }); +});