Merge branch 'master' into 1393-have-an-delete-button-for-the-search-input

This commit is contained in:
Alexander Friedland 2022-02-04 18:29:22 +01:00 committed by GitHub
commit 09fc84c1ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 219 additions and 211 deletions

View File

@ -448,7 +448,7 @@ jobs:
report_name: Coverage Admin Interface report_name: Coverage Admin Interface
type: lcov type: lcov
result_path: ./coverage/lcov.info result_path: ./coverage/lcov.info
min_coverage: 91 min_coverage: 93
token: ${{ github.token }} token: ${{ github.token }}
############################################################################## ##############################################################################

View File

@ -11,22 +11,36 @@ describe('UserTable', () => {
const defaultItemsUser = [ const defaultItemsUser = [
{ {
email: 'bibi@bloxberg.de', userId: 1,
firstName: 'Bibi', firstName: 'Bibi',
lastName: 'Bloxberg', lastName: 'Bloxberg',
creation: [1000, 1000, 1000], email: 'bibi@bloxberg.de',
creation: [200, 400, 600],
emailChecked: true,
}, },
{ {
email: 'bibi@bloxberg.de', userId: 2,
firstName: 'Bibi', firstName: 'Benjamin',
lastName: 'Bloxberg', lastName: 'Blümchen',
email: 'benjamin@bluemchen.de',
creation: [1000, 1000, 1000], creation: [1000, 1000, 1000],
emailChecked: true,
}, },
{ {
email: 'bibi@bloxberg.de', userId: 3,
firstName: 'Bibi', firstName: 'Peter',
lastName: 'Bloxberg', lastName: 'Lustig',
email: 'peter@lustig.de',
creation: [0, 0, 0],
emailChecked: true,
},
{
userId: 4,
firstName: 'New',
lastName: 'User',
email: 'new@user.ch',
creation: [1000, 1000, 1000], creation: [1000, 1000, 1000],
emailChecked: false,
}, },
] ]
@ -107,7 +121,7 @@ describe('UserTable', () => {
const mocks = { const mocks = {
$t: jest.fn((t) => t), $t: jest.fn((t) => t),
$d: jest.fn((d) => d), $d: jest.fn((d) => String(d)),
$apollo: { $apollo: {
query: apolloQueryMock, query: apolloQueryMock,
}, },
@ -122,7 +136,7 @@ describe('UserTable', () => {
describe('mount', () => { describe('mount', () => {
describe('type PageUserSearch', () => { describe('type PageUserSearch', () => {
beforeEach(() => { beforeEach(async () => {
wrapper = Wrapper(propsDataPageUserSearch) wrapper = Wrapper(propsDataPageUserSearch)
}) })
@ -175,12 +189,12 @@ describe('UserTable', () => {
}) })
describe('content', () => { describe('content', () => {
it('has 3 rows', () => { it('has 4 rows', () => {
expect(wrapper.findAll('tbody tr').length).toBe(3) expect(wrapper.findAll('tbody tr')).toHaveLength(4)
}) })
it('has 7 columns', () => { it('has 7 columns', () => {
expect(wrapper.findAll('tr:nth-child(1) > td').length).toBe(7) expect(wrapper.findAll('tr:nth-child(1) > td')).toHaveLength(7)
}) })
it('find button on fifth column', () => { it('find button on fifth column', () => {
@ -189,6 +203,110 @@ describe('UserTable', () => {
).toBeTruthy() ).toBeTruthy()
}) })
}) })
describe('row toggling', () => {
describe('user with email not activated', () => {
it('has no details button', () => {
expect(
wrapper.findAll('tbody > tr').at(3).findAll('td').at(4).find('button').exists(),
).toBeFalsy()
})
it('has a red confirmed button with envelope item', () => {
const row = wrapper.findAll('tbody > tr').at(3)
expect(row.findAll('td').at(5).find('button').exists()).toBeTruthy()
expect(row.findAll('td').at(5).find('button').classes('btn-danger')).toBeTruthy()
expect(row.findAll('td').at(5).find('svg').classes('bi-envelope')).toBeTruthy()
})
describe('click on envelope', () => {
beforeEach(async () => {
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
})
it('opens the details', async () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
expect(wrapper.findAll('tbody > tr').at(5).find('input').element.value).toBe(
'new@user.ch',
)
expect(wrapper.findAll('tbody > tr').at(5).text()).toContain(
'unregister_mail.text_false',
)
// HACK: for some reason we need to close the row details after this test
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
})
describe('click on envelope again', () => {
beforeEach(async () => {
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
})
it('closes the details', () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(4)
})
})
describe('click on close details', () => {
beforeEach(async () => {
await wrapper.findAll('tbody > tr').at(5).findAll('button').at(1).trigger('click')
})
it('closes the details', () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(4)
})
})
})
})
describe('different details', () => {
it.skip('shows the creation formular for second user', async () => {
await wrapper
.findAll('tbody > tr')
.at(1)
.findAll('td')
.at(4)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
expect(
wrapper
.findAll('tbody > tr')
.at(3)
.find('div.component-creation-formular')
.exists(),
).toBeTruthy()
})
it.skip('shows the transactions for third user', async () => {
await wrapper
.findAll('tbody > tr')
.at(4)
.findAll('td')
.at(6)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
})
})
})
}) })
}) })

View File

@ -133,7 +133,7 @@
variant="danger" variant="danger"
v-show="type === 'UserListMassCreation' || type === 'PageCreationConfirm'" v-show="type === 'UserListMassCreation' || type === 'PageCreationConfirm'"
size="md" size="md"
@click="overlayShow('remove', row.item)" @click="bookmarkRemove(row.item)"
class="mr-2" class="mr-2"
> >
<b-icon icon="x" variant="light"></b-icon> <b-icon icon="x" variant="light"></b-icon>
@ -242,13 +242,6 @@ export default {
this.overlayBookmarkType = bookmarkType this.overlayBookmarkType = bookmarkType
this.overlayItem = item this.overlayItem = item
if (bookmarkType === 'remove') {
this.overlayText.header = this.$t('overlay.remove.title')
this.overlayText.text1 = this.$t('overlay.remove.text')
this.overlayText.text2 = this.$t('overlay.remove.question')
this.overlayText.button_ok = this.$t('overlay.remove.yes')
this.overlayText.button_cancel = this.$t('overlay.remove.no')
}
if (bookmarkType === 'confirm') { if (bookmarkType === 'confirm') {
this.overlayText.header = this.$t('overlay.confirm.title') this.overlayText.header = this.$t('overlay.confirm.title')
this.overlayText.text1 = this.$t('overlay.confirm.text') this.overlayText.text1 = this.$t('overlay.confirm.text')
@ -258,9 +251,6 @@ export default {
} }
}, },
overlayOK(bookmarkType, item) { overlayOK(bookmarkType, item) {
if (bookmarkType === 'remove') {
this.bookmarkRemove(item)
}
if (bookmarkType === 'confirm') { if (bookmarkType === 'confirm') {
this.$emit('confirm-creation', item) this.$emit('confirm-creation', item)
} }

View File

@ -54,6 +54,7 @@
} }
}, },
"remove": "Entfernen", "remove": "Entfernen",
"remove_all": "alle Nutzer entfernen",
"transaction": "Transaktion", "transaction": "Transaktion",
"transactionlist": { "transactionlist": {
"amount": "Betrag", "amount": "Betrag",

View File

@ -54,6 +54,7 @@
} }
}, },
"remove": "Remove", "remove": "Remove",
"remove_all": "Remove all users",
"transaction": "Transaction", "transaction": "Transaction",
"transactionlist": { "transactionlist": {
"amount": "Amount", "amount": "Amount",

View File

@ -154,55 +154,16 @@ describe('Creation', () => {
}, },
]) ])
}) })
})
describe('remove item', () => { describe('remove item', () => {
beforeEach(async () => {
await wrapper
.findAll('table')
.at(0)
.findAll('tbody > tr')
.at(1)
.find('button')
.trigger('click')
await wrapper
.findAll('table')
.at(1)
.findAll('tbody > tr')
.at(0)
.find('button')
.trigger('click')
})
it('opens a dialog', () => {
expect(wrapper.findAll('#overlay').at(1).isVisible()).toBeTruthy()
})
describe('cancel remove item', () => {
beforeEach(async () => { beforeEach(async () => {
await wrapper.findAll('#overlay').at(1).findAll('button').at(0).trigger('click') await wrapper
}) .findAll('table')
.at(1)
it('closes the dialog', () => { .findAll('tbody > tr')
expect(wrapper.findAll('#overlay').at(1).isVisible()).toBeFalsy() .at(0)
}) .find('button')
.trigger('click')
it('has one item in left table', () => {
expect(wrapper.findAll('table').at(0).findAll('tbody > tr')).toHaveLength(1)
})
it('has one item in right table', () => {
expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(1)
})
})
describe('confirm remove item', () => {
beforeEach(async () => {
await wrapper.findAll('#overlay').at(1).findAll('button').at(1).trigger('click')
})
it('closes the dialog', () => {
expect(wrapper.findAll('#overlay').at(1).isVisible()).toBeFalsy()
}) })
it('has two items in left table', () => { it('has two items in left table', () => {
@ -223,32 +184,24 @@ describe('Creation', () => {
expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', []) expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', [])
}) })
}) })
})
// this can only happen after API call in CreationForm describe('remove all bookmarks', () => {
describe('remove all bookmarks', () => { beforeEach(async () => {
beforeEach(async () => { jest.clearAllMocks()
await wrapper await wrapper.find('button.btn-light').trigger('click')
.findAll('table') })
.at(0)
.findAll('tbody > tr')
.at(1)
.find('button')
.trigger('click')
jest.clearAllMocks()
wrapper.findComponent({ name: 'CreationFormular' }).vm.$emit('remove-all-bookmark')
})
it('has no items in right table', () => { it('has no items in right table', () => {
expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(0) expect(wrapper.findAll('table').at(1).findAll('tbody > tr')).toHaveLength(0)
}) })
it('commits empty array to userSelectedInMassCreation', () => { it('commits empty array to userSelectedInMassCreation', () => {
expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', []) expect(storeCommitMock).toBeCalledWith('setUserSelectedInMassCreation', [])
}) })
it('calls searchUsers', () => { it('calls searchUsers', () => {
expect(apolloQueryMock).toBeCalled() expect(apolloQueryMock).toBeCalled()
})
}) })
}) })

View File

@ -33,14 +33,22 @@
></b-pagination> ></b-pagination>
</b-col> </b-col>
<b-col cols="12" lg="6" class="shadow p-3 mb-5 rounded bg-info"> <b-col cols="12" lg="6" class="shadow p-3 mb-5 rounded bg-info">
<user-table <div v-show="itemsMassCreation.length > 0">
v-show="itemsMassCreation.length > 0" <div class="text-right pr-4 mb-1">
class="shadow p-3 mb-5 bg-white rounded" <b-button @click="removeAllBookmarks()" variant="light">
type="UserListMassCreation" <b-icon icon="x" scale="2" variant="danger"></b-icon>
:itemsUser="itemsMassCreation"
:fieldsTable="fields" {{ $t('remove_all') }}
@remove-item="removeItem" </b-button>
/> </div>
<user-table
class="shadow p-3 mb-5 bg-white rounded"
type="UserListMassCreation"
:itemsUser="itemsMassCreation"
:fieldsTable="fields"
@remove-item="removeItem"
/>
</div>
<div v-if="itemsMassCreation.length === 0"> <div v-if="itemsMassCreation.length === 0">
{{ $t('multiple_creation_text') }} {{ $t('multiple_creation_text') }}
</div> </div>
@ -49,7 +57,7 @@
type="massCreation" type="massCreation"
:creation="creation" :creation="creation"
:items="itemsMassCreation" :items="itemsMassCreation"
@remove-all-bookmark="removeAllBookmark" @remove-all-bookmark="removeAllBookmarks"
/> />
</b-col> </b-col>
</b-row> </b-row>
@ -131,7 +139,7 @@ export default {
) )
this.$store.commit('setUserSelectedInMassCreation', this.itemsMassCreation) this.$store.commit('setUserSelectedInMassCreation', this.itemsMassCreation)
}, },
removeAllBookmark() { removeAllBookmarks() {
this.itemsMassCreation = [] this.itemsMassCreation = []
this.$store.commit('setUserSelectedInMassCreation', []) this.$store.commit('setUserSelectedInMassCreation', [])
this.getUsers() this.getUsers()

View File

@ -78,6 +78,7 @@ describe('CreationConfirm', () => {
it('commits resetOpenCreations to store', () => { it('commits resetOpenCreations to store', () => {
expect(storeCommitMock).toBeCalledWith('resetOpenCreations') expect(storeCommitMock).toBeCalledWith('resetOpenCreations')
}) })
it('commits setOpenCreations to store', () => { it('commits setOpenCreations to store', () => {
expect(storeCommitMock).toBeCalledWith('setOpenCreations', 2) expect(storeCommitMock).toBeCalledWith('setOpenCreations', 2)
}) })
@ -85,7 +86,7 @@ describe('CreationConfirm', () => {
describe('remove creation with success', () => { describe('remove creation with success', () => {
beforeEach(async () => { beforeEach(async () => {
await wrapper.findComponent({ name: 'UserTable' }).vm.$emit('remove-creation', { id: 1 }) await wrapper.findAll('tr').at(1).findAll('button').at(0).trigger('click')
}) })
it('calls the deletePendingCreation mutation', () => { it('calls the deletePendingCreation mutation', () => {
@ -107,7 +108,7 @@ describe('CreationConfirm', () => {
describe('remove creation with error', () => { describe('remove creation with error', () => {
beforeEach(async () => { beforeEach(async () => {
apolloMutateMock.mockRejectedValue({ message: 'Ouchhh!' }) apolloMutateMock.mockRejectedValue({ message: 'Ouchhh!' })
await wrapper.findComponent({ name: 'UserTable' }).vm.$emit('remove-creation', { id: 1 }) await wrapper.findAll('tr').at(1).findAll('button').at(0).trigger('click')
}) })
it('toasts an error message', () => { it('toasts an error message', () => {
@ -118,22 +119,52 @@ describe('CreationConfirm', () => {
describe('confirm creation with success', () => { describe('confirm creation with success', () => {
beforeEach(async () => { beforeEach(async () => {
apolloMutateMock.mockResolvedValue({}) apolloMutateMock.mockResolvedValue({})
await wrapper.findComponent({ name: 'UserTable' }).vm.$emit('confirm-creation', { id: 2 }) await wrapper.findAll('tr').at(2).findAll('button').at(2).trigger('click')
}) })
it('calls the confirmPendingCreation mutation', () => { describe('overlay', () => {
expect(apolloMutateMock).toBeCalledWith({ it('opens the overlay', () => {
mutation: confirmPendingCreation, expect(wrapper.find('#overlay').isVisible()).toBeTruthy()
variables: { id: 2 },
}) })
})
it('commits openCreationsMinus to store', () => { describe('cancel confirmation', () => {
expect(storeCommitMock).toBeCalledWith('openCreationsMinus', 1) beforeEach(async () => {
}) await wrapper.find('#overlay').findAll('button').at(0).trigger('click')
})
it('toasts a success message', () => { it('closes the overlay', () => {
expect(toastedSuccessMock).toBeCalledWith('creation_form.toasted_created') expect(wrapper.find('#overlay').isVisible()).toBeFalsy()
})
it('still has 2 items in the table', () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(2)
})
})
describe('confirm creation', () => {
beforeEach(async () => {
await wrapper.find('#overlay').findAll('button').at(1).trigger('click')
})
it('calls the confirmPendingCreation mutation', () => {
expect(apolloMutateMock).toBeCalledWith({
mutation: confirmPendingCreation,
variables: { id: 2 },
})
})
it('commits openCreationsMinus to store', () => {
expect(storeCommitMock).toBeCalledWith('openCreationsMinus', 1)
})
it('toasts a success message', () => {
expect(toastedSuccessMock).toBeCalledWith('creation_form.toasted_created')
})
it('has 1 item left in the table', () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(1)
})
})
}) })
}) })

View File

@ -88,100 +88,6 @@ describe('UserSearch', () => {
) )
}) })
describe('row toggling', () => {
it('has 4 users in the table', () => {
expect(wrapper.findAll('tbody > tr')).toHaveLength(4)
})
describe('user with email not activated', () => {
it('has no details button', () => {
expect(
wrapper.findAll('tbody > tr').at(3).findAll('td').at(4).find('button').exists(),
).toBeFalsy()
})
it('has a red confirmed button with envelope item', () => {
const row = wrapper.findAll('tbody > tr').at(3)
expect(row.findAll('td').at(5).find('button').exists()).toBeTruthy()
expect(row.findAll('td').at(5).find('button').classes('btn-danger')).toBeTruthy()
expect(row.findAll('td').at(5).find('svg').classes('bi-envelope')).toBeTruthy()
})
describe('click on envelope', () => {
it('opens the details', async () => {
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
expect(wrapper.findAll('tbody > tr').at(5).find('input').element.value).toBe(
'new@user.ch',
)
expect(wrapper.findAll('tbody > tr').at(5).text()).toContain(
'unregister_mail.text_false',
)
})
describe('click on envelope again', () => {
it('closes the details', async () => {
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(4)
})
})
describe('click on close details', () => {
it('closes the details', async () => {
await wrapper
.findAll('tbody > tr')
.at(3)
.findAll('td')
.at(5)
.find('button')
.trigger('click')
await wrapper.findAll('tbody > tr').at(5).findAll('button').at(1).trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(4)
})
})
})
})
describe('different details', () => {
it.skip('shows the creation formular for second user', async () => {
await wrapper
.findAll('tbody > tr')
.at(1)
.findAll('td')
.at(4)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
expect(
wrapper.findAll('tbody > tr').at(3).find('div.component-creation-formular').exists(),
).toBeTruthy()
})
it.skip('shows the transactions for third user', async () => {
await wrapper
.findAll('tbody > tr')
.at(4)
.findAll('td')
.at(6)
.find('button')
.trigger('click')
expect(wrapper.findAll('tbody > tr')).toHaveLength(6)
})
})
})
describe('unconfirmed emails', () => { describe('unconfirmed emails', () => {
beforeEach(async () => { beforeEach(async () => {
await wrapper.find('button.btn-block').trigger('click') await wrapper.find('button.btn-block').trigger('click')