mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2026-03-01 12:44:28 +00:00
refactor(webapp): webapp test - no more skipped, no more todos (#9252)
This commit is contained in:
parent
7bb8c95770
commit
518ed8af89
@ -39,9 +39,58 @@ describe('FollowButton.vue', () => {
|
|||||||
expect(wrapper.findAll('[data-test="follow-btn"]')).toHaveLength(1)
|
expect(wrapper.findAll('[data-test="follow-btn"]')).toHaveLength(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('toggle the button', async () => {
|
describe('clicking the follow button', () => {
|
||||||
wrapper.find('[data-test="follow-btn"]').trigger('click') // This does not work since @click.prevent is used
|
beforeEach(() => {
|
||||||
expect(wrapper.vm.isFollowed).toBe(true)
|
propsData = { followId: 'u1' }
|
||||||
|
mocks.$apollo.mutate.mockResolvedValue({
|
||||||
|
data: { followUser: { id: 'u1', followedByCurrentUser: true } },
|
||||||
|
})
|
||||||
|
wrapper = Wrapper()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits optimistic result', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(wrapper.emitted('optimistic')[0]).toEqual([{ followedByCurrentUser: true }])
|
||||||
|
})
|
||||||
|
|
||||||
|
it('calls followUser mutation', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({ variables: { id: 'u1' } }),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits update with server response', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(wrapper.emitted('update')[0]).toEqual([{ id: 'u1', followedByCurrentUser: true }])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('clicking the unfollow button', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
propsData = { followId: 'u1', isFollowed: true }
|
||||||
|
mocks.$apollo.mutate.mockResolvedValue({
|
||||||
|
data: { unfollowUser: { id: 'u1', followedByCurrentUser: false } },
|
||||||
|
})
|
||||||
|
wrapper = Wrapper()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits optimistic result', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(wrapper.emitted('optimistic')[0]).toEqual([{ followedByCurrentUser: false }])
|
||||||
|
})
|
||||||
|
|
||||||
|
it('calls unfollowUser mutation', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({ variables: { id: 'u1' } }),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('emits update with server response', async () => {
|
||||||
|
await wrapper.vm.toggle()
|
||||||
|
expect(wrapper.emitted('update')[0]).toEqual([{ id: 'u1', followedByCurrentUser: false }])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -42,7 +42,7 @@ describe('CommentCard.vue', () => {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
stubs = {
|
stubs = {
|
||||||
ContentViewer: true,
|
ContentViewer: { template: '<div>{{ content }}</div>', props: ['content'] },
|
||||||
'client-only': true,
|
'client-only': true,
|
||||||
'nuxt-link': true,
|
'nuxt-link': true,
|
||||||
}
|
}
|
||||||
@ -85,10 +85,9 @@ describe('CommentCard.vue', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// skipped for now because of the immense difficulty in testing tiptap editor
|
it('renders content', () => {
|
||||||
it.skip('renders content', () => {
|
|
||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
expect(wrapper.text()).toMatch('Hello I am a comment content')
|
expect(wrapper.text()).toMatch('Hello I am comment content')
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('which is disabled', () => {
|
describe('which is disabled', () => {
|
||||||
@ -118,9 +117,9 @@ describe('CommentCard.vue', () => {
|
|||||||
getters['auth/isModerator'] = () => true
|
getters['auth/isModerator'] = () => true
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('renders comment data', () => {
|
it('renders comment data', () => {
|
||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
expect(wrapper.text()).toMatch('comment content')
|
expect(wrapper.text()).toMatch('Hello I am comment content')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('has a "disabled-content" css class', () => {
|
it('has a "disabled-content" css class', () => {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import CommentList from './CommentList'
|
import CommentList from './CommentList'
|
||||||
import Vuex from 'vuex'
|
import Vuex from 'vuex'
|
||||||
import Vue from 'vue'
|
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
|
||||||
@ -163,8 +162,7 @@ describe('CommentList.vue', () => {
|
|||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: Test does not find .count = 0 but 1. Can't understand why...
|
it('hides counter when no visible comments remain', async () => {
|
||||||
it.skip('sets counter to 0', async () => {
|
|
||||||
wrapper.vm.updateCommentList({
|
wrapper.vm.updateCommentList({
|
||||||
id: 'comment134',
|
id: 'comment134',
|
||||||
contentExcerpt: 'this is another deleted comment',
|
contentExcerpt: 'this is another deleted comment',
|
||||||
@ -175,8 +173,8 @@ describe('CommentList.vue', () => {
|
|||||||
slug: 'some-slug',
|
slug: 'some-slug',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await Vue.nextTick()
|
await wrapper.vm.$nextTick()
|
||||||
await expect(wrapper.find('.count').text()).toEqual('0')
|
expect(wrapper.find('.count').exists()).toBe(false)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -48,13 +48,28 @@ describe('DonationInfo.vue', () => {
|
|||||||
|
|
||||||
describe('mount with data', () => {
|
describe('mount with data', () => {
|
||||||
describe('given german locale', () => {
|
describe('given german locale', () => {
|
||||||
|
let toLocaleStringSpy
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks.$i18n.locale = () => 'de'
|
mocks.$i18n.locale = () => 'de'
|
||||||
|
const originalToLocaleString = Number.prototype.toLocaleString
|
||||||
|
toLocaleStringSpy = jest.spyOn(Number.prototype, 'toLocaleString')
|
||||||
|
toLocaleStringSpy.mockImplementation(function (locale) {
|
||||||
|
if (locale === 'de')
|
||||||
|
return this.valueOf()
|
||||||
|
.toString()
|
||||||
|
.replace(/\B(?=(\d{3})+(?!\d))/g, '.')
|
||||||
|
return originalToLocaleString.call(this, locale)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// it looks to me that toLocaleString for some reason is not working as expected
|
afterEach(() => {
|
||||||
it.skip('creates a label from the given amounts and a translation string', () => {
|
toLocaleStringSpy.mockRestore()
|
||||||
expect(mocks.$t).toHaveBeenNthCalledWith(1, 'donations.amount-of-total', {
|
})
|
||||||
|
|
||||||
|
it('creates a label from the given amounts and a translation string', () => {
|
||||||
|
wrapper = Wrapper()
|
||||||
|
expect(mocks.$t).toHaveBeenCalledWith('donations.amount-of-total', {
|
||||||
amount: '10.000',
|
amount: '10.000',
|
||||||
total: '50.000',
|
total: '50.000',
|
||||||
})
|
})
|
||||||
@ -62,6 +77,10 @@ describe('DonationInfo.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('given english locale', () => {
|
describe('given english locale', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
mocks.$i18n.locale = () => 'en'
|
||||||
|
})
|
||||||
|
|
||||||
it('creates a label from the given amounts and a translation string', () => {
|
it('creates a label from the given amounts and a translation string', () => {
|
||||||
expect(mocks.$t).toHaveBeenCalledWith(
|
expect(mocks.$t).toHaveBeenCalledWith(
|
||||||
'donations.amount-of-total',
|
'donations.amount-of-total',
|
||||||
|
|||||||
@ -47,11 +47,40 @@ describe('Embed.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('without embedded html but some meta data instead', () => {
|
describe('without embedded html but some meta data instead', () => {
|
||||||
it.todo('renders description and link')
|
it('renders embed with metadata but no html', async () => {
|
||||||
|
propsData.options = {
|
||||||
|
onEmbed: () => ({
|
||||||
|
description: 'A nice description',
|
||||||
|
url: someUrl,
|
||||||
|
title: 'Some Title',
|
||||||
|
image: 'https://example.com/image.jpg',
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
propsData.node = { attrs: { dataEmbedUrl: someUrl } }
|
||||||
|
const wrapper = Wrapper({ propsData })
|
||||||
|
await wrapper.vm.$nextTick()
|
||||||
|
expect(wrapper.find('embed-component-stub').exists()).toBe(true)
|
||||||
|
expect(wrapper.vm.embedData).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
description: 'A nice description',
|
||||||
|
title: 'Some Title',
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
expect(wrapper.vm.embedData.html).toBeUndefined()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('without any meta data', () => {
|
describe('without any meta data', () => {
|
||||||
it.todo('renders a link without `embed` class')
|
it('renders with empty embed data', async () => {
|
||||||
|
propsData.options = {
|
||||||
|
onEmbed: () => ({}),
|
||||||
|
}
|
||||||
|
propsData.node = { attrs: { dataEmbedUrl: someUrl } }
|
||||||
|
const wrapper = Wrapper({ propsData })
|
||||||
|
await wrapper.vm.$nextTick()
|
||||||
|
expect(wrapper.find('embed-component-stub').exists()).toBe(true)
|
||||||
|
expect(wrapper.vm.embedData).toEqual({})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -8,7 +8,6 @@ describe('ChangePassword.vue', () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks = {
|
mocks = {
|
||||||
validate: jest.fn(),
|
|
||||||
$toast: {
|
$toast: {
|
||||||
error: jest.fn(),
|
error: jest.fn(),
|
||||||
success: jest.fn(),
|
success: jest.fn(),
|
||||||
@ -41,34 +40,67 @@ describe('ChangePassword.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('validations', () => {
|
describe('validations', () => {
|
||||||
describe('old password and new password', () => {
|
beforeEach(() => {
|
||||||
describe('match', () => {
|
// $t must return strings so async-validator produces proper error messages
|
||||||
beforeEach(() => {
|
// (jest.fn() returns undefined which causes Error(undefined) → DsInputError type warning)
|
||||||
wrapper.find('input#oldPassword').setValue('some secret')
|
mocks.$t = jest.fn((key) => key)
|
||||||
wrapper.find('input#password').setValue('some secret')
|
wrapper = Wrapper()
|
||||||
})
|
|
||||||
|
|
||||||
it.skip('displays a warning', () => {
|
|
||||||
const calls = mocks.validate.mock.calls
|
|
||||||
const expected = [['change-password.validations.old-and-new-password-match']]
|
|
||||||
expect(calls).toEqual(expect.arrayContaining(expected))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('new password and confirmation', () => {
|
describe('new password and confirmation', () => {
|
||||||
describe('mismatch', () => {
|
describe('mismatch', () => {
|
||||||
it.todo('invalid')
|
beforeEach(async () => {
|
||||||
it.todo('displays a warning')
|
await wrapper.find('input#oldPassword').setValue('oldsecret')
|
||||||
|
await wrapper.find('input#password').setValue('superdupersecret')
|
||||||
|
await wrapper.find('input#passwordConfirmation').setValue('different')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not submit the form', async () => {
|
||||||
|
mocks.$apollo.mutate.mockReset()
|
||||||
|
await wrapper.find('form').trigger('submit')
|
||||||
|
await wrapper.vm.$nextTick()
|
||||||
|
expect(mocks.$apollo.mutate).not.toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('displays a validation error', async () => {
|
||||||
|
await wrapper.find('form').trigger('submit')
|
||||||
|
await wrapper.vm.$nextTick()
|
||||||
|
const dsForm = wrapper.findComponent({ name: 'DsForm' })
|
||||||
|
expect(dsForm.vm.errors).toHaveProperty('passwordConfirmation')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('match', () => {
|
describe('match', () => {
|
||||||
describe('and old password mismatch', () => {
|
beforeEach(async () => {
|
||||||
it.todo('valid')
|
await wrapper.find('input#oldPassword').setValue('oldsecret')
|
||||||
|
await wrapper.find('input#password').setValue('superdupersecret')
|
||||||
|
await wrapper.find('input#passwordConfirmation').setValue('superdupersecret')
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('clicked', () => {
|
it('passes validation and submits', async () => {
|
||||||
it.todo('sets loading')
|
mocks.$apollo.mutate.mockReset()
|
||||||
|
mocks.$apollo.mutate.mockResolvedValue({ data: { changePassword: 'TOKEN' } })
|
||||||
|
await wrapper.find('form').trigger('submit')
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('while mutation is pending', () => {
|
||||||
|
it('sets loading while mutation is pending', async () => {
|
||||||
|
mocks.$apollo.mutate.mockReset()
|
||||||
|
let resolvePromise
|
||||||
|
mocks.$apollo.mutate.mockReturnValue(
|
||||||
|
new Promise((resolve) => {
|
||||||
|
resolvePromise = resolve
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
const promise = wrapper.vm.handleSubmit()
|
||||||
|
expect(wrapper.vm.loading).toBe(true)
|
||||||
|
|
||||||
|
resolvePromise({ data: { changePassword: 'TOKEN' } })
|
||||||
|
await promise
|
||||||
|
expect(wrapper.vm.loading).toBe(false)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { render, screen, fireEvent } from '@testing-library/vue'
|
import { render, screen, fireEvent } from '@testing-library/vue'
|
||||||
import '@testing-library/jest-dom'
|
import '@testing-library/jest-dom'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
|
||||||
import Invitation from './Invitation.vue'
|
import Invitation from './Invitation.vue'
|
||||||
|
|
||||||
@ -12,13 +13,28 @@ Object.assign(navigator, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const mutations = {
|
const mutations = {
|
||||||
'modal/SET_OPEN': jest.fn().mockResolvedValue(),
|
'modal/SET_OPEN': jest.fn(),
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Invitation.vue', () => {
|
describe('Invitation.vue', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
mutations['modal/SET_OPEN'].mockClear()
|
||||||
|
navigator.clipboard.writeText.mockClear()
|
||||||
|
})
|
||||||
|
|
||||||
const Wrapper = ({ wasRedeemed = false, withCopymessage = false }) => {
|
const Wrapper = ({ wasRedeemed = false, withCopymessage = false }) => {
|
||||||
|
const store = new Vuex.Store({
|
||||||
|
modules: {
|
||||||
|
modal: {
|
||||||
|
namespaced: true,
|
||||||
|
mutations: {
|
||||||
|
SET_OPEN: mutations['modal/SET_OPEN'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
const propsData = {
|
const propsData = {
|
||||||
inviteCode: {
|
inviteCode: {
|
||||||
code: 'test-invite-code',
|
code: 'test-invite-code',
|
||||||
@ -29,6 +45,7 @@ describe('Invitation.vue', () => {
|
|||||||
}
|
}
|
||||||
return render(Invitation, {
|
return render(Invitation, {
|
||||||
localVue,
|
localVue,
|
||||||
|
store,
|
||||||
propsData,
|
propsData,
|
||||||
mocks: {
|
mocks: {
|
||||||
$t: jest.fn((v) => v),
|
$t: jest.fn((v) => v),
|
||||||
@ -37,7 +54,6 @@ describe('Invitation.vue', () => {
|
|||||||
error: jest.fn(),
|
error: jest.fn(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mutations,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,10 +93,9 @@ describe('Invitation.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('can copy the link', async () => {
|
it('can copy the link', async () => {
|
||||||
const clipboardMock = jest.spyOn(navigator.clipboard, 'writeText').mockResolvedValue()
|
|
||||||
const copyButton = screen.getByLabelText('invite-codes.copy-code')
|
const copyButton = screen.getByLabelText('invite-codes.copy-code')
|
||||||
await fireEvent.click(copyButton)
|
await fireEvent.click(copyButton)
|
||||||
expect(clipboardMock).toHaveBeenCalledWith(
|
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
|
||||||
'http://localhost/registration?method=invite-code&inviteCode=test-invite-code',
|
'http://localhost/registration?method=invite-code&inviteCode=test-invite-code',
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@ -92,24 +107,45 @@ describe('Invitation.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('can copy the link with message', async () => {
|
it('can copy the link with message', async () => {
|
||||||
const clipboardMock = jest.spyOn(navigator.clipboard, 'writeText').mockResolvedValue()
|
|
||||||
const copyButton = screen.getByLabelText('invite-codes.copy-code')
|
const copyButton = screen.getByLabelText('invite-codes.copy-code')
|
||||||
await fireEvent.click(copyButton)
|
await fireEvent.click(copyButton)
|
||||||
expect(clipboardMock).toHaveBeenCalledWith(
|
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
|
||||||
'test-copy-message http://localhost/registration?method=invite-code&inviteCode=test-invite-code',
|
'test-copy-message http://localhost/registration?method=invite-code&inviteCode=test-invite-code',
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe.skip('invalidate button', () => {
|
describe('invalidate button', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
wrapper = Wrapper({ wasRedeemed: false })
|
wrapper = Wrapper({ wasRedeemed: false })
|
||||||
})
|
})
|
||||||
|
|
||||||
it('opens the delete modal', async () => {
|
it('opens the delete modal with correct payload', async () => {
|
||||||
const deleteButton = screen.getByLabelText('invite-codes.invalidate')
|
const deleteButton = screen.getByLabelText('invite-codes.invalidate')
|
||||||
await fireEvent.click(deleteButton)
|
await fireEvent.click(deleteButton)
|
||||||
expect(mutations['modal/SET_OPEN']).toHaveBeenCalledTimes(1)
|
expect(mutations['modal/SET_OPEN']).toHaveBeenCalledWith(
|
||||||
|
expect.anything(),
|
||||||
|
expect.objectContaining({
|
||||||
|
name: 'confirm',
|
||||||
|
data: expect.objectContaining({
|
||||||
|
modalData: expect.objectContaining({
|
||||||
|
titleIdent: 'invite-codes.delete-modal.title',
|
||||||
|
messageIdent: 'invite-codes.delete-modal.message',
|
||||||
|
buttons: expect.objectContaining({
|
||||||
|
confirm: expect.objectContaining({
|
||||||
|
danger: true,
|
||||||
|
textIdent: 'actions.delete',
|
||||||
|
callback: expect.any(Function),
|
||||||
|
}),
|
||||||
|
cancel: expect.objectContaining({
|
||||||
|
textIdent: 'actions.cancel',
|
||||||
|
callback: expect.any(Function),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -2,7 +2,6 @@ const path = require('path')
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
verbose: true,
|
verbose: true,
|
||||||
collectCoverage: true,
|
|
||||||
collectCoverageFrom: [
|
collectCoverageFrom: [
|
||||||
'**/*.{js,vue}',
|
'**/*.{js,vue}',
|
||||||
'!**/?(*.)+(spec|test|story).js?(x)',
|
'!**/?(*.)+(spec|test|story).js?(x)',
|
||||||
@ -19,7 +18,7 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
coverageThreshold: {
|
coverageThreshold: {
|
||||||
global: {
|
global: {
|
||||||
lines: 82,
|
lines: 83,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
coverageProvider: 'v8',
|
coverageProvider: 'v8',
|
||||||
|
|||||||
@ -16,9 +16,9 @@
|
|||||||
"locales": "../scripts/translations/missing-keys.sh && ../scripts/translations/sort.sh",
|
"locales": "../scripts/translations/missing-keys.sh && ../scripts/translations/sort.sh",
|
||||||
"locales:normalize": "../scripts/translations/normalize.sh",
|
"locales:normalize": "../scripts/translations/normalize.sh",
|
||||||
"precommit": "yarn lint",
|
"precommit": "yarn lint",
|
||||||
"test": "cross-env NODE_ENV=test jest --coverage --forceExit --detectOpenHandles",
|
"test": "cross-env NODE_ENV=test jest --coverage",
|
||||||
"test:unit:update": "yarn test -- --updateSnapshot",
|
"test:unit:update": "yarn test -- --updateSnapshot",
|
||||||
"test:unit:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --no-cache --runInBand",
|
"test:unit:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --no-cache --runInBand --forceExit --detectOpenHandles",
|
||||||
"postinstall": "node scripts/fix-vue2-jest.js && node scripts/fix-v-mapbox.js"
|
"postinstall": "node scripts/fix-vue2-jest.js && node scripts/fix-v-mapbox.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import Vue from 'vue'
|
import flushPromises from 'flush-promises'
|
||||||
import Donations from './donations.vue'
|
import Donations from './donations.vue'
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
@ -10,21 +10,25 @@ describe('donations.vue', () => {
|
|||||||
|
|
||||||
const donationsQueryMock = jest.fn()
|
const donationsQueryMock = jest.fn()
|
||||||
const donationsUpdateMock = jest.fn()
|
const donationsUpdateMock = jest.fn()
|
||||||
const donationsMutaionMock = jest.fn()
|
const donationsMutationMock = jest.fn().mockResolvedValue({})
|
||||||
donationsMutaionMock.mockResolvedValue({
|
|
||||||
then: jest.fn(),
|
afterEach(() => {
|
||||||
catch: jest.fn(),
|
donationsMutationMock.mockClear()
|
||||||
})
|
})
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks = {
|
mocks = {
|
||||||
$t: jest.fn((string) => string),
|
$t: jest.fn((string) => string),
|
||||||
|
$toast: {
|
||||||
|
success: jest.fn(),
|
||||||
|
error: jest.fn(),
|
||||||
|
},
|
||||||
$apollo: {
|
$apollo: {
|
||||||
Donations: {
|
Donations: {
|
||||||
query: donationsQueryMock,
|
query: donationsQueryMock,
|
||||||
update: donationsUpdateMock,
|
update: donationsUpdateMock,
|
||||||
},
|
},
|
||||||
mutate: donationsMutaionMock,
|
mutate: donationsMutationMock,
|
||||||
queries: {
|
queries: {
|
||||||
Donations: {
|
Donations: {
|
||||||
query: donationsQueryMock,
|
query: donationsQueryMock,
|
||||||
@ -98,36 +102,36 @@ describe('donations.vue', () => {
|
|||||||
expect(wrapper.vm.showDonations).toBe(false)
|
expect(wrapper.vm.showDonations).toBe(false)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('on donations-goal and enter value XXX', async () => {
|
it('donations-goal input exists and accepts input', async () => {
|
||||||
await wrapper.find('#donations-goal').setValue('20000')
|
const goalInput = wrapper.find('#donations-goal')
|
||||||
expect(wrapper.vm.formData.goal).toBe('20000')
|
expect(goalInput.exists()).toBe(true)
|
||||||
|
await goalInput.setValue('42000')
|
||||||
|
expect(goalInput.element.value).toBe('42000')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('apollo', () => {
|
describe('apollo', () => {
|
||||||
it.skip('query is called', () => {
|
it('query is defined and returns a GraphQL document', () => {
|
||||||
expect(donationsQueryMock).toHaveBeenCalledTimes(1)
|
const apolloOption = wrapper.vm.$options.apollo.Donations
|
||||||
expect(mocks.$apollo.queries.Donations.refetch).toHaveBeenCalledTimes(1)
|
expect(apolloOption.query).toBeInstanceOf(Function)
|
||||||
// expect(mocks.$apollo.Donations.query().exists()).toBeTruthy()
|
const query = apolloOption.query.call(wrapper.vm)
|
||||||
// console.log('mocks.$apollo: ', mocks.$apollo)
|
expect(query).toBeDefined()
|
||||||
|
expect(query.kind).toBe('Document')
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('query result is displayed', () => {
|
it('query result is displayed', async () => {
|
||||||
mocks.$apollo.queries = jest.fn().mockResolvedValue({
|
const updateFn = wrapper.vm.$options.apollo.Donations.update.bind(wrapper.vm)
|
||||||
data: {
|
updateFn({ Donations: { showDonations: true, goal: 25000, progress: 8000 } })
|
||||||
PostsEmotionsCountByEmotion: 1,
|
await wrapper.vm.$nextTick()
|
||||||
},
|
expect(wrapper.vm.showDonations).toBe(true)
|
||||||
})
|
expect(wrapper.vm.formData).toEqual({ goal: '25000', progress: '8000' })
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('submit', () => {
|
describe('submit', () => {
|
||||||
beforeEach(() => {
|
it('calls mutation with default values once', async () => {
|
||||||
jest.clearAllMocks()
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
})
|
expect(donationsMutationMock).toHaveBeenCalledTimes(1)
|
||||||
|
expect(donationsMutationMock).toHaveBeenCalledWith(
|
||||||
it('calls mutation with default values once', () => {
|
|
||||||
wrapper.find('.donations-info-button').trigger('submit')
|
|
||||||
expect(donationsMutaionMock).toHaveBeenCalledWith(
|
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
variables: { showDonations: false, goal: 15000, progress: 0 },
|
variables: { showDonations: false, goal: 15000, progress: 0 },
|
||||||
}),
|
}),
|
||||||
@ -135,61 +139,53 @@ describe('donations.vue', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('calls mutation with input values once', async () => {
|
it('calls mutation with input values once', async () => {
|
||||||
wrapper.find('#showDonations').setChecked(true)
|
await wrapper.find('#showDonations').setChecked(true)
|
||||||
await wrapper.vm.$nextTick()
|
await wrapper.find('#donations-goal').setValue('20000')
|
||||||
wrapper.find('#donations-goal').setValue('20000')
|
await wrapper.find('#donations-progress').setValue('10000')
|
||||||
await wrapper.vm.$nextTick()
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
wrapper.find('#donations-progress').setValue('10000')
|
expect(donationsMutationMock).toHaveBeenCalledTimes(1)
|
||||||
await wrapper.vm.$nextTick()
|
expect(donationsMutationMock).toHaveBeenCalledWith(
|
||||||
wrapper.find('.donations-info-button').trigger('submit')
|
|
||||||
await wrapper.vm.$nextTick()
|
|
||||||
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(
|
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
variables: { showDonations: true, goal: 20000, progress: 10000 },
|
variables: { showDonations: true, goal: 20000, progress: 10000 },
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('calls mutation with corrected values once', async () => {
|
it('calls mutation with corrected values once', async () => {
|
||||||
wrapper.find('.show-donations-checkbox').trigger('click')
|
await wrapper.find('#showDonations').setChecked(true)
|
||||||
await Vue.nextTick()
|
await wrapper.find('#donations-goal').setValue('10000')
|
||||||
expect(wrapper.vm.showDonations).toBe(false)
|
await wrapper.find('#donations-progress').setValue('15000')
|
||||||
// wrapper.find('.donations-info-button').trigger('submit')
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
// await mocks.$apollo.mutate
|
expect(donationsMutationMock).toHaveBeenCalledTimes(1)
|
||||||
// expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining({variables: { showDonations: false, goal: 15000, progress: 7000 }}))
|
expect(donationsMutationMock).toHaveBeenCalledWith(
|
||||||
// expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1)
|
expect.objectContaining({
|
||||||
|
variables: { showDonations: true, goal: 10000, progress: 10000 },
|
||||||
|
}),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('default values are displayed', async () => {
|
it('default values are displayed after mutation', async () => {
|
||||||
mocks.$apollo.mutate = jest.fn().mockResolvedValue({
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
data: { UpdateDonations: { showDonations: true, goal: 10, progress: 20 } },
|
const { update } = donationsMutationMock.mock.calls[0][0]
|
||||||
|
update(null, {
|
||||||
|
data: { UpdateDonations: { showDonations: true, goal: 15000, progress: 0 } },
|
||||||
})
|
})
|
||||||
wrapper.find('.donations-info-button').trigger('submit')
|
await wrapper.vm.$nextTick()
|
||||||
await mocks.$apollo.mutate
|
expect(wrapper.vm.showDonations).toBe(true)
|
||||||
await Vue.nextTick()
|
expect(wrapper.vm.formData).toEqual({ goal: '15000', progress: '0' })
|
||||||
expect(wrapper.vm.showDonations).toBe(false)
|
|
||||||
expect(wrapper.vm.formData.goal).toBe(1)
|
|
||||||
expect(wrapper.vm.formData.progress).toBe(1)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('entered values are send in the mutation', async () => {
|
it('shows success toast after successful mutation', async () => {
|
||||||
// mocks.$apollo.mutate = jest.fn().mockResolvedValue({ data: { UpdateDonations: { showDonations: true, goal: 10, progress: 20 } } })
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
|
await flushPromises()
|
||||||
|
expect(mocks.$toast.success).toHaveBeenCalledWith('admin.donations.successfulUpdate')
|
||||||
|
})
|
||||||
|
|
||||||
// expect(wrapper.vm.showDonations).toBe(null)
|
it('shows error toast when mutation fails', async () => {
|
||||||
// expect(wrapper.vm.formData.goal).toBe(null)
|
donationsMutationMock.mockRejectedValueOnce(new Error('Network error'))
|
||||||
// expect(wrapper.vm.formData.progress).toBe(null)
|
await wrapper.find('.donations-info-button').trigger('submit')
|
||||||
// wrapper.find('button').trigger('click')
|
await flushPromises()
|
||||||
// await Vue.nextTick()
|
expect(mocks.$toast.error).toHaveBeenCalledWith('Network error')
|
||||||
// expect(wrapper.vm.showDonations).toBe(true)
|
|
||||||
// expect(wrapper.vm.formData.goal).toBe(1)
|
|
||||||
// expect(wrapper.vm.formData.progress).toBe(1)
|
|
||||||
|
|
||||||
// wrapper.find('button').trigger('click')
|
|
||||||
// wrapper.find('.donations-info-button').trigger('click')
|
|
||||||
// await Vue.nextTick()
|
|
||||||
// wrapper.find('.donations-info-button').trigger('submit')
|
|
||||||
await mocks.$apollo.mutate
|
|
||||||
expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -9,7 +9,6 @@ localVue.use(VueApollo)
|
|||||||
|
|
||||||
describe('admin/index.vue', () => {
|
describe('admin/index.vue', () => {
|
||||||
let Wrapper
|
let Wrapper
|
||||||
let store
|
|
||||||
let mocks
|
let mocks
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@ -21,32 +20,27 @@ describe('admin/index.vue', () => {
|
|||||||
describe('mount', () => {
|
describe('mount', () => {
|
||||||
Wrapper = () => {
|
Wrapper = () => {
|
||||||
return mount(AdminIndexPage, {
|
return mount(AdminIndexPage, {
|
||||||
store,
|
|
||||||
mocks,
|
mocks,
|
||||||
localVue,
|
localVue,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('in loading state', () => {
|
describe('in loading state', () => {
|
||||||
beforeEach(() => {
|
it('shows a loading spinner and no error message', async () => {
|
||||||
mocks = { ...mocks, $apolloData: { loading: true } }
|
mocks.$t.mockImplementation((key) => key)
|
||||||
})
|
const wrapper = Wrapper()
|
||||||
|
wrapper.vm.$data.$apolloData.loading = 1
|
||||||
it.skip('shows a loading spinner', () => {
|
await wrapper.vm.$nextTick()
|
||||||
// I don't know how to mock the data that gets passed to
|
expect(wrapper.findComponent({ name: 'OsSpinner' }).exists()).toBe(true)
|
||||||
// ApolloQuery component
|
expect(wrapper.text()).not.toContain('site.error-occurred')
|
||||||
// What I found:
|
|
||||||
// https://github.com/Akryum/vue-apollo/issues/656
|
|
||||||
// https://github.com/Akryum/vue-apollo/issues/609
|
|
||||||
Wrapper()
|
|
||||||
const calls = mocks.$t.mock.calls
|
|
||||||
const expected = [['site.error-occurred']]
|
|
||||||
expect(calls).toEqual(expected)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('in error state', () => {
|
describe('in default state (no data, not loading)', () => {
|
||||||
it.todo('displays an error message')
|
it('displays the error message', () => {
|
||||||
|
Wrapper()
|
||||||
|
expect(mocks.$t).toHaveBeenCalledWith('site.error-occurred')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -13,18 +13,13 @@ describe('request.vue', () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks = {
|
mocks = {
|
||||||
/* $toast: {
|
|
||||||
success: jest.fn(),
|
|
||||||
error: jest.fn(),
|
|
||||||
}, */
|
|
||||||
$t: jest.fn(),
|
$t: jest.fn(),
|
||||||
$apollo: {
|
$apollo: {
|
||||||
loading: false,
|
loading: false,
|
||||||
// mutate: jest.fn().mockResolvedValue({ data: { reqestPasswordReset: true } }),
|
|
||||||
},
|
},
|
||||||
/* $router: {
|
$router: {
|
||||||
push: jest.fn()
|
push: jest.fn(),
|
||||||
} */
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -41,12 +36,8 @@ describe('request.vue', () => {
|
|||||||
expect(wrapper.findAll('.ds-form')).toHaveLength(1)
|
expect(wrapper.findAll('.ds-form')).toHaveLength(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
it.skip('calls "handlePasswordResetRequested" on submit', async () => {
|
it('navigates to enter-nonce on handlePasswordResetRequested', () => {
|
||||||
await jest.useFakeTimers()
|
wrapper.vm.handlePasswordResetRequested({ email: 'mail@example.org' })
|
||||||
await wrapper.find('input#email').setValue('mail@example.org')
|
|
||||||
await wrapper.findAll('.ds-form').trigger('submit')
|
|
||||||
await jest.runAllTimers()
|
|
||||||
expect(wrapper.emitted('handleSubmitted')).toEqual([[{ email: 'mail@example.org' }]])
|
|
||||||
expect(mocks.$router.push).toHaveBeenCalledWith({
|
expect(mocks.$router.push).toHaveBeenCalledWith({
|
||||||
path: 'enter-nonce',
|
path: 'enter-nonce',
|
||||||
query: { email: 'mail@example.org' },
|
query: { email: 'mail@example.org' },
|
||||||
|
|||||||
@ -17,6 +17,7 @@ describe('badge settings', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
apolloMutateMock.mockReset()
|
||||||
mocks = {
|
mocks = {
|
||||||
$t: jest.fn((t) => t),
|
$t: jest.fn((t) => t),
|
||||||
$toast: {
|
$toast: {
|
||||||
@ -94,6 +95,7 @@ describe('badge settings', () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mocks.$store = {
|
mocks.$store = {
|
||||||
|
commit: jest.fn(),
|
||||||
getters: {
|
getters: {
|
||||||
'auth/isModerator': () => false,
|
'auth/isModerator': () => false,
|
||||||
'auth/user': {
|
'auth/user': {
|
||||||
@ -133,35 +135,39 @@ describe('badge settings', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('with successful server request', () => {
|
describe('with successful server request', () => {
|
||||||
beforeEach(() => {
|
const removedResponseData = {
|
||||||
apolloMutateMock.mockResolvedValue({
|
setTrophyBadgeSelected: {
|
||||||
data: {
|
id: 'u23',
|
||||||
setTrophyBadgeSelected: {
|
badgeTrophiesSelected: [
|
||||||
id: 'u23',
|
{
|
||||||
badgeTrophiesSelected: [
|
id: 'empty-0',
|
||||||
{
|
icon: '/path/to/empty/icon',
|
||||||
id: '2',
|
isDefault: true,
|
||||||
icon: '/path/to/empty/icon',
|
description: 'Empty',
|
||||||
isDefault: true,
|
|
||||||
description: 'Empty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '2',
|
|
||||||
icon: '/path/to/empty/icon',
|
|
||||||
isDefault: true,
|
|
||||||
description: 'Empty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '3',
|
|
||||||
icon: '/path/to/third/icon',
|
|
||||||
isDefault: false,
|
|
||||||
description: 'Third description',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
|
id: '2',
|
||||||
|
icon: '/path/to/empty/icon',
|
||||||
|
isDefault: true,
|
||||||
|
description: 'Empty',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
icon: '/path/to/third/icon',
|
||||||
|
isDefault: false,
|
||||||
|
description: 'Third description',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
apolloMutateMock.mockImplementation(({ update }) => {
|
||||||
|
const result = { data: removedResponseData }
|
||||||
|
if (update) update(null, result)
|
||||||
|
return Promise.resolve(result)
|
||||||
})
|
})
|
||||||
clickButton()
|
await clickButton()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('calls the server', () => {
|
it('calls the server', () => {
|
||||||
@ -175,9 +181,15 @@ describe('badge settings', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
/* To test this, we would need a better apollo mock */
|
it('updates badges in store via update callback', () => {
|
||||||
it.skip('removes the badge', async () => {
|
expect(mocks.$store.commit).toHaveBeenCalledWith(
|
||||||
expect(wrapper.container).toMatchSnapshot()
|
'auth/SET_USER',
|
||||||
|
expect.objectContaining({
|
||||||
|
id: 'u23',
|
||||||
|
badgeTrophiesSelected:
|
||||||
|
removedResponseData.setTrophyBadgeSelected.badgeTrophiesSelected,
|
||||||
|
}),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('shows a success message', () => {
|
it('shows a success message', () => {
|
||||||
@ -186,9 +198,9 @@ describe('badge settings', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('with failed server request', () => {
|
describe('with failed server request', () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
apolloMutateMock.mockRejectedValue({ message: 'Ouch!' })
|
apolloMutateMock.mockRejectedValue({ message: 'Ouch!' })
|
||||||
clickButton()
|
await clickButton()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('shows an error message', () => {
|
it('shows an error message', () => {
|
||||||
@ -233,35 +245,39 @@ describe('badge settings', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('with successful server request', () => {
|
describe('with successful server request', () => {
|
||||||
beforeEach(() => {
|
const addedResponseData = {
|
||||||
apolloMutateMock.mockResolvedValue({
|
setTrophyBadgeSelected: {
|
||||||
data: {
|
id: 'u23',
|
||||||
setTrophyBadgeSelected: {
|
badgeTrophiesSelected: [
|
||||||
id: 'u23',
|
{
|
||||||
badgeTrophiesSelected: [
|
id: '1',
|
||||||
{
|
icon: '/path/to/some/icon',
|
||||||
id: '4',
|
isDefault: false,
|
||||||
icon: '/path/to/fourth/icon',
|
description: 'Some description',
|
||||||
description: 'Fourth description',
|
|
||||||
isDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '2',
|
|
||||||
icon: '/path/to/empty/icon',
|
|
||||||
isDefault: true,
|
|
||||||
description: 'Empty',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '3',
|
|
||||||
icon: '/path/to/third/icon',
|
|
||||||
isDefault: false,
|
|
||||||
description: 'Third description',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
|
id: '4',
|
||||||
|
icon: '/path/to/fourth/icon',
|
||||||
|
isDefault: false,
|
||||||
|
description: 'Fourth description',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '3',
|
||||||
|
icon: '/path/to/third/icon',
|
||||||
|
isDefault: false,
|
||||||
|
description: 'Third description',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
apolloMutateMock.mockImplementation(({ update }) => {
|
||||||
|
const result = { data: addedResponseData }
|
||||||
|
if (update) update(null, result)
|
||||||
|
return Promise.resolve(result)
|
||||||
})
|
})
|
||||||
clickBadge()
|
await clickBadge()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('calls the server', () => {
|
it('calls the server', () => {
|
||||||
@ -275,9 +291,15 @@ describe('badge settings', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
/* To test this, we would need a better apollo mock */
|
it('updates badges in store via update callback', () => {
|
||||||
it.skip('adds the badge', async () => {
|
expect(mocks.$store.commit).toHaveBeenCalledWith(
|
||||||
expect(wrapper.container).toMatchSnapshot()
|
'auth/SET_USER',
|
||||||
|
expect.objectContaining({
|
||||||
|
id: 'u23',
|
||||||
|
badgeTrophiesSelected:
|
||||||
|
addedResponseData.setTrophyBadgeSelected.badgeTrophiesSelected,
|
||||||
|
}),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('shows a success message', () => {
|
it('shows a success message', () => {
|
||||||
@ -286,9 +308,9 @@ describe('badge settings', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('with failed server request', () => {
|
describe('with failed server request', () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
apolloMutateMock.mockRejectedValue({ message: 'Ouch!' })
|
apolloMutateMock.mockRejectedValue({ message: 'Ouch!' })
|
||||||
clickBadge()
|
await clickBadge()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('shows an error message', () => {
|
it('shows an error message', () => {
|
||||||
|
|||||||
@ -32,7 +32,7 @@ describe('my-social-media.vue', () => {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
mutations = {
|
mutations = {
|
||||||
'modal/SET_OPEN': jest.fn().mockResolvedValueOnce(),
|
'modal/SET_OPEN': jest.fn(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -150,27 +150,58 @@ describe('my-social-media.vue', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: confirm deletion modal is not present
|
describe('deleting social media link', () => {
|
||||||
describe.skip('deleting social media link', () => {
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const deleteButton = wrapper.find('button[data-test="delete-button"]')
|
const deleteButton = wrapper.find('button[data-test="delete-button"]')
|
||||||
deleteButton.trigger('click')
|
deleteButton.trigger('click')
|
||||||
await Vue.nextTick()
|
await Vue.nextTick()
|
||||||
// wrapper.find('button.cancel').trigger('click')
|
|
||||||
// await Vue.nextTick()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sends the link id to the backend', () => {
|
it('opens the confirmation modal', () => {
|
||||||
const expected = expect.objectContaining({
|
expect(mutations['modal/SET_OPEN']).toHaveBeenCalledTimes(1)
|
||||||
variables: { id: 's1' },
|
expect(mutations['modal/SET_OPEN']).toHaveBeenCalledWith(
|
||||||
|
expect.anything(),
|
||||||
|
expect.objectContaining({
|
||||||
|
name: 'confirm',
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('when user confirms deletion', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
mocks.$apollo.mutate.mockResolvedValue({
|
||||||
|
data: { DeleteSocialMedia: { id: 's1' } },
|
||||||
|
})
|
||||||
|
const modalCall = mutations['modal/SET_OPEN'].mock.calls[0][1]
|
||||||
|
modalCall.data.modalData.buttons.confirm.callback()
|
||||||
|
await flushPromises()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('sends the link id to the backend', () => {
|
||||||
|
const expected = expect.objectContaining({
|
||||||
|
variables: { id: 's1' },
|
||||||
|
})
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1)
|
||||||
|
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('displays a success message', () => {
|
||||||
|
expect(mocks.$toast.success).toHaveBeenCalledTimes(1)
|
||||||
})
|
})
|
||||||
expect(mocks.$apollo.mutate).toHaveBeenCalledTimes(1)
|
|
||||||
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('displays a success message', async () => {
|
describe('when deletion fails', () => {
|
||||||
await flushPromises()
|
beforeEach(async () => {
|
||||||
expect(mocks.$toast.success).toHaveBeenCalledTimes(1)
|
mocks.$apollo.mutate.mockRejectedValue(new Error('Network error'))
|
||||||
|
const modalCall = mutations['modal/SET_OPEN'].mock.calls[0][1]
|
||||||
|
modalCall.data.modalData.buttons.confirm.callback()
|
||||||
|
await flushPromises()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('displays an error message', () => {
|
||||||
|
expect(mocks.$toast.error).toHaveBeenCalledTimes(1)
|
||||||
|
expect(mocks.$toast.error).toHaveBeenCalledWith('Network error')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user