diff --git a/src/api/__mocks__/users.js b/src/api/__mocks__/users.js index 1133c705c33282bf8f0760a3aa42808fd6f9a28c..b21cac338d4c2b952f1b778fb294910e59c7870d 100644 --- a/src/api/__mocks__/users.js +++ b/src/api/__mocks__/users.js @@ -1,7 +1,8 @@ export let users = [ - { active: true, deactivated: false, id: '2', nickname: 'allis', local: true, external: false, roles: { admin: true, moderator: false }, tags: [] }, - { active: true, deactivated: false, id: '10', nickname: 'bob', local: false, external: true, roles: { admin: false, moderator: false }, tags: ['mrf_tag:sandbox'] }, - { active: false, deactivated: true, id: 'abc', nickname: 'john', local: true, external: false, roles: { admin: false, moderator: false }, tags: ['mrf_tag:media-strip'] } + { active: true, approval_pending: false, deactivated: false, id: '2', nickname: 'allis', local: true, external: false, roles: { admin: true, moderator: false }, tags: [] }, + { active: true, approval_pending: false, deactivated: false, id: '10', nickname: 'bob', local: false, external: true, roles: { admin: false, moderator: false }, tags: ['mrf_tag:sandbox'] }, + { active: false, approval_pending: false, deactivated: true, id: 'abc', nickname: 'john', local: true, external: false, roles: { admin: false, moderator: false }, tags: ['mrf_tag:media-strip'] }, + { active: true, approval_pending: true, deactivated: false, id: '100', nickname: 'sally', local: true, external: false, roles: { admin: false, moderator: false }, tags: [] } ] const userProfile = { avatar: 'avatar.jpg', nickname: 'allis', id: '2', tags: [], roles: { admin: true, moderator: false }, local: true, external: false } @@ -85,6 +86,14 @@ export async function deactivateUsers(nicknames, authHost, token) { return Promise.resolve({ data: response }) } +export async function approveUserAccount(nicknames, authHost, token) { + const response = nicknames.map(nickname => { + const currentUser = users.find(user => user.nickname === nickname) + return { ...currentUser, approval_pending: false } + }) + return Promise.resolve({ data: response }) +} + export async function deleteRight(nickname, right, authHost, token) { return Promise.resolve({ data: { [`is_${right}`]: false } diff --git a/src/api/users.js b/src/api/users.js index b62df5d73573b94f6e469e10ef0b430f0da1ddfe..71028fd7b6fc138f3c1b0a49d08a0cc686fe96c4 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -166,6 +166,16 @@ export async function fetchUserStatuses(id, authHost, godmode, token) { }) } +export async function approveUserAccount(nicknames, authHost, token) { + return await request({ + baseURL: baseName(authHost), + url: '/api/pleroma/admin/users/approve', + method: 'patch', + headers: authHeaders(token), + data: { nicknames } + }) +} + export async function confirmUserEmail(nicknames, authHost, token) { return await request({ baseURL: baseName(authHost), diff --git a/src/lang/en.js b/src/lang/en.js index 478a5cc7767218ba7482ebac1964b7e1196b98b8..d86a3a1eab87926ab9ce69ee95dd4e64542b224e 100644 --- a/src/lang/en.js +++ b/src/lang/en.js @@ -191,6 +191,7 @@ export default { external: 'External', deactivated: 'Deactivated', active: 'Active', + unapproved: 'Pending', unconfirmed: 'Unconfirmed', actions: 'Actions', activate: 'Activate', @@ -233,6 +234,8 @@ export default { addTagForMultipleUsersConfirmation: 'Are you sure you want to apply tag to all selected users?', removeTagFromMultipleUsersConfirmation: 'Are you sure you want to remove tag from all selected users?', requirePasswordResetConfirmation: 'Are you sure you want to require password reset for all selected users?', + approveAccountsConfirmation: 'Are you sure you want to approve accounts for all selected users?', + rejectAccountsConfirmation: 'Are you sure you want to reject accounts for all selected users?', confirmAccountsConfirmation: 'Are you sure you want to confirm emails for all selected users?', resendEmailConfirmation: 'Are you sure you want to resend confirmation email for all selected users?', mailerMustBeEnabled: 'To require user\'s password reset you must enable mailer.', @@ -253,9 +256,14 @@ export default { getPasswordResetToken: 'Get password reset token', passwordResetTokenCreated: 'Password reset token was created', accountCreated: 'New account was created!', + approveAccount: 'Approve account', + approveAccounts: 'Approve accounts', + unapprovedAccount: 'User account is pending approval', unconfirmedEmail: 'User didn\'t confirm the email', confirmAccount: 'Confirm account', confirmAccounts: 'Confirm accounts', + rejectAccount: 'Reject account', + rejectAccounts: 'Reject accounts', resendConfirmation: 'Resend confirmation email', invalidAccount: 'This account has invalid nickname and can\'t be modified', invalidNickname: 'invalid nickname', @@ -287,7 +295,9 @@ export default { roles: 'Roles', active: 'Active', status: 'Status', + reason: 'Registration Reason', deactivated: 'Deactivated', + pending: 'Pending', noStatuses: 'No statuses to show', openAccountInInstance: 'Open account in instance', securitySettings: { @@ -313,6 +323,7 @@ export default { external: 'External', byStatus: 'By status', active: 'Active', + pending: 'Pending', deactivated: 'Deactivated' }, reports: { diff --git a/src/store/modules/users.js b/src/store/modules/users.js index 4db8042f600eec15a2e70f087377f98f8fd2c538..ccfc10b3b0df7aeb677c6aaf205210daa9baff97 100644 --- a/src/store/modules/users.js +++ b/src/store/modules/users.js @@ -14,6 +14,7 @@ import { tagUser, untagUser, forcePasswordReset, + approveUserAccount, confirmUserEmail, resendConfirmationEmail } from '@/api/users' @@ -30,6 +31,7 @@ const users = { local: false, external: false, active: false, + needApproval: false, deactivated: false }, passwordResetToken: { @@ -126,7 +128,7 @@ const users = { }, ClearUsersState({ commit }) { commit('SET_SEARCH_QUERY', '') - commit('SET_USERS_FILTERS', { local: false, external: false, active: false, deactivated: false }) + commit('SET_USERS_FILTERS', { local: false, external: false, active: false, needApproval: false, deactivated: false }) }, async ClearFilters({ commit, dispatch, state }) { commit('CLEAR_USERS_FILTERS') @@ -159,6 +161,15 @@ const users = { } dispatch('SuccessMessage') }, + async ApproveUsersAccount({ dispatch, getters }, { users, _userId, _statusId }) { + const updatedUsers = users.map(user => { + return { ...user, approval_pending: false } + }) + const nicknames = users.map(user => user.nickname) + const callApiFn = async() => await approveUserAccount(nicknames, getters.authHost, getters.token) + + dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId }) + }, async ConfirmUsersEmail({ dispatch, getters }, { users, _userId, _statusId }) { const updatedUsers = users.map(user => { return { ...user, confirmation_pending: false } @@ -260,6 +271,7 @@ const users = { local: false, external: false, active: false, + needApproval: false, deactivated: false } const currentFilters = { ...defaultFilters, ...filters } diff --git a/src/views/users/components/ModerationDropdown.vue b/src/views/users/components/ModerationDropdown.vue index 8b800c466bbabe12461b97027de35e9dab5f06a2..b8312b4c8740aad85d93fd55f85a951beaed18ed 100644 --- a/src/views/users/components/ModerationDropdown.vue +++ b/src/views/users/components/ModerationDropdown.vue @@ -37,6 +37,17 @@ @click.native="handleDeletion(user)"> {{ $t('users.deleteAccount') }} </el-dropdown-item> + <el-dropdown-item + v-if="user.local && user.approval_pending" + divided + @click.native="handleAccountApproval(user)"> + {{ $t('users.approveAccount') }} + </el-dropdown-item> + <el-dropdown-item + v-if="user.local && user.approval_pending" + @click.native="handleAccountRejection(user)"> + {{ $t('users.rejectAccount') }} + </el-dropdown-item> <el-dropdown-item v-if="user.local && user.confirmation_pending" divided @@ -158,6 +169,25 @@ export default { }) }) }, + handleAccountApproval(user) { + this.$store.dispatch('ApproveUsersAccount', { users: [user], _userId: user.id, _statusId: this.statusId }) + }, + handleAccountRejection(user) { + this.$confirm( + this.$t('users.deleteUsersConfirmation'), + { + confirmButtonText: 'Delete', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + this.$store.dispatch('DeleteUsers', { users: [user], _userId: user.id }) + }).catch(() => { + this.$message({ + type: 'info', + message: 'Delete canceled' + }) + }) + }, handleEmailConfirmation(user) { this.$store.dispatch('ConfirmUsersEmail', { users: [user], _userId: user.id, _statusId: this.statusId }) }, diff --git a/src/views/users/components/MultipleUsersMenu.vue b/src/views/users/components/MultipleUsersMenu.vue index a192b8a85439faf66930cdda6cd572b7a0d35f21..652436a50d9456eb260fdb6d03a3ffb2ac27ab0a 100644 --- a/src/views/users/components/MultipleUsersMenu.vue +++ b/src/views/users/components/MultipleUsersMenu.vue @@ -26,6 +26,15 @@ @click.native="revokeRightFromMultipleUsers('moderator')"> {{ $t('users.revokeModerator') }} </el-dropdown-item> + <el-dropdown-item + divided + @click.native="approveAccountsForMultipleUsers"> + {{ $t('users.approveAccounts') }} + </el-dropdown-item> + <el-dropdown-item + @click.native="rejectAccountsForMultipleUsers"> + {{ $t('users.rejectAccounts') }} + </el-dropdown-item> <el-dropdown-item divided @click.native="confirmAccountsForMultipleUsers"> @@ -219,6 +228,12 @@ export default { applyAction(filtered, requirePasswordResetFn) }, + approveAccounts: () => { + const filtered = this.selectedUsers.filter(user => this.isLocalUser(user) && user.approval_pending) + const approveAccountFn = async(users) => await this.$store.dispatch('ApproveUsersAccount', { users }) + + applyAction(filtered, approveAccountFn) + }, confirmAccounts: () => { const filtered = this.selectedUsers.filter(user => this.isLocalUser(user) && user.confirmation_pending) const confirmAccountFn = async(users) => await this.$store.dispatch('ConfirmUsersEmail', { users }) @@ -300,6 +315,20 @@ export default { removeTag(tag) ) }, + approveAccountsForMultipleUsers() { + const { approveAccounts } = this.mappers() + this.confirmMessage( + this.$t('users.approveAccountsConfirmation'), + approveAccounts + ) + }, + rejectAccountsForMultipleUsers() { + const { remove } = this.mappers() + this.confirmMessage( + this.$t('users.deleteMultipleUsersConfirmation'), + remove + ) + }, confirmAccountsForMultipleUsers() { const { confirmAccounts } = this.mappers() this.confirmMessage( diff --git a/src/views/users/components/UsersFilter.vue b/src/views/users/components/UsersFilter.vue index 01bd384e23f8f7b5bfc9f09f69a1d0cb1c007e97..424b7071687b470c9eca1f1454ca94d51c348741 100644 --- a/src/views/users/components/UsersFilter.vue +++ b/src/views/users/components/UsersFilter.vue @@ -7,12 +7,13 @@ class="select-field" @change="toggleFilters"> <el-option-group :label="$t('usersFilter.byAccountType')"> - <el-option value="local">{{ $t('usersFilter.local') }}</el-option> - <el-option value="external">{{ $t('usersFilter.external') }}</el-option> + <el-option value="local" label="Local">{{ $t('usersFilter.local') }}</el-option> + <el-option value="external" label="External">{{ $t('usersFilter.external') }}</el-option> </el-option-group> <el-option-group :label="$t('usersFilter.byStatus')"> - <el-option value="active">{{ $t('usersFilter.active') }}</el-option> - <el-option value="deactivated">{{ $t('usersFilter.deactivated') }}</el-option> + <el-option value="active" label="Active">{{ $t('usersFilter.active') }}</el-option> + <el-option value="needApproval" label="Need Approval">{{ $t('usersFilter.pending') }}</el-option> + <el-option value="deactivated" label="Deactivated">{{ $t('usersFilter.deactivated') }}</el-option> </el-option-group> </el-select> </template> diff --git a/src/views/users/index.vue b/src/views/users/index.vue index c8ea487b3fd2897983ac58e5764d173f7529c990..3831ba80d1331a602592eb229dbe7d4d0ec8c2e4 100644 --- a/src/views/users/index.vue +++ b/src/views/users/index.vue @@ -71,7 +71,16 @@ {{ isDesktop ? $t('users.unconfirmed') : getFirstLetter($t('users.unconfirmed')) }} </el-tag> </el-tooltip> + <el-tooltip :content="$t('users.unapprovedAccount')" effect="dark"> + <el-tag v-if="scope.row.approval_pending" type="info"> + {{ isDesktop ? $t('users.unapproved') : getFirstLetter($t('users.unapproved')) }} + </el-tag> + </el-tooltip> + <div v-if="pendingView && isDesktop" class="reason-text"> + "{{ scope.row.registration_reason | truncate(100, '...') }}" + </div> </template> + </el-table-column> <el-table-column :label="$t('users.actions')" fixed="right"> <template slot-scope="scope"> @@ -123,6 +132,15 @@ export default { ResetPasswordDialog, UsersFilter }, + filters: { + truncate: function(text, length, suffix) { + if (text.length > length) { + return text.substring(0, length) + suffix + } else { + return text + } + } + }, data() { return { search: '', @@ -156,6 +174,9 @@ export default { usersCount() { return this.$store.state.users.totalUsersCount }, + pendingView() { + return this.$store.state.users.filters['needApproval'] + }, width() { return this.isMobile ? 55 : false } @@ -298,6 +319,9 @@ export default { color: gray; font-size: 28px; } + .reason-text { + word-break: normal; + } } @media only screen and (max-width:480px) { diff --git a/src/views/users/show.vue b/src/views/users/show.vue index c77c710c7a2eef3ac0b63fe49e65c193dff4b651..88e18d3a1c37970710325cf6cc829fbf4dd98de3 100644 --- a/src/views/users/show.vue +++ b/src/views/users/show.vue @@ -79,12 +79,17 @@ <tr class="el-table__row"> <td>{{ $t('userProfile.status') }}</td> <td> - <el-tag v-if="!user.deactivated" type="success">{{ $t('userProfile.active') }}</el-tag> + <el-tag v-if="user.approval_pending" type="info">{{ $t('userProfile.pending') }}</el-tag> + <el-tag v-if="!user.deactivated & !user.approval_pending" type="success">{{ $t('userProfile.active') }}</el-tag> <el-tag v-if="user.deactivated" type="danger">{{ $t('userProfile.deactivated') }}</el-tag> </td> </tr> </tbody> </table> + <div v-if="user.registration_reason"> + <div class="reason-label">{{ $t('userProfile.reason') }}</div> + "{{ user.registration_reason }}" + </div> </div> <el-button v-if="propertyExists(user, 'nickname')" icon="el-icon-lock" class="security-setting-button" @click="securitySettingsModalVisible = true"> {{ $t('userProfile.securitySettings.securitySettings') }} @@ -304,6 +309,7 @@ table { .user-profile-card { margin: 0 20px; width: 30%; + min-width: 300px; height: fit-content; } .user-profile-container { @@ -316,6 +322,11 @@ table { .user-profile-tag { margin: 0 4px 4px 0; } +.reason-label { + color: #878d99; + font-weight: bold; + margin: 5px 0; +} @media only screen and (max-width:480px) { .avatar-name-container { diff --git a/test/views/users/index.test.js b/test/views/users/index.test.js index 6afd901b326b28841d6881f90ae13ee0892a1149..78ce7f06d6b03ab2d84f16383d3bae56e1577dd3 100644 --- a/test/views/users/index.test.js +++ b/test/views/users/index.test.js @@ -34,7 +34,7 @@ describe('Search and filter users', () => { }) await flushPromises() - expect(wrapper.vm.usersCount).toEqual(3) + expect(wrapper.vm.usersCount).toEqual(4) done() }) @@ -51,7 +51,7 @@ describe('Search and filter users', () => { } await flushPromises() - expect(wrapper.vm.usersCount).toEqual(3) + expect(wrapper.vm.usersCount).toEqual(4) const input = wrapper.find('.search input.el-input__inner') input.element.value = 'bob' input.trigger('input') @@ -61,7 +61,7 @@ describe('Search and filter users', () => { input.element.value = '' input.trigger('input') await flushPromises() - expect(wrapper.vm.usersCount).toEqual(3) + expect(wrapper.vm.usersCount).toEqual(4) done() }) @@ -304,7 +304,7 @@ describe('Creates new account', () => { stubs: ['router-link'] }) await flushPromises() - expect(wrapper.vm.usersCount).toEqual(3) + expect(wrapper.vm.usersCount).toEqual(4) const openDialogButton = wrapper.find('button.actions-button') openDialogButton.trigger('click') @@ -326,7 +326,7 @@ describe('Creates new account', () => { createButton.trigger('click') await flushPromises() - expect(wrapper.vm.usersCount).toEqual(4) + expect(wrapper.vm.usersCount).toEqual(5) done() }) diff --git a/test/views/users/multipleUsersMenu.test.js b/test/views/users/multipleUsersMenu.test.js index 1408ea56c8590fad1066e559ad6e84d37cf104c7..3cfe53baaf810b16dbb31e8df7807e83b8ea9d2d 100644 --- a/test/views/users/multipleUsersMenu.test.js +++ b/test/views/users/multipleUsersMenu.test.js @@ -163,7 +163,7 @@ describe('Apply users actions to multiple users', () => { const activateMultipleUsersStub = jest.fn() wrapper.setMethods({ activateMultipleUsers: activateMultipleUsersStub }) - wrapper.find(`.el-dropdown-menu__item:nth-child(7)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(9)`).trigger('click') expect(wrapper.vm.activateMultipleUsers).toHaveBeenCalled() const activate = wrapper.vm.mappers().activate @@ -190,7 +190,7 @@ describe('Apply users actions to multiple users', () => { const deactivateMultipleUsersStub = jest.fn() wrapper.setMethods({ deactivateMultipleUsers: deactivateMultipleUsersStub }) - wrapper.find(`.el-dropdown-menu__item:nth-child(8)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(10)`).trigger('click') expect(wrapper.vm.deactivateMultipleUsers).toHaveBeenCalled() const deactivate = wrapper.vm.mappers().deactivate @@ -221,7 +221,7 @@ describe('Apply users actions to multiple users', () => { const deleteMultipleUsersStub = jest.fn() wrapper.setMethods({ deleteMultipleUsers: deleteMultipleUsersStub }) - wrapper.find(`.el-dropdown-menu__item:nth-child(9)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(11)`).trigger('click') expect(wrapper.vm.deleteMultipleUsers).toHaveBeenCalled() const remove = wrapper.vm.mappers().remove @@ -229,7 +229,7 @@ describe('Apply users actions to multiple users', () => { remove() await flushPromises() - expect(store.state.users.fetchedUsers.length).toEqual(3) + expect(store.state.users.fetchedUsers.length).toEqual(4) done() }) @@ -247,15 +247,15 @@ describe('Apply users actions to multiple users', () => { const addTagForMultipleUsersStub = jest.fn() wrapper.setMethods({ addTagForMultipleUsers: addTagForMultipleUsersStub }) - wrapper.find(`.el-dropdown-menu__item:nth-child(11) button:nth-child(1)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(13) button:nth-child(1)`).trigger('click') expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalledWith('mrf_tag:media-force-nsfw') - wrapper.find(`.el-dropdown-menu__item:nth-child(13) button:nth-child(1)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(15) button:nth-child(1)`).trigger('click') expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalledWith('mrf_tag:force-unlisted') - wrapper.find(`.el-dropdown-menu__item:nth-child(15 ) button:nth-child(1)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(17) button:nth-child(1)`).trigger('click') expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.addTagForMultipleUsers).toHaveBeenCalledWith('mrf_tag:disable-remote-subscription') @@ -287,15 +287,15 @@ describe('Apply users actions to multiple users', () => { const removeTagFromMultipleUsersStub = jest.fn() wrapper.setMethods({ removeTagFromMultipleUsers: removeTagFromMultipleUsersStub }) - wrapper.find(`.el-dropdown-menu__item:nth-child(12) button:nth-child(2)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(14) button:nth-child(2)`).trigger('click') expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalledWith('mrf_tag:media-strip') - wrapper.find(`.el-dropdown-menu__item:nth-child(14) button:nth-child(2)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(16) button:nth-child(2)`).trigger('click') expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalledWith('mrf_tag:sandbox') - wrapper.find(`.el-dropdown-menu__item:nth-child(16) button:nth-child(2)`).trigger('click') + wrapper.find(`.el-dropdown-menu__item:nth-child(18) button:nth-child(2)`).trigger('click') expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalled() expect(wrapper.vm.removeTagFromMultipleUsers).toHaveBeenCalledWith('mrf_tag:disable-any-subscription') @@ -312,4 +312,35 @@ describe('Apply users actions to multiple users', () => { expect(updatedUser2.tags.length).toBe(0) done() }) + + it('approves multiple accounts', async (done) => { + const wrapper = mount(MultipleUsersMenu, { + store, + localVue, + sync: false, + propsData: { + selectedUsers: users + } + }) + await flushPromises() + + const approveAccountsForMultipleUsersStub = jest.fn() + wrapper.setMethods({ approveAccountsForMultipleUsers: approveAccountsForMultipleUsersStub }) + + wrapper.find(`.el-dropdown-menu__item:nth-child(5)`).trigger('click') + expect(wrapper.vm.approveAccountsForMultipleUsers).toHaveBeenCalled() + + const approveAccounts = wrapper.vm.mappers().approveAccounts + const user1 = store.state.users.fetchedUsers[0] + const user2 = store.state.users.fetchedUsers[3] + expect(user1.approval_pending).toBe(false) + expect(user2.approval_pending).toBe(true) + approveAccounts() + + const updatedUser1 = store.state.users.fetchedUsers[0] + const updatedUser2 = store.state.users.fetchedUsers[3] + expect(updatedUser1.approval_pending).toBe(false) + expect(updatedUser2.approval_pending).toBe(false) + done() + }) }) diff --git a/test/views/users/usersFilters.test.js b/test/views/users/usersFilters.test.js index e56822ca5a6f1e1840abc38c6a4595a54b713b51..db3c1a4b4af3feb3a7e03144e2cc80ffb7776245 100644 --- a/test/views/users/usersFilters.test.js +++ b/test/views/users/usersFilters.test.js @@ -31,18 +31,18 @@ describe('Filters users', () => { localVue }) - expect(store.state.users.totalUsersCount).toEqual(3) + expect(store.state.users.totalUsersCount).toEqual(4) const filter = wrapper.find(`li.el-select-dropdown__item:nth-child(${1})`) filter.trigger('click') await flushPromises() - expect(store.state.users.totalUsersCount).toEqual(2) + expect(store.state.users.totalUsersCount).toEqual(3) done() }) it('shows users with applied filter and search query', async (done) => { - expect(store.state.users.totalUsersCount).toEqual(3) + expect(store.state.users.totalUsersCount).toEqual(4) store.dispatch('ToggleUsersFilter', { active: true }) await flushPromises() @@ -56,17 +56,17 @@ describe('Filters users', () => { store.dispatch('SearchUsers', { query: '', page: 1 }) await flushPromises() - expect(store.state.users.totalUsersCount).toEqual(2) + expect(store.state.users.totalUsersCount).toEqual(3) done() }) it('applies two filters', async (done) => { - expect(store.state.users.totalUsersCount).toEqual(3) + expect(store.state.users.totalUsersCount).toEqual(4) store.dispatch('ToggleUsersFilter', { active: true, local: true }) await flushPromises() - expect(store.state.users.totalUsersCount).toEqual(1) + expect(store.state.users.totalUsersCount).toEqual(2) expect(store.state.users.fetchedUsers[0].nickname).toEqual('allis') store.dispatch('ToggleUsersFilter', { deactivated: true, external: true }) @@ -77,7 +77,7 @@ describe('Filters users', () => { }) it('shows all users after removing filters', async (done) => { - expect(store.state.users.totalUsersCount).toEqual(3) + expect(store.state.users.totalUsersCount).toEqual(4) store.dispatch('ToggleUsersFilter', { deactivated: true }) await flushPromises() @@ -85,7 +85,7 @@ describe('Filters users', () => { store.dispatch('ToggleUsersFilter', {}) await flushPromises() - expect(store.state.users.totalUsersCount).toEqual(3) + expect(store.state.users.totalUsersCount).toEqual(4) done() })