From 19e2436452f164a14d715e53dfa4b46a18e1d203 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 6 Dec 2021 10:59:38 +0100 Subject: [PATCH 1/5] remove verify login call --- .../components/EditCreationFormular.spec.js | 27 +------------------ admin/src/components/EditCreationFormular.vue | 12 --------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/admin/src/components/EditCreationFormular.spec.js b/admin/src/components/EditCreationFormular.spec.js index 2f29cb812..61536dab2 100644 --- a/admin/src/components/EditCreationFormular.spec.js +++ b/admin/src/components/EditCreationFormular.spec.js @@ -3,14 +3,6 @@ import EditCreationFormular from './EditCreationFormular.vue' const localVue = global.localVue -const apolloMock = jest.fn().mockResolvedValue({ - data: { - verifyLogin: { - name: 'success', - id: 0, - }, - }, -}) const apolloMutateMock = jest.fn().mockResolvedValue({ data: { updatePendingCreation: { @@ -21,6 +13,7 @@ const apolloMutateMock = jest.fn().mockResolvedValue({ }, }, }) + const stateCommitMock = jest.fn() const mocks = { @@ -35,7 +28,6 @@ const mocks = { } }), $apollo: { - query: apolloMock, mutate: apolloMutateMock, }, $store: { @@ -67,23 +59,6 @@ describe('EditCreationFormular', () => { expect(wrapper.find('.component-edit-creation-formular').exists()).toBeTruthy() }) - describe('server sends back moderator data', () => { - it('called store commit with mocked data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { name: 'success', id: 0 }) - }) - }) - - describe('server throws error for moderator data call', () => { - beforeEach(() => { - jest.clearAllMocks() - apolloMock.mockRejectedValue({ message: 'Ouch!' }) - wrapper = Wrapper() - }) - it('has called store commit with fake data', () => { - expect(stateCommitMock).toBeCalledWith('moderator', { id: 0, name: 'Test Moderator' }) - }) - }) - describe('radio buttons to selcet month', () => { it('has three radio buttons', () => { expect(wrapper.findAll('input[type="radio"]').length).toBe(3) diff --git a/admin/src/components/EditCreationFormular.vue b/admin/src/components/EditCreationFormular.vue index d3e362b5d..2b1bb566c 100644 --- a/admin/src/components/EditCreationFormular.vue +++ b/admin/src/components/EditCreationFormular.vue @@ -120,7 +120,6 @@ From a8c293d1a8ba52ae65db24c9233ab72cfe3e2724 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 6 Dec 2021 10:59:50 +0100 Subject: [PATCH 2/5] test Overview --- admin/src/pages/Overview.spec.js | 74 ++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 admin/src/pages/Overview.spec.js diff --git a/admin/src/pages/Overview.spec.js b/admin/src/pages/Overview.spec.js new file mode 100644 index 000000000..8e6ec1dbd --- /dev/null +++ b/admin/src/pages/Overview.spec.js @@ -0,0 +1,74 @@ +import { mount } from '@vue/test-utils' +import Overview from './Overview.vue' + +const localVue = global.localVue + +const apolloQueryMock = jest.fn().mockResolvedValue({ + data: { + getPendingCreations: [ + { + pending: true, + }, + { + pending: true, + }, + { + pending: true, + }, + ], + }, +}) + +const storeCommitMock = jest.fn() + +const mocks = { + $apollo: { + query: apolloQueryMock, + }, + $store: { + commit: storeCommitMock, + state: { + openCreations: 2, + }, + }, +} + +describe('Overview', () => { + let wrapper + + const Wrapper = () => { + return mount(Overview, { localVue, mocks }) + } + + describe('mount', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('calls getPendingCreations', () => { + expect(apolloQueryMock).toBeCalled() + }) + + it('commts three pending creations to store', () => { + expect(storeCommitMock).toBeCalledWith('setOpenCreations', 3) + }) + + describe('with open creations', () => { + it('renders a link to confirm creations', () => { + expect(wrapper.find('a[href="creation-confirm"]').text()).toContain('2') + expect(wrapper.find('a[href="creation-confirm"]').exists()).toBeTruthy() + }) + }) + + describe('without open creations', () => { + beforeEach(() => { + mocks.$store.state.openCreations = 0 + }) + + it('renders a link to confirm creations', () => { + expect(wrapper.find('a[href="creation-confirm"]').text()).toContain('0') + expect(wrapper.find('a[href="creation-confirm"]').exists()).toBeTruthy() + }) + }) + }) +}) From 72a45285e6b9b499f841bb46404183140d908218 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 6 Dec 2021 12:51:38 +0100 Subject: [PATCH 3/5] setup test ApolloLink --- admin/src/main.test.js | 108 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 99 insertions(+), 9 deletions(-) diff --git a/admin/src/main.test.js b/admin/src/main.test.js index bf3df3799..747ef5d2a 100644 --- a/admin/src/main.test.js +++ b/admin/src/main.test.js @@ -4,19 +4,20 @@ import CONFIG from './config' import Vue from 'vue' import VueApollo from 'vue-apollo' -import Vuex from 'vuex' -import VueI18n from 'vue-i18n' +import i18n from './i18n' import { BootstrapVue, IconsPlugin } from 'bootstrap-vue' import moment from 'vue-moment' +import store from './store/store' +import router from './router/router' jest.mock('vue') jest.mock('vue-apollo') jest.mock('vuex') jest.mock('vue-i18n') jest.mock('vue-moment') - -const storeMock = jest.fn() -Vuex.Store = storeMock +jest.mock('./store/store') +jest.mock('./i18n') +jest.mock('./router/router') jest.mock('apollo-boost', () => { return { @@ -65,8 +66,12 @@ describe('main', () => { expect(Vue).toBeCalled() }) - it('calls VueI18n', () => { - expect(VueI18n).toBeCalled() + it('calls i18n', () => { + expect(Vue).toBeCalledWith( + expect.objectContaining({ + i18n, + }), + ) }) it('calls BootstrapVue', () => { @@ -81,7 +86,92 @@ describe('main', () => { expect(Vue.use).toBeCalledWith(moment) }) - it.skip('creates a store', () => { - expect(storeMock).toBeCalled() + it('creates a store', () => { + expect(Vue).toBeCalledWith( + expect.objectContaining({ + store, + }), + ) + }) + + it('creates a router', () => { + expect(Vue).toBeCalledWith( + expect.objectContaining({ + router, + }), + ) + }) + + describe('ApolloLink', () => { + // mock store + const storeDispatchMock = jest.fn() + store.state = { + token: 'some-token', + } + store.dispatch = storeDispatchMock + + // mock i18n.t + i18n.t = jest.fn((t) => t) + + // mock apllo response + const responseMock = { + errors: [{ message: '403.13 - Client certificate revoked' }], + } + + // mock router + const routerPushMock = jest.fn() + router.push = routerPushMock + router.currentRoute = { + path: '/overview', + } + + // mock context + const setContextMock = jest.fn() + const getContextMock = jest.fn(() => { + return { + response: { + headers: { + get: jest.fn(), + }, + }, + } + }) + + // mock apollo link function params + const operationMock = { + setContext: setContextMock, + getContext: getContextMock, + } + + const forwardMock = jest.fn(() => { + return [responseMock] + }) + + // get apollo link callback + const middleware = ApolloLink.mock.calls[0][0] + + beforeEach(() => { + jest.clearAllMocks() + // run the callback with mocked params + middleware(operationMock, forwardMock) + }) + + it('sets authorization header', () => { + expect(setContextMock).toBeCalledWith({ + headers: { + Authorization: 'Bearer some-token', + }, + }) + }) + + describe('apollo response is 403.13', () => { + it.skip('dispatches logout', () => { + expect(storeDispatchMock).toBeCalledWith('logout', null) + }) + + it.skip('redirects to logout', () => { + expect(routerPushMock).toBeCalledWith('/logout') + }) + }) }) }) From b47bf3d41d317bd3e41bda48bb574ed2b41104cc Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 6 Dec 2021 13:01:36 +0100 Subject: [PATCH 4/5] Update admin/src/components/CreationFormular.vue --- admin/src/components/CreationFormular.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index 2e811da81..7fb3af514 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -251,7 +251,7 @@ export default { .then((result) => { this.$emit('update-user-data', this.item, result.data.createPendingCreation) this.$toasted.success( - `Offene schöpfung (${this.value} GDD) für ${this.item.email} wurde gespeichert, liegen zur bestätigung bereit`, + `Offene Schöpfung (${this.value} GDD) für ${this.item.email} wurde gespeichert und liegen zur Bestätigung bereit`, ) this.$store.commit('openCreationsPlus', 1) this.submitObj = null From 48b7c9a0af6270addcd73c6ebbae1c43b30902fe Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 6 Dec 2021 13:45:50 +0100 Subject: [PATCH 5/5] Delete button sends call to Adminresolver deletePendingCreation. --- admin/src/graphql/deletePendingCreation.js | 7 ++++++ admin/src/pages/CreationConfirm.vue | 23 +++++++++++++++---- backend/src/graphql/resolver/AdminResolver.ts | 5 ++-- 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 admin/src/graphql/deletePendingCreation.js diff --git a/admin/src/graphql/deletePendingCreation.js b/admin/src/graphql/deletePendingCreation.js new file mode 100644 index 000000000..e47fa6a8d --- /dev/null +++ b/admin/src/graphql/deletePendingCreation.js @@ -0,0 +1,7 @@ +import gql from 'graphql-tag' + +export const deletePendingCreation = gql` + mutation ($id: Float!) { + deletePendingCreation(id: $id) + } +` diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue index 3aef891eb..d8094ca69 100644 --- a/admin/src/pages/CreationConfirm.vue +++ b/admin/src/pages/CreationConfirm.vue @@ -12,6 +12,7 @@