mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
Write component tests, move header close to icon
This commit is contained in:
parent
7bbf870d8d
commit
18d3e36c19
168
webapp/components/DeleteAccount/DeleteAccount.spec.js
Normal file
168
webapp/components/DeleteAccount/DeleteAccount.spec.js
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
import { config, mount, createLocalVue, createWrapper } from '@vue/test-utils'
|
||||||
|
import DeleteAccount from './DeleteAccount.vue'
|
||||||
|
import Styleguide from '@human-connection/styleguide'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
|
||||||
|
const localVue = createLocalVue()
|
||||||
|
|
||||||
|
localVue.use(Vuex)
|
||||||
|
localVue.use(Styleguide)
|
||||||
|
config.stubs['b-switch'] = '<span><slot /></span>'
|
||||||
|
config.stubs['b-checkbox'] = '<span><slot /></span>'
|
||||||
|
|
||||||
|
describe('DeleteAccount.vue', () => {
|
||||||
|
let mocks
|
||||||
|
let wrapper
|
||||||
|
let getters
|
||||||
|
let actions
|
||||||
|
let deleteAccountBtn
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mocks = {
|
||||||
|
$t: jest.fn(),
|
||||||
|
$apollo: {
|
||||||
|
mutate: jest
|
||||||
|
.fn()
|
||||||
|
.mockResolvedValueOnce({
|
||||||
|
data: {
|
||||||
|
DeleteAccount: {
|
||||||
|
id: 'u343',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.mockRejectedValue({ message: 'Not authorised!' }),
|
||||||
|
},
|
||||||
|
$toast: {
|
||||||
|
error: jest.fn(),
|
||||||
|
success: jest.fn(),
|
||||||
|
},
|
||||||
|
$router: {
|
||||||
|
history: {
|
||||||
|
push: jest.fn(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
getters = {
|
||||||
|
'auth/user': () => {
|
||||||
|
return { id: 'u343' }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
actions = { 'auth/logout': jest.fn() }
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('mount', () => {
|
||||||
|
const Wrapper = () => {
|
||||||
|
const store = new Vuex.Store({
|
||||||
|
getters,
|
||||||
|
actions,
|
||||||
|
})
|
||||||
|
return mount(DeleteAccount, { mocks, localVue, store })
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = Wrapper()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('defaults to deleteContributions to false', () => {
|
||||||
|
expect(wrapper.vm.deleteContributions).toEqual(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('defaults to deleteComments to false', () => {
|
||||||
|
expect(wrapper.vm.deleteComments).toEqual(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('defaults to deleteEnabled to false', () => {
|
||||||
|
expect(wrapper.vm.deleteEnabled).toEqual(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not call the delete user mutation if deleteEnabled is false', () => {
|
||||||
|
deleteAccountBtn = wrapper.find('.ds-button-danger')
|
||||||
|
deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$apollo.mutate).not.toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('calls the delete user mutation', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper.setData({ deleteEnabled: true })
|
||||||
|
deleteAccountBtn = wrapper.find('.ds-button-danger')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('if deleteEnabled is true and only deletes user by default', () => {
|
||||||
|
deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
variables: {
|
||||||
|
id: 'u343',
|
||||||
|
resource: [],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("deletes a user's posts if requested", () => {
|
||||||
|
wrapper.setData({ deleteContributions: true })
|
||||||
|
deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
variables: {
|
||||||
|
id: 'u343',
|
||||||
|
resource: ['Post'],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("deletes a user's comments if requested", () => {
|
||||||
|
wrapper.setData({ deleteComments: true })
|
||||||
|
deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
variables: {
|
||||||
|
id: 'u343',
|
||||||
|
resource: ['Comment'],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("deletes a user's posts and comments if requested", () => {
|
||||||
|
wrapper.setData({ deleteContributions: true, deleteComments: true })
|
||||||
|
deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
variables: {
|
||||||
|
id: 'u343',
|
||||||
|
resource: ['Post', 'Comment'],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('shows a success toaster after successful mutation', async () => {
|
||||||
|
await deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$toast.success).toHaveBeenCalledTimes(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('updates the user in the store', async () => {
|
||||||
|
await deleteAccountBtn.trigger('click')
|
||||||
|
expect(mocks.$router.history.push).toHaveBeenCalledWith('/')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('error handling', () => {
|
||||||
|
it('shows an error toaster when the mutation rejects', async () => {
|
||||||
|
wrapper.setData({ deleteEnabled: true })
|
||||||
|
deleteAccountBtn = wrapper.find('.ds-button-danger')
|
||||||
|
await deleteAccountBtn.trigger('click')
|
||||||
|
// second submission causes mutation to reject
|
||||||
|
await deleteAccountBtn.trigger('click')
|
||||||
|
await mocks.$apollo.mutate
|
||||||
|
expect(mocks.$toast.error).toHaveBeenCalledWith('Not authorised!')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -2,19 +2,18 @@
|
|||||||
<div>
|
<div>
|
||||||
<ds-card hover>
|
<ds-card hover>
|
||||||
<ds-space/>
|
<ds-space/>
|
||||||
|
<ds-container>
|
||||||
<ds-flex>
|
<ds-flex>
|
||||||
<ds-flex-item width="5%" />
|
<ds-flex-item width="8%">
|
||||||
<ds-flex-item>
|
|
||||||
<ds-icon name="warning" size="xxx-large" class="delete-warning-icon"/>
|
<ds-icon name="warning" size="xxx-large" class="delete-warning-icon"/>
|
||||||
</ds-flex-item>
|
</ds-flex-item>
|
||||||
<ds-flex-item width="80%">
|
<ds-flex-item width="80%">
|
||||||
<ds-heading>{{ $t('settings.delete.name') }}</ds-heading>
|
<ds-heading>{{ $t('settings.delete.name') }}</ds-heading>
|
||||||
</ds-flex-item>
|
</ds-flex-item>
|
||||||
<ds-container>
|
|
||||||
<ds-space/>
|
<ds-space/>
|
||||||
<ds-heading tag="h4">{{ $t('settings.delete.accountDescription') }}</ds-heading>
|
<ds-heading tag="h4">{{ $t('settings.delete.accountDescription') }}</ds-heading>
|
||||||
</ds-container>
|
|
||||||
</ds-flex>
|
</ds-flex>
|
||||||
|
</ds-container>
|
||||||
<ds-space/>
|
<ds-space/>
|
||||||
<ds-container>
|
<ds-container>
|
||||||
<transition name="slide-up">
|
<transition name="slide-up">
|
||||||
@ -24,10 +23,8 @@
|
|||||||
<b-checkbox
|
<b-checkbox
|
||||||
type="is-danger"
|
type="is-danger"
|
||||||
:disabled="!currentUser.contributionsCount"
|
:disabled="!currentUser.contributionsCount"
|
||||||
v-model="formData.deleteContributions"
|
v-model="deleteContributions"
|
||||||
>
|
>{{ $t('settings.delete.countPosts', { count: currentUser.contributionsCount }) }}</b-checkbox>
|
||||||
{{ $t('settings.delete.countPosts', { count: currentUser.contributionsCount }) }}
|
|
||||||
</b-checkbox>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
@ -35,10 +32,8 @@
|
|||||||
<b-checkbox
|
<b-checkbox
|
||||||
type="is-danger"
|
type="is-danger"
|
||||||
:disabled="!currentUser.commentsCount"
|
:disabled="!currentUser.commentsCount"
|
||||||
v-model="formData.deleteComments"
|
v-model="deleteComments"
|
||||||
>
|
>{{ $t('settings.delete.countComments', { count: currentUser.commentsCount }) }}</b-checkbox>
|
||||||
{{ $t('settings.delete.countComments', { count: currentUser.commentsCount }) }}
|
|
||||||
</b-checkbox>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="message is-danger">
|
<div class="message is-danger">
|
||||||
@ -64,9 +59,7 @@
|
|||||||
danger
|
danger
|
||||||
:disabled="isLoading || !deleteEnabled"
|
:disabled="isLoading || !deleteEnabled"
|
||||||
@click="handleSubmit"
|
@click="handleSubmit"
|
||||||
>
|
>{{ $t('settings.delete.name') }}</ds-button>
|
||||||
{{ $t('settings.delete.name') }}
|
|
||||||
</ds-button>
|
|
||||||
</ds-flex-item>
|
</ds-flex-item>
|
||||||
</ds-flex>
|
</ds-flex>
|
||||||
</ds-container>
|
</ds-container>
|
||||||
@ -75,17 +68,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters, mapActions } from 'vuex'
|
||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DeleteAccount',
|
name: 'DeleteAccount',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
formData: {
|
|
||||||
deleteContributions: false,
|
deleteContributions: false,
|
||||||
deleteComments: false,
|
deleteComments: false,
|
||||||
},
|
|
||||||
deleteEnabled: false,
|
deleteEnabled: false,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
}
|
}
|
||||||
@ -96,12 +87,15 @@ export default {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
...mapActions({
|
||||||
|
logout: 'auth/logout',
|
||||||
|
}),
|
||||||
handleSubmit() {
|
handleSubmit() {
|
||||||
let resourceArgs = []
|
let resourceArgs = []
|
||||||
if (this.formData.deleteContributions) {
|
if (this.deleteContributions) {
|
||||||
resourceArgs.push('Post')
|
resourceArgs.push('Post')
|
||||||
}
|
}
|
||||||
if (this.formData.deleteComments) {
|
if (this.deleteComments) {
|
||||||
resourceArgs.push('Comment')
|
resourceArgs.push('Comment')
|
||||||
}
|
}
|
||||||
this.$apollo
|
this.$apollo
|
||||||
@ -117,8 +111,8 @@ export default {
|
|||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.$toast.success(this.$t('settings.delete.success'))
|
this.$toast.success(this.$t('settings.delete.success'))
|
||||||
this.$store.dispatch('auth/logout')
|
this.logout()
|
||||||
this.$router.replace('/')
|
this.$router.history.push('/')
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
this.$toast.error(error.message)
|
this.$toast.error(error.message)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user