diff --git a/frontend/src/graphql/mutations.js b/frontend/src/graphql/mutations.js new file mode 100644 index 000000000..6fd8500c5 --- /dev/null +++ b/frontend/src/graphql/mutations.js @@ -0,0 +1,13 @@ +import gql from 'graphql-tag' + +export const subscribeNewsletter = gql` + mutation($email: String!, $language: String!) { + subscribeNewsletter(email: $email, language: $language) + } +` + +export const unsubscribeNewsletter = gql` + mutation($email: String!, $language: String!) { + unsubscribeNewsletter(email: $email, language: $language) + } +` diff --git a/frontend/src/store/store.js b/frontend/src/store/store.js index fcd877a59..c9be04527 100644 --- a/frontend/src/store/store.js +++ b/frontend/src/store/store.js @@ -39,7 +39,7 @@ export const actions = { commit('firstName', data.firstName) commit('lastName', data.lastName) commit('description', data.description) - commit('newsletterState', data.klickTipp.newsletterState) + // commit('newsletterState', data.klickTipp.newsletterState) }, logout: ({ commit, state }) => { commit('token', null) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js index 1e550204e..28b324591 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js @@ -1,5 +1,6 @@ import { mount } from '@vue/test-utils' import UserCardNewsletter from './UserCard_Newsletter' +import { unsubscribeNewsletter } from '../../../graphql/mutations' const localVue = global.localVue @@ -8,6 +9,7 @@ const mockAPIcall = jest.fn() const toastErrorMock = jest.fn() const toastSuccessMock = jest.fn() const storeCommitMock = jest.fn() +const newsletterStateMock = jest.fn().mockReturnValue(true) describe('UserCard_Newsletter', () => { let wrapper @@ -17,6 +19,8 @@ describe('UserCard_Newsletter', () => { $store: { state: { language: 'de', + email: 'peter@lustig.de', + newsletterState: newsletterStateMock, }, commit: storeCommitMock, }, @@ -25,7 +29,7 @@ describe('UserCard_Newsletter', () => { error: toastErrorMock, }, $apollo: { - query: mockAPIcall, + mutate: mockAPIcall, }, } @@ -45,5 +49,51 @@ describe('UserCard_Newsletter', () => { it('has an edit BFormCheckbox switch', () => { expect(wrapper.find('.Test-BFormCheckbox').exists()).toBeTruthy() }) + + describe('unsubscribe with sucess', () => { + beforeEach(() => { + mockAPIcall.mockResolvedValue({ + data: { + unsubscribeNewsletter: true, + }, + }) + wrapper.find('input').trigger('change') + }) + + it('calls the unsubscribe mutation', () => { + expect(mockAPIcall).toBeCalledWith({ + mutation: unsubscribeNewsletter, + variables: { + email: 'peter@lustig.de', + language: 'de', + }, + }) + }) + + it('updates the store', () => { + expect(storeCommitMock).toBeCalledWith('newsletterState', false) + }) + + it('toasts a success message', () => { + expect(toastSuccessMock).toBeCalledWith('setting.newsletterFalse') + }) + }) + + describe('unsubscribe with server error', () => { + beforeEach(() => { + mockAPIcall.mockRejectedValue({ + message: 'Ouch', + }) + wrapper.find('input').trigger('change') + }) + + it('resets the newsletterState', () => { + expect(wrapper.vm.newsletterState).toBeTruthy() + }) + + it('toasts an error message', () => { + expect(toastErrorMock).toBeCalledWith('Ouch') + }) + }) }) }) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue index bdcdee847..e96955fa1 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue @@ -14,11 +14,12 @@ - {{ NewsletterStatus ? $t('setting.newsletterTrue') : $t('setting.newsletterFalse') }} + {{ newsletterState ? $t('setting.newsletterTrue') : $t('setting.newsletterFalse') }} @@ -26,36 +27,35 @@