diff options
-rw-r--r-- | src/components/ShareItem.vue | 27 | ||||
-rw-r--r-- | tests/javascript/unit/components/ShareItem.spec.ts | 75 | ||||
-rw-r--r-- | tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts | 4 | ||||
-rw-r--r-- | tests/javascript/unit/services/share.service.spec.ts | 46 |
4 files changed, 146 insertions, 6 deletions
diff --git a/src/components/ShareItem.vue b/src/components/ShareItem.vue index c7898330c..195f129be 100644 --- a/src/components/ShareItem.vue +++ b/src/components/ShareItem.vue @@ -56,6 +56,11 @@ import NcLoadingIcon from '@nextcloud/vue/dist/Components/NcLoadingIcon.js' import { ShareService } from '../dataservices/share.service' +type ShareUser = { + shareName: string; + displayName: string; +} + export default Vue.extend({ components: { NcModal, @@ -75,14 +80,25 @@ export default Vue.extend({ users: [], selected: [], searching: false, - } as any + } as { + userName: string; + users: ShareUser[]; + selected: ShareUser[]; + searching: boolean; + debounceSearchUsers?: () => void; + } }, created() { this.debounceSearchUsers = _.debounce(this.searchUsers, 800) }, methods: { - clickUser(user: any) { - const selectedUsers = this.selected.map((val: any) => { return val.shareName }) + /** + * Adds or removes user to selected list + * + * @param user {ShareUser} user that was clicked + */ + clickUser(user: ShareUser) { + const selectedUsers = this.selected.map((val: ShareUser) => { return val.shareName }) if (selectedUsers.includes(user.shareName)) { this.selected.splice(selectedUsers.indexOf(user.shareName), 1) } else { @@ -90,6 +106,9 @@ export default Vue.extend({ } }, + /** + * Searches for Users based on user input to display for sharing + */ async searchUsers() { this.users = [] this.searching = true @@ -105,7 +124,7 @@ export default Vue.extend({ * Shares an item with another use in the same nextcloud instance */ async share() { - await ShareService.share(this.itemId, this.selected.map((val: any) => { return val.shareName })) + await ShareService.share(this.itemId, this.selected.map((val: ShareUser) => { return val.shareName })) this.$emit('close') }, diff --git a/tests/javascript/unit/components/ShareItem.spec.ts b/tests/javascript/unit/components/ShareItem.spec.ts new file mode 100644 index 000000000..f61c9e82b --- /dev/null +++ b/tests/javascript/unit/components/ShareItem.spec.ts @@ -0,0 +1,75 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils' +import ShareItem from '../../../../src/components/ShareItem.vue' +import { ShareService } from '../../../../src/dataservices/share.service' + +describe('AddFeed.vue', () => { + 'use strict' + + let wrapper: any + beforeEach(() => { + const localVue = createLocalVue() + wrapper = shallowMount(ShareItem, { + localVue, + propsData: { + itemId: 123, + }, + }) + }) + + describe('clickUser()', () => { + it('should add to selected if user not selected before', () => { + wrapper.vm.selected = [] + + wrapper.vm.clickUser({ displayName: 'display', shareName: 'share' }) + + expect(wrapper.vm.selected.length).toEqual(1) + }) + + it('should remove from selected if user is selected before', () => { + wrapper.vm.selected = [{ displayName: 'display', shareName: 'share' }] + + wrapper.vm.clickUser({ displayName: 'display', shareName: 'share' }) + + expect(wrapper.vm.selected.length).toEqual(0) + }) + }) + + describe('searchUsers()', () => { + it('should call ShareService to fetch users to add to user (display) list', async () => { + ShareService.fetchUsers = jest.fn().mockReturnValue({ + data: { + ocs: { + data: { + users: [], + }, + }, + }, + }) + wrapper.vm.userName = 'search' + + await wrapper.vm.searchUsers() + + expect(ShareService.fetchUsers).toBeCalled() + }) + }) + + describe('share()', () => { + it('should call ShareService to share article id with backend', async () => { + ShareService.share = jest.fn() + wrapper.vm.selected = [{ displayName: 'display', shareName: 'share' }] + + await wrapper.vm.share() + + expect(ShareService.share).toBeCalled() + + wrapper.vm.selected = [{ displayName: 'display', shareName: 'share' }, { displayName: 'display2', shareName: 'share2' }] + + await wrapper.vm.share() + + let args = (ShareService.share as any).mock.calls[0] + expect(args[1]).toEqual(['share']) + args = (ShareService.share as any).mock.calls[1] + expect(args[1]).toEqual(['share', 'share2']) + }) + }) +}) diff --git a/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts b/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts index d6aa2cd9d..8c4b23042 100644 --- a/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts +++ b/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts @@ -68,13 +68,13 @@ describe('FeedItemRow.vue', () => { let relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) - expect(relativeTimestamp).toEqual('10 seconds') + expect(relativeTimestamp).toEqual('{num} seconds') pastTimestamp = currentTimestamp - 1000 * 60 * 10 // 10 minutes ago relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) - expect(relativeTimestamp).toEqual('10 minutes ago') + expect(relativeTimestamp).toEqual('{num} minutes ago') }) it('should retrieve feed by ID', () => { diff --git a/tests/javascript/unit/services/share.service.spec.ts b/tests/javascript/unit/services/share.service.spec.ts new file mode 100644 index 000000000..678c0eebf --- /dev/null +++ b/tests/javascript/unit/services/share.service.spec.ts @@ -0,0 +1,46 @@ +import { ShareService } from './../../../../src/dataservices/share.service' +import axios from '@nextcloud/axios' + +jest.mock('@nextcloud/axios') + +describe('share.service.ts', () => { + 'use strict' + + beforeEach(() => { + (axios.get as any).mockReset(); + (axios.post as any).mockReset() + }) + + describe('fetchUsers', () => { + it('should call GET to retrieve users', async () => { + (axios as any).get.mockResolvedValue({ data: { feeds: [] } }) + + await ShareService.fetchUsers('abc') + + expect(axios.get).toBeCalled() + const args = (axios.get as any).mock.calls[0] + + expect(args[0]).toContain('search=abc') + }) + }) + + describe('share', () => { + it('should call POST for each user passed', async () => { + await ShareService.share(123, ['share-user']) + + expect(axios.post).toBeCalledTimes(1) + let args = (axios.post as any).mock.calls[0] + + expect(args[0]).toContain('123/share/share-user') + + await ShareService.share(345, ['share-user', 'share2']) + + expect(axios.post).toBeCalledTimes(3) + + args = (axios.post as any).mock.calls[1] + expect(args[0]).toContain('345/share/share-user') + args = (axios.post as any).mock.calls[2] + expect(args[0]).toContain('345/share/share2') + }) + }) +}) |