diff --git a/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue b/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue index d756aa70dd..c1d0ece848 100644 --- a/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue +++ b/packages/web-app-admin-settings/src/components/Users/AddToGroupsModal.vue @@ -1,143 +1,137 @@ - diff --git a/packages/web-app-admin-settings/src/components/Users/RemoveFromGroupsModal.vue b/packages/web-app-admin-settings/src/components/Users/RemoveFromGroupsModal.vue index 8680178f48..ea962981c0 100644 --- a/packages/web-app-admin-settings/src/components/Users/RemoveFromGroupsModal.vue +++ b/packages/web-app-admin-settings/src/components/Users/RemoveFromGroupsModal.vue @@ -1,143 +1,133 @@ - diff --git a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue index 9f759e55f7..301625f4b3 100644 --- a/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue +++ b/packages/web-app-admin-settings/src/components/Users/SideBar/DetailsPanel.vue @@ -1,12 +1,16 @@ - diff --git a/packages/web-app-admin-settings/src/composables/actions/users/useUserActionsRemoveFromGroups.ts b/packages/web-app-admin-settings/src/composables/actions/users/useUserActionsRemoveFromGroups.ts index c2f8776803..e6f6ba0b5e 100644 --- a/packages/web-app-admin-settings/src/composables/actions/users/useUserActionsRemoveFromGroups.ts +++ b/packages/web-app-admin-settings/src/composables/actions/users/useUserActionsRemoveFromGroups.ts @@ -39,6 +39,10 @@ export const useUserActionsRemoveFromGroups = ({ groups }: { groups: Ref !memberOf?.length)) { + return false + } + return resources.length > 0 }, handler diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/AddToGroupsModal.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/AddToGroupsModal.spec.ts index af4180787a..a5e4b13e34 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/AddToGroupsModal.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/AddToGroupsModal.spec.ts @@ -4,6 +4,7 @@ import { mock } from 'vitest-mock-extended' import { Group, User } from '@opencloud-eu/web-client/graph/generated' import { Modal, useMessages } from '@opencloud-eu/web-pkg' import { useUserSettingsStore } from '../../../../src/composables/stores/userSettings' +import GroupSelect from '../../../../src/components/Users/GroupSelect.vue' describe('AddToGroupsModal', () => { it('renders the input', () => { @@ -11,6 +12,32 @@ describe('AddToGroupsModal', () => { expect(wrapper.find('group-select-stub').exists()).toBeTruthy() }) + describe('available groups', () => { + it('lists all available groups if user is not assigned to any', () => { + const users = [mock({ memberOf: [] })] + const groups = [mock(), mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(groups.length) + }) + it('only lists groups the user is not already assigned to if one user given', () => { + const assignedGroup = mock({ id: '1' }) + const users = [mock({ memberOf: [assignedGroup] })] + const groups = [assignedGroup, mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(1) + }) + it('lists all available groups if more than one user given', () => { + const assignedGroup = mock({ id: '1' }) + const users = [mock({ memberOf: [assignedGroup] }), mock({ memberOf: [] })] + const groups = [assignedGroup, mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(groups.length) + }) + }) + describe('method "onConfirm"', () => { it('adds all users to the given groups', async () => { const users = [mock({ memberOf: [] }), mock({ memberOf: [] })] @@ -20,8 +47,7 @@ describe('AddToGroupsModal', () => { mocks.$clientService.graphAuthenticated.users.getUser.mockResolvedValue( mock({ id: 'e3515ffb-d264-4dfc-8506-6c239f6673b5' }) ) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showMessage } = useMessages() @@ -38,8 +64,7 @@ describe('AddToGroupsModal', () => { const { wrapper, mocks } = getWrapper({ users, groups }) mocks.$clientService.graphAuthenticated.groups.addMember.mockRejectedValue(new Error('')) mocks.$clientService.graphAuthenticated.users.getUser.mockRejectedValue(new Error('')) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showErrorMessage } = useMessages() @@ -50,7 +75,7 @@ describe('AddToGroupsModal', () => { }) }) -function getWrapper({ users = [mock()], groups = [mock()] } = {}) { +function getWrapper({ users = [mock({ memberOf: [] })], groups = [mock()] } = {}) { const mocks = defaultComponentMocks() return { diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts index 966de80bf4..1c334bf982 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/RemoveFromGroupsModal.spec.ts @@ -4,6 +4,7 @@ import { mock } from 'vitest-mock-extended' import { Group, User } from '@opencloud-eu/web-client/graph/generated' import { Modal, useMessages } from '@opencloud-eu/web-pkg' import { useUserSettingsStore } from '../../../../src/composables/stores/userSettings' +import GroupSelect from '../../../../src/components/Users/GroupSelect.vue' describe('RemoveFromGroupsModal', () => { it('renders the input', () => { @@ -11,6 +12,29 @@ describe('RemoveFromGroupsModal', () => { expect(wrapper.find('group-select-stub').exists()).toBeTruthy() }) + describe('available groups', () => { + it('lists only groups the user is assigned to', () => { + const assignedGroup = mock({ id: '1' }) + const users = [mock({ memberOf: [assignedGroup] })] + const groups = [assignedGroup, mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(1) + }) + it('lists a sum of all assigned groups when multiple users are selected', () => { + const assignedGroup = mock({ id: '1' }) + const assignedGroup2 = mock({ id: '2' }) + const users = [ + mock({ memberOf: [assignedGroup] }), + mock({ memberOf: [assignedGroup, assignedGroup2] }) + ] + const groups = [assignedGroup, assignedGroup2, mock()] + const { wrapper } = getWrapper({ users, groups }) + const input = wrapper.findComponent('group-select-stub') + expect(input.props('groupOptions').length).toBe(2) + }) + }) + describe('method "onConfirm"', () => { it('removes all users from the given groups', async () => { const users = [ @@ -23,8 +47,7 @@ describe('RemoveFromGroupsModal', () => { mocks.$clientService.graphAuthenticated.users.getUser.mockResolvedValue( mock({ id: 'e3515ffb-d264-4dfc-8506-6c239f6673b5' }) ) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showMessage } = useMessages() @@ -44,8 +67,7 @@ describe('RemoveFromGroupsModal', () => { const { wrapper, mocks } = getWrapper({ users, groups }) mocks.$clientService.graphAuthenticated.groups.deleteMember.mockRejectedValue(new Error('')) mocks.$clientService.graphAuthenticated.users.getUser.mockRejectedValue(new Error('')) - - wrapper.vm.selectedOptions = groups + ;(wrapper.vm as any).selectedOptions = groups await wrapper.vm.onConfirm() const { showErrorMessage } = useMessages() @@ -56,7 +78,7 @@ describe('RemoveFromGroupsModal', () => { }) }) -function getWrapper({ users = [mock()], groups = [mock()] } = {}) { +function getWrapper({ users = [mock({ memberOf: [] })], groups = [mock()] } = {}) { const mocks = defaultComponentMocks() return { diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts index c1ad32a5ac..5b76afec3a 100644 --- a/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/components/Users/SideBar/DetailsPanel.spec.ts @@ -29,28 +29,28 @@ describe('DetailsPanel', () => { const { wrapper } = getWrapper({ props: { user: null, users: [] } }) - expect(wrapper.vm.noUsers).toBeTruthy() + expect(wrapper.find('[data-testid="no-users-selected"]').exists()).toBeTruthy() }) it('should be false if users are given', () => { const { wrapper } = getWrapper({ props: { user: defaultUser, users: [defaultUser] } }) - expect(wrapper.vm.noUsers).toBeFalsy() + expect(wrapper.find('[data-testid="no-users-selected"]').exists()).toBeFalsy() }) }) describe('computed method "multipleUsers"', () => { it('should be false if no users are given', () => { const { wrapper } = getWrapper({ props: { user: null, users: [] } }) - expect(wrapper.vm.multipleUsers).toBeFalsy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeFalsy() }) it('should be false if one user is given', () => { const { wrapper } = getWrapper({ props: { user: defaultUser, users: [defaultUser] } }) - expect(wrapper.vm.multipleUsers).toBeFalsy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeFalsy() }) it('should be true if multiple users are given', () => { const { wrapper } = getWrapper({ props: { user: null, users: [defaultUser, { displayName: 'user2' } as User] } }) - expect(wrapper.vm.multipleUsers).toBeTruthy() + expect(wrapper.find('#oc-users-details-multiple-sidebar').exists()).toBeTruthy() }) }) }) diff --git a/packages/web-app-admin-settings/tests/unit/composables/actions/users/useUserActionsRemoveFromGroups.spec.ts b/packages/web-app-admin-settings/tests/unit/composables/actions/users/useUserActionsRemoveFromGroups.spec.ts index 979a3390bf..89424595d7 100644 --- a/packages/web-app-admin-settings/tests/unit/composables/actions/users/useUserActionsRemoveFromGroups.spec.ts +++ b/packages/web-app-admin-settings/tests/unit/composables/actions/users/useUserActionsRemoveFromGroups.spec.ts @@ -1,7 +1,7 @@ import { useUserActionsRemoveFromGroups } from '../../../../../src/composables/actions/users/useUserActionsRemoveFromGroups' import { mock } from 'vitest-mock-extended' import { ref, unref } from 'vue' -import { User } from '@opencloud-eu/web-client/graph/generated' +import { Group, User } from '@opencloud-eu/web-client/graph/generated' import { getComposableWrapper, writable } from '@opencloud-eu/web-test-helpers' import { useCapabilityStore, useModals } from '@opencloud-eu/web-pkg' @@ -9,8 +9,9 @@ describe('useUserActionsRemoveFromGroups', () => { describe('method "isVisible"', () => { it.each([ { resources: [], isVisible: false }, - { resources: [mock()], isVisible: true }, - { resources: [mock(), mock()], isVisible: true } + { resources: [mock()], isVisible: false }, + { resources: [mock({ memberOf: [mock()] })], isVisible: true }, + { resources: [mock({ memberOf: [mock()] }), mock()], isVisible: true } ])('requires at least one user to be enabled', ({ resources, isVisible }) => { getWrapper({ setup: ({ actions }) => {