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 @@