diff --git a/webapp/graphql/admin/Roles.js b/webapp/graphql/admin/Roles.js
index 22e0b8fff..531961656 100644
--- a/webapp/graphql/admin/Roles.js
+++ b/webapp/graphql/admin/Roles.js
@@ -1,15 +1,17 @@
import gql from 'graphql-tag'
-export const FetchAllRoles = gql`
- query {
- __type(name: "UserGroup") {
- name
- enumValues {
+export const FetchAllRoles = () => {
+ return gql`
+ query {
+ __type(name: "UserGroup") {
name
+ enumValues {
+ name
+ }
}
}
- }
-`
+ `
+}
export const updateUserRole = (role, id) => {
return gql`
diff --git a/webapp/pages/admin/users.spec.js b/webapp/pages/admin/users.spec.js
index 37d155b92..459ffaa28 100644
--- a/webapp/pages/admin/users.spec.js
+++ b/webapp/pages/admin/users.spec.js
@@ -1,27 +1,57 @@
-import { mount } from '@vue/test-utils'
+import { config, mount } from '@vue/test-utils'
+import Vuex from 'vuex'
import Users from './users.vue'
const localVue = global.localVue
+config.stubs['nuxt-link'] = ''
describe('Users', () => {
let wrapper
let Wrapper
let mocks
+ let getters
beforeEach(() => {
mocks = {
$t: jest.fn(),
$apollo: {
loading: false,
+ mutate: jest
+ .fn()
+ .mockRejectedValue({ message: 'Ouch!' })
+ .mockResolvedValue({
+ data: {
+ switchUserRole: {
+ id: 'user',
+ email: 'user@example.org',
+ name: 'User',
+ role: 'moderator',
+ slug: 'user',
+ },
+ },
+ }),
+ },
+ $toast: {
+ error: jest.fn(),
+ success: jest.fn(),
},
}
})
describe('mount', () => {
+ getters = {
+ 'auth/isAdmin': () => true,
+ 'auth/user': () => {
+ return { id: 'admin' }
+ },
+ }
+
Wrapper = () => {
+ const store = new Vuex.Store({ getters })
return mount(Users, {
mocks,
localVue,
+ store,
})
}
@@ -69,5 +99,55 @@ describe('Users', () => {
})
})
})
+
+ describe('change roles', () => {
+ beforeAll(() => {
+ wrapper = Wrapper()
+ wrapper.setData({
+ User: [
+ {
+ id: 'admin',
+ email: 'admin@example.org',
+ name: 'Admin',
+ role: 'admin',
+ slug: 'admin',
+ },
+ {
+ id: 'user',
+ email: 'user@example.org',
+ name: 'User',
+ role: 'user',
+ slug: 'user',
+ },
+ ],
+ userRoles: ['user', 'moderator', 'admin'],
+ })
+ })
+
+ it('cannot change own role', () => {
+ const adminRow = wrapper.findAll('tr').at(1)
+ expect(adminRow.find('select').exists()).toBe(false)
+ })
+
+ it('changes the role of another user', async () => {
+ jest.useFakeTimers()
+
+ // console.log(wrapper.html())
+
+ const userRow = wrapper.findAll('tr').at(2)
+ await userRow.findAll('option').at(2).setSelected()
+
+ jest.runAllTimers()
+
+ await wrapper.vm.$nextTick()
+ await wrapper.vm.$nextTick()
+ await wrapper.vm.$nextTick()
+ await wrapper.vm.$nextTick()
+
+ await mocks.$apollo.mutate
+ // await expect(mocks.$apollo.mutate).toHaveBeenCalled()
+ await expect(mocks.$toast.success).toHaveBeenCalled()
+ })
+ })
})
})
diff --git a/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue
index 17562cf7f..e8b4cfdf5 100644
--- a/webapp/pages/admin/users.vue
+++ b/webapp/pages/admin/users.vue
@@ -50,22 +50,18 @@
-
-
-
-
- {{ scope.row.role }}
-
-
-
+
+
+ {{ scope.row.role }}
+
@@ -98,7 +94,7 @@ export default {
hasNext: false,
email: null,
filter: null,
- FetchAllRoles,
+ userRoles: [],
form: {
formData: {
query: '',
@@ -178,6 +174,14 @@ export default {
return User.map((u, i) => Object.assign({}, u, { index: this.offset + i }))
},
},
+ userRoles: {
+ query() {
+ return FetchAllRoles()
+ },
+ update({ __type }) {
+ return __type.enumValues.map((item) => item.name)
+ },
+ },
},
methods: {
back() {
@@ -203,7 +207,7 @@ export default {
const newRole = event.target.value
this.$apollo
.mutate({
- mutation: updateUserRole(newRole, id),
+ mutation: updateUserRole(),
variables: { role: newRole, id },
})
.then(({ data }) => {