summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/ShareItem.vue27
-rw-r--r--tests/javascript/unit/components/ShareItem.spec.ts75
-rw-r--r--tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts4
-rw-r--r--tests/javascript/unit/services/share.service.spec.ts46
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')
+ })
+ })
+})