-
+
diff --git a/packages/web-app-admin-settings/tests/unit/components/Users/UsersList.spec.ts b/packages/web-app-admin-settings/tests/unit/components/Users/UsersList.spec.ts
index 77d255d7c8c..26ac6fb0561 100644
--- a/packages/web-app-admin-settings/tests/unit/components/Users/UsersList.spec.ts
+++ b/packages/web-app-admin-settings/tests/unit/components/Users/UsersList.spec.ts
@@ -48,22 +48,34 @@ describe('UsersList', () => {
expect(
wrapper.vm.orderBy(
- [{ role: { displayName: 'user' } }, { role: { displayName: 'admin' } }],
+ [
+ { appRoleAssignments: [{ appRoleId: '1' }] },
+ { appRoleAssignments: [{ appRoleId: '2' }] }
+ ],
'role',
false
)
- ).toEqual([{ role: { displayName: 'admin' } }, { role: { displayName: 'user' } }])
+ ).toEqual([
+ { appRoleAssignments: [{ appRoleId: '1' }] },
+ { appRoleAssignments: [{ appRoleId: '2' }] }
+ ])
})
it('should return an role based descending ordered list while desc is set to true', () => {
const { wrapper } = getWrapper()
expect(
wrapper.vm.orderBy(
- [{ role: { displayName: 'admin' } }, { role: { displayName: 'user' } }],
+ [
+ { appRoleAssignments: [{ appRoleId: '1' }] },
+ { appRoleAssignments: [{ appRoleId: '2' }] }
+ ],
'role',
true
)
- ).toEqual([{ role: { displayName: 'user' } }, { role: { displayName: 'admin' } }])
+ ).toEqual([
+ { appRoleAssignments: [{ appRoleId: '2' }] },
+ { appRoleAssignments: [{ appRoleId: '1' }] }
+ ])
})
})
@@ -91,6 +103,24 @@ function getWrapper({ propsData = {} } = {}) {
props: {
users: [],
selectedUsers: [],
+ roles: [
+ {
+ displayName: 'Admin',
+ id: '1'
+ },
+ {
+ displayName: 'Guest',
+ id: '2'
+ },
+ {
+ displayName: 'Space Admin',
+ id: '3'
+ },
+ {
+ displayName: 'User',
+ id: '4'
+ }
+ ],
headerPosition: 0,
...propsData
},
diff --git a/packages/web-app-admin-settings/tests/unit/views/Users.spec.ts b/packages/web-app-admin-settings/tests/unit/views/Users.spec.ts
index c76b20f847f..1876eb38629 100644
--- a/packages/web-app-admin-settings/tests/unit/views/Users.spec.ts
+++ b/packages/web-app-admin-settings/tests/unit/views/Users.spec.ts
@@ -2,8 +2,6 @@ import Users from '../../../src/views/Users.vue'
import { eventBus } from 'web-pkg/src/services/eventBus'
import { mock, mockDeep } from 'jest-mock-extended'
import { Graph } from 'web-client/src'
-import { useLoadTasks } from '../../../src/composables/loadTasks/useLoadTasks'
-import { Task } from 'vue-concurrency'
import { mockAxiosResolve, mockAxiosReject } from 'web-test-helpers/src/mocks'
import {
createStore,
@@ -14,39 +12,109 @@ import {
} from 'web-test-helpers'
import { AxiosResponse } from 'axios'
-const defaultGraphMock = () => {
- const defaultUser = {
+const getDefaultUser = () => {
+ return {
id: '1',
+ displayName: 'Admin',
+ givenName: 'Admin',
+ surname: 'Admin',
memberOf: [],
+ mail: 'admin@example.org',
drive: {
- name: 'any'
- }
+ id: '1',
+ name: 'admin',
+ quota: { remaining: 5000000000, state: 'normal', total: 5000000000, used: 0 }
+ },
+ appRoleAssignments: [
+ {
+ appRoleId: '1',
+ id: '1',
+ principalId: '1',
+ principalType: 'User',
+ resourceDisplayName: 'ownCloud Infinite Scale',
+ resourceId: 'some-graph-app-id'
+ }
+ ]
}
+}
+
+const getDefaultApplications = () => {
+ return [
+ {
+ appRoles: [
+ {
+ displayName: 'Admin',
+ id: '1'
+ },
+ {
+ displayName: 'Guest',
+ id: '2'
+ },
+ {
+ displayName: 'Space Admin',
+ id: '3'
+ },
+ {
+ displayName: 'User',
+ id: '4'
+ }
+ ],
+ displayName: 'ownCloud Infinite Scale',
+ id: 'some-graph-app-id'
+ }
+ ]
+}
+const getDefaultGraphMock = () => {
const graph = mockDeep
()
- graph.users.listUsers.mockResolvedValue(mock({ data: { value: [defaultUser] } }))
- graph.users.getUser.mockResolvedValue(mock({ data: defaultUser }))
+ graph.users.listUsers.mockResolvedValue(
+ mock({ data: { value: [getDefaultUser()] } })
+ )
+ graph.users.getUser.mockResolvedValue(mock({ data: getDefaultUser() }))
graph.groups.listGroups.mockResolvedValue(mock({ data: { value: [] } }))
+ graph.applications.listApplications.mockResolvedValue(
+ mock({ data: { value: getDefaultApplications() } })
+ )
return graph
}
-jest.mock('../../../src/composables/loadTasks/useLoadTasks')
-jest.mocked(useLoadTasks).mockImplementation(({ roles, userAssignments }) => {
- roles.value = []
- userAssignments.value = []
-
- return {
- loadRolesTask: mockDeep>(),
- loadUserRoleTask: mockDeep>(),
- addRoleAssignment: jest.fn()
- }
-})
-
describe('Users view', () => {
describe('method "createUser"', () => {
it('should hide the modal and show message on success', async () => {
- const { wrapper } = getMountedWrapper()
+ const graph = getDefaultGraphMock()
+ graph.users.createUser.mockImplementation(() =>
+ mockAxiosResolve({
+ displayName: 'benedikt coolman',
+ givenName: '',
+ id: '2',
+ mail: 'benedikt@example.org',
+ onPremisesSamAccountName: 'bene',
+ surname: 'bene'
+ })
+ )
+ graph.users.getUser.mockImplementation(() =>
+ mockAxiosResolve({
+ appRoleAssignments: [
+ {
+ appRoleId: '1',
+ id: '1',
+ principalId: '2',
+ principalType: 'User',
+ resourceDisplayName: 'ownCloud Infinite Scale',
+ resourceId: 'some-graph-app-id'
+ }
+ ],
+ displayName: 'benedikt coolman',
+ givenName: '',
+ id: 'e3515ffb-d264-4dfc-8506-6c239f6673b5',
+ mail: 'benedikt@example.org',
+ memberOf: [],
+ onPremisesSamAccountName: 'bene',
+ surname: 'bene'
+ })
+ )
+ const { wrapper } = getMountedWrapper({ graph })
const showMessageStub = jest.spyOn(wrapper.vm, 'showMessage')
const toggleCreateUserModalStub = jest.spyOn(wrapper.vm, 'toggleCreateUserModal')
await wrapper.vm.createUser({ displayName: 'jan' })
@@ -57,7 +125,7 @@ describe('Users view', () => {
it('should show message on error', async () => {
jest.spyOn(console, 'error').mockImplementation(() => undefined)
- const graph = defaultGraphMock()
+ const graph = getDefaultGraphMock()
graph.users.createUser.mockImplementation(() => mockAxiosReject())
const { wrapper } = getMountedWrapper({ graph })
const showMessageStub = jest.spyOn(wrapper.vm, 'showMessage')
@@ -72,37 +140,111 @@ describe('Users view', () => {
describe('method "editUser"', () => {
it('should emit event on success', async () => {
const editUser = {
+ appRoleAssignments: [
+ {
+ appRoleId: '2',
+ resourceId: 'some-graph-app-id',
+ principalId: '1'
+ }
+ ],
+ displayName: 'administrator',
id: '1',
- displayName: 'jan',
- role: { id: '1', displayName: 'admin' },
- drive: { id: '1', quota: { total: 10000 } },
- passwordProfile: { password: 'newpassword' }
+ mail: 'administrator@example.org',
+ memberOf: [
+ {
+ displayName: 'admins',
+ id: '1'
+ }
+ ],
+ drive: {
+ id: '1',
+ name: 'admin',
+ quota: {
+ total: 1000000000
+ }
+ },
+ passwordProfile: {
+ password: 'administrator'
+ }
}
- const graph = defaultGraphMock()
- graph.users.editUser.mockImplementation(() =>
+ const graph = getDefaultGraphMock()
+ graph.users.editUser.mockImplementation(() => mockAxiosResolve())
+ graph.users.createUserAppRoleAssignment.mockImplementation(() => mockAxiosResolve())
+ graph.groups.addMember.mockImplementation(() => mockAxiosResolve())
+ graph.drives.updateDrive.mockImplementation(() =>
mockAxiosResolve({
- accountUuid: '1',
id: '1',
- roleId: '1'
+ name: 'admin',
+ quota: { remaining: 1000000000, state: 'normal', total: 1000000000, used: 0 }
})
)
- graph.drives.updateDrive.mockImplementation(() => mockAxiosResolve({ name: 'any' }))
- const { wrapper } = getMountedWrapper({ graph })
+ graph.users.getUser.mockImplementation(() =>
+ mockAxiosResolve({
+ appRoleAssignments: [
+ {
+ appRoleId: '2',
+ id: '1',
+ principalId: '1',
+ principalType: 'User',
+ resourceDisplayName: 'ownCloud Infinite Scale',
+ resourceId: 'some-graph-app-id'
+ }
+ ],
+ displayName: 'administrator',
+ drive: {
+ id: '1',
+ name: 'admin',
+ quota: { remaining: 1000000000, state: 'normal', total: 1000000000, used: 0 }
+ },
+ id: '1',
+ mail: 'administrator@example.org',
+ memberOf: [
+ {
+ displayName: 'admins',
+ id: '1'
+ }
+ ],
+ onPremisesSamAccountName: 'admin',
+ surname: 'Admin'
+ })
+ )
+
+ const { wrapper } = getMountedWrapper({
+ graph
+ })
+
const busStub = jest.spyOn(eventBus, 'publish')
const updateSpaceFieldStub = jest.spyOn(wrapper.vm, 'UPDATE_SPACE_FIELD')
+ const updateUserDriveStub = jest.spyOn(wrapper.vm, 'updateUserDrive')
+ const updateUserGroupAssignmentsStub = jest.spyOn(wrapper.vm, 'updateUserGroupAssignments')
+ const updateUserAppRoleAssignmentsStub = jest.spyOn(
+ wrapper.vm,
+ 'updateUserAppRoleAssignments'
+ )
await wrapper.vm.loadResourcesTask.last
- await wrapper.vm.editUser(editUser)
- expect(wrapper.vm.selectedUsers[0]).toEqual(editUser)
- expect(busStub).toHaveBeenCalledWith('sidebar.entity.saved')
+ const userToUpDate = wrapper.vm.users.find((user) => user.id === '1')
+ const updatedUser = await wrapper.vm.editUser({ user: userToUpDate, editUser })
+
+ expect(updatedUser.id).toEqual('1')
+ expect(updatedUser.displayName).toEqual('administrator')
+ expect(updatedUser.mail).toEqual('administrator@example.org')
+ expect(updatedUser.appRoleAssignments[0].appRoleId).toEqual('2')
+ expect(updatedUser.drive.quota.total).toEqual(1000000000)
+ expect(updatedUser.memberOf[0].id).toEqual('1')
+
+ expect(busStub).toHaveBeenCalledTimes(2)
+ expect(updateUserDriveStub).toHaveBeenCalled()
expect(updateSpaceFieldStub).toHaveBeenCalled()
+ expect(updateUserGroupAssignmentsStub).toHaveBeenCalled()
+ expect(updateUserAppRoleAssignmentsStub).toHaveBeenCalled()
})
it('should show message on error', async () => {
jest.spyOn(console, 'error').mockImplementation(() => undefined)
- const graph = defaultGraphMock()
+ const graph = getDefaultGraphMock()
graph.users.editUser.mockImplementation(() => mockAxiosReject())
const { wrapper } = getMountedWrapper({ graph })
const showMessageStub = jest.spyOn(wrapper.vm, 'showMessage')
@@ -116,43 +258,6 @@ describe('Users view', () => {
})
})
- describe('method "editUserGroupAssignments"', () => {
- const editUser = {
- id: '1',
- memberOf: [
- {
- displayName: 'group',
- id: '04114ac6-f050-41d2-98db-6f016abccf2c'
- }
- ]
- }
- it('should emit event on success2', async () => {
- const { wrapper } = getMountedWrapper()
- const busStub = jest.spyOn(eventBus, 'publish')
- await wrapper.vm.loadResourcesTask.last
- await wrapper.vm.editUserGroupAssignments(editUser)
-
- expect(wrapper.vm.selectedUsers[0]).toEqual(editUser)
- expect(busStub).toHaveBeenCalledWith('sidebar.entity.saved')
- })
-
- it('should show message on error', async () => {
- jest.spyOn(console, 'error').mockImplementation(() => undefined)
-
- const graph = defaultGraphMock()
- graph.groups.addMember.mockImplementation(() => mockAxiosReject())
- const { wrapper } = getMountedWrapper({ graph })
- const showMessageStub = jest
- .spyOn(wrapper.vm, 'showMessage')
- .mockImplementation(() => undefined)
-
- await wrapper.vm.loadResourcesTask.last
- await wrapper.vm.editUserGroupAssignments(editUser)
-
- expect(showMessageStub).toHaveBeenCalled()
- })
- })
-
describe('method "deleteUsers"', () => {
it('should hide the modal and show message on success', async () => {
const { wrapper } = getMountedWrapper()
@@ -165,7 +270,7 @@ describe('Users view', () => {
})
it('should show message on error', async () => {
jest.spyOn(console, 'error').mockImplementation(() => undefined)
- const graph = defaultGraphMock()
+ const graph = getDefaultGraphMock()
graph.users.deleteUser.mockImplementation(() => mockAxiosReject())
const { wrapper } = getMountedWrapper({ graph })
const graphDeleteUserStub = jest.spyOn(graph.users, 'deleteUser')
@@ -179,7 +284,7 @@ describe('Users view', () => {
})
it('should show message while user tries to delete own account', async () => {
const { wrapper } = getMountedWrapper()
- const graph = defaultGraphMock()
+ const graph = getDefaultGraphMock()
const graphDeleteUserStub = jest.spyOn(graph.users, 'deleteUser')
const showMessageStub = jest.spyOn(wrapper.vm, 'showMessage')
const toggleDeleteUserModalStub = jest.spyOn(wrapper.vm, 'toggleDeleteUserModal')
@@ -223,7 +328,7 @@ describe('Users view', () => {
expect(wrapper.vm.allUsersSelected).toBeTruthy()
})
it('should be false if not every user is selected', async () => {
- const graph = defaultGraphMock()
+ const graph = getDefaultGraphMock()
graph.users.listUsers.mockImplementation(() =>
mockAxiosResolve({ value: [{ id: '1' }, { id: '2' }] })
)
@@ -235,7 +340,7 @@ describe('Users view', () => {
})
})
-function getMountedWrapper({ graph = defaultGraphMock() } = {}) {
+function getMountedWrapper({ data = {}, graph = getDefaultGraphMock() } = {}) {
const mocks = {
...defaultComponentMocks()
}
@@ -253,6 +358,9 @@ function getMountedWrapper({ graph = defaultGraphMock() } = {}) {
return {
mocks,
wrapper: shallowMount(Users, {
+ data: () => {
+ return { ...data }
+ },
global: {
plugins: [...defaultPlugins(), store],
mocks
diff --git a/packages/web-client/src/graph.ts b/packages/web-client/src/graph.ts
index 59deb09623a..7e187a1ac46 100644
--- a/packages/web-client/src/graph.ts
+++ b/packages/web-client/src/graph.ts
@@ -21,7 +21,9 @@ import {
TagUnassignment,
DrivesGetDrivesApi,
CollectionOfApplications,
- ApplicationsApiFactory
+ ApplicationsApiFactory,
+ UserAppRoleAssignmentApiFactory,
+ AppRoleAssignment
} from './generated'
export interface Graph {
@@ -49,6 +51,10 @@ export interface Graph {
editUser: (userId: string, user: User) => AxiosPromise
deleteUser: (userId: string) => AxiosPromise
listUsers: (orderBy?: string) => AxiosPromise
+ createUserAppRoleAssignment: (
+ userId: string,
+ appRoleAssignment: AppRoleAssignment
+ ) => AxiosPromise
}
groups: {
listGroups: (orderBy?: string) => AxiosPromise
@@ -79,6 +85,11 @@ export const graph = (baseURI: string, axiosClient: AxiosInstance): Graph => {
const applicationsApiFactory = ApplicationsApiFactory(config, config.basePath, axiosClient)
const userApiFactory = UserApiFactory(config, config.basePath, axiosClient)
const usersApiFactory = UsersApiFactory(config, config.basePath, axiosClient)
+ const userAppRoleAssignmentApiFactory = UserAppRoleAssignmentApiFactory(
+ config,
+ config.basePath,
+ axiosClient
+ )
const groupApiFactory = GroupApiFactory(config, config.basePath, axiosClient)
const groupsApiFactory = GroupsApiFactory(config, config.basePath, axiosClient)
const drivesApiFactory = DrivesApiFactory(config, config.basePath, axiosClient)
@@ -109,7 +120,11 @@ export const graph = (baseURI: string, axiosClient: AxiosInstance): Graph => {
},
users: {
getUser: (userId: string) =>
- userApiFactory.getUser(userId, new Set([]), new Set(['drive'])),
+ userApiFactory.getUser(
+ userId,
+ new Set([]),
+ new Set(['drive', 'memberOf', 'appRoleAssignments'])
+ ),
createUser: (user: User) => usersApiFactory.createUser(user),
getMe: () => meUserApiFactory.getOwnUser(new Set(['memberOf'])),
changeOwnPassword: (currentPassword, newPassword) =>
@@ -125,8 +140,10 @@ export const graph = (baseURI: string, axiosClient: AxiosInstance): Graph => {
false,
new Set([orderBy]),
new Set([]),
- new Set(['memberOf'])
- )
+ new Set(['memberOf', 'appRoleAssignments'])
+ ),
+ createUserAppRoleAssignment: (userId: string, appRoleAssignment: AppRoleAssignment) =>
+ userAppRoleAssignmentApiFactory.userCreateAppRoleAssignments(userId, appRoleAssignment)
},
groups: {
createGroup: (group: Group) => groupsApiFactory.createGroup(group),
diff --git a/packages/web-runtime/src/helpers/additionalTranslations.ts b/packages/web-runtime/src/helpers/additionalTranslations.ts
index b1d9e4444ad..f7d444eadcd 100644
--- a/packages/web-runtime/src/helpers/additionalTranslations.ts
+++ b/packages/web-runtime/src/helpers/additionalTranslations.ts
@@ -4,6 +4,10 @@ function $gettext(msg: string): string {
}
export const additionalTranslations = {
+ admin: $gettext('Admin'),
+ spaceAdmin: $gettext('Space Admin'),
+ user: $gettext('User'),
+ guest: $gettext('Guest'),
activities: $gettext('Activities'),
noActivities: $gettext('No activities'),
virusDetectedActivity: $gettext(