diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-29 12:10:00 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-29 12:10:00 +0000 |
commit | 4233d3aa86fe94e6288279aa55d42ed95bfe753c (patch) | |
tree | 7b97b519371f6df1fa6a0f2ffe69535207a73754 /spec/javascripts | |
parent | e357d4951c53a3ce4f696cf533ce24a4c6350a7e (diff) | |
download | gitlab-ce-4233d3aa86fe94e6288279aa55d42ed95bfe753c.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
13 files changed, 0 insertions, 1946 deletions
diff --git a/spec/javascripts/groups/components/app_spec.js b/spec/javascripts/groups/components/app_spec.js deleted file mode 100644 index 23b2564d3f9..00000000000 --- a/spec/javascripts/groups/components/app_spec.js +++ /dev/null @@ -1,533 +0,0 @@ -import '~/flash'; -import $ from 'jquery'; -import Vue from 'vue'; - -import appComponent from '~/groups/components/app.vue'; -import groupFolderComponent from '~/groups/components/group_folder.vue'; -import groupItemComponent from '~/groups/components/group_item.vue'; -import eventHub from '~/groups/event_hub'; -import GroupsStore from '~/groups/store/groups_store'; -import GroupsService from '~/groups/service/groups_service'; - -import { - mockEndpoint, - mockGroups, - mockSearchedGroups, - mockRawPageInfo, - mockParentGroupItem, - mockRawChildren, - mockChildren, - mockPageInfo, -} from '../mock_data'; - -const createComponent = (hideProjects = false) => { - const Component = Vue.extend(appComponent); - const store = new GroupsStore(false); - const service = new GroupsService(mockEndpoint); - - store.state.pageInfo = mockPageInfo; - - return new Component({ - propsData: { - store, - service, - hideProjects, - }, - }); -}; - -const returnServicePromise = (data, failed) => - new Promise((resolve, reject) => { - if (failed) { - reject(data); - } else { - resolve({ - json() { - return data; - }, - }); - } - }); - -describe('AppComponent', () => { - let vm; - - beforeEach(done => { - Vue.component('group-folder', groupFolderComponent); - Vue.component('group-item', groupItemComponent); - - vm = createComponent(); - - Vue.nextTick(() => { - done(); - }); - }); - - describe('computed', () => { - beforeEach(() => { - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('groups', () => { - it('should return list of groups from store', () => { - spyOn(vm.store, 'getGroups'); - - const { groups } = vm; - - expect(vm.store.getGroups).toHaveBeenCalled(); - expect(groups).not.toBeDefined(); - }); - }); - - describe('pageInfo', () => { - it('should return pagination info from store', () => { - spyOn(vm.store, 'getPaginationInfo'); - - const { pageInfo } = vm; - - expect(vm.store.getPaginationInfo).toHaveBeenCalled(); - expect(pageInfo).not.toBeDefined(); - }); - }); - }); - - describe('methods', () => { - beforeEach(() => { - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('fetchGroups', () => { - it('should call `getGroups` with all the params provided', done => { - spyOn(vm.service, 'getGroups').and.returnValue(returnServicePromise(mockGroups)); - - vm.fetchGroups({ - parentId: 1, - page: 2, - filterGroupsBy: 'git', - sortBy: 'created_desc', - archived: true, - }); - setTimeout(() => { - expect(vm.service.getGroups).toHaveBeenCalledWith(1, 2, 'git', 'created_desc', true); - done(); - }, 0); - }); - - it('should set headers to store for building pagination info when called with `updatePagination`', done => { - spyOn(vm.service, 'getGroups').and.returnValue( - returnServicePromise({ headers: mockRawPageInfo }), - ); - spyOn(vm, 'updatePagination'); - - vm.fetchGroups({ updatePagination: true }); - setTimeout(() => { - expect(vm.service.getGroups).toHaveBeenCalled(); - expect(vm.updatePagination).toHaveBeenCalled(); - done(); - }, 0); - }); - - it('should show flash error when request fails', done => { - spyOn(vm.service, 'getGroups').and.returnValue(returnServicePromise(null, true)); - spyOn($, 'scrollTo'); - spyOn(window, 'Flash'); - - vm.fetchGroups({}); - setTimeout(() => { - expect(vm.isLoading).toBe(false); - expect($.scrollTo).toHaveBeenCalledWith(0); - expect(window.Flash).toHaveBeenCalledWith('An error occurred. Please try again.'); - done(); - }, 0); - }); - }); - - describe('fetchAllGroups', () => { - it('should fetch default set of groups', done => { - spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockGroups)); - spyOn(vm, 'updatePagination').and.callThrough(); - spyOn(vm, 'updateGroups').and.callThrough(); - - vm.fetchAllGroups(); - - expect(vm.isLoading).toBe(true); - expect(vm.fetchGroups).toHaveBeenCalled(); - setTimeout(() => { - expect(vm.isLoading).toBe(false); - expect(vm.updateGroups).toHaveBeenCalled(); - done(); - }, 0); - }); - - it('should fetch matching set of groups when app is loaded with search query', done => { - spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockSearchedGroups)); - spyOn(vm, 'updateGroups').and.callThrough(); - - vm.fetchAllGroups(); - - expect(vm.fetchGroups).toHaveBeenCalledWith({ - page: null, - filterGroupsBy: null, - sortBy: null, - updatePagination: true, - archived: null, - }); - setTimeout(() => { - expect(vm.updateGroups).toHaveBeenCalled(); - done(); - }, 0); - }); - }); - - describe('fetchPage', () => { - it('should fetch groups for provided page details and update window state', done => { - spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockGroups)); - spyOn(vm, 'updateGroups').and.callThrough(); - const mergeUrlParams = spyOnDependency(appComponent, 'mergeUrlParams').and.callThrough(); - spyOn(window.history, 'replaceState'); - spyOn($, 'scrollTo'); - - vm.fetchPage(2, null, null, true); - - expect(vm.isLoading).toBe(true); - expect(vm.fetchGroups).toHaveBeenCalledWith({ - page: 2, - filterGroupsBy: null, - sortBy: null, - updatePagination: true, - archived: true, - }); - setTimeout(() => { - expect(vm.isLoading).toBe(false); - expect($.scrollTo).toHaveBeenCalledWith(0); - expect(mergeUrlParams).toHaveBeenCalledWith({ page: 2 }, jasmine.any(String)); - expect(window.history.replaceState).toHaveBeenCalledWith( - { - page: jasmine.any(String), - }, - jasmine.any(String), - jasmine.any(String), - ); - - expect(vm.updateGroups).toHaveBeenCalled(); - done(); - }, 0); - }); - }); - - describe('toggleChildren', () => { - let groupItem; - - beforeEach(() => { - groupItem = Object.assign({}, mockParentGroupItem); - groupItem.isOpen = false; - groupItem.isChildrenLoading = false; - }); - - it('should fetch children of given group and expand it if group is collapsed and children are not loaded', done => { - spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise(mockRawChildren)); - spyOn(vm.store, 'setGroupChildren'); - - vm.toggleChildren(groupItem); - - expect(groupItem.isChildrenLoading).toBe(true); - expect(vm.fetchGroups).toHaveBeenCalledWith({ - parentId: groupItem.id, - }); - setTimeout(() => { - expect(vm.store.setGroupChildren).toHaveBeenCalled(); - done(); - }, 0); - }); - - it('should skip network request while expanding group if children are already loaded', () => { - spyOn(vm, 'fetchGroups'); - groupItem.children = mockRawChildren; - - vm.toggleChildren(groupItem); - - expect(vm.fetchGroups).not.toHaveBeenCalled(); - expect(groupItem.isOpen).toBe(true); - }); - - it('should collapse group if it is already expanded', () => { - spyOn(vm, 'fetchGroups'); - groupItem.isOpen = true; - - vm.toggleChildren(groupItem); - - expect(vm.fetchGroups).not.toHaveBeenCalled(); - expect(groupItem.isOpen).toBe(false); - }); - - it('should set `isChildrenLoading` back to `false` if load request fails', done => { - spyOn(vm, 'fetchGroups').and.returnValue(returnServicePromise({}, true)); - - vm.toggleChildren(groupItem); - - expect(groupItem.isChildrenLoading).toBe(true); - setTimeout(() => { - expect(groupItem.isChildrenLoading).toBe(false); - done(); - }, 0); - }); - }); - - describe('showLeaveGroupModal', () => { - it('caches candidate group (as props) which is to be left', () => { - const group = Object.assign({}, mockParentGroupItem); - - expect(vm.targetGroup).toBe(null); - expect(vm.targetParentGroup).toBe(null); - vm.showLeaveGroupModal(group, mockParentGroupItem); - - expect(vm.targetGroup).not.toBe(null); - expect(vm.targetParentGroup).not.toBe(null); - }); - - it('updates props which show modal confirmation dialog', () => { - const group = Object.assign({}, mockParentGroupItem); - - expect(vm.showModal).toBe(false); - expect(vm.groupLeaveConfirmationMessage).toBe(''); - vm.showLeaveGroupModal(group, mockParentGroupItem); - - expect(vm.showModal).toBe(true); - expect(vm.groupLeaveConfirmationMessage).toBe( - `Are you sure you want to leave the "${group.fullName}" group?`, - ); - }); - }); - - describe('hideLeaveGroupModal', () => { - it('hides modal confirmation which is shown before leaving the group', () => { - const group = Object.assign({}, mockParentGroupItem); - vm.showLeaveGroupModal(group, mockParentGroupItem); - - expect(vm.showModal).toBe(true); - vm.hideLeaveGroupModal(); - - expect(vm.showModal).toBe(false); - }); - }); - - describe('leaveGroup', () => { - let groupItem; - let childGroupItem; - - beforeEach(() => { - groupItem = Object.assign({}, mockParentGroupItem); - groupItem.children = mockChildren; - [childGroupItem] = groupItem.children; - groupItem.isChildrenLoading = false; - vm.targetGroup = childGroupItem; - vm.targetParentGroup = groupItem; - }); - - it('hides modal confirmation leave group and remove group item from tree', done => { - const notice = `You left the "${childGroupItem.fullName}" group.`; - spyOn(vm.service, 'leaveGroup').and.returnValue(Promise.resolve({ data: { notice } })); - spyOn(vm.store, 'removeGroup').and.callThrough(); - spyOn(window, 'Flash'); - spyOn($, 'scrollTo'); - - vm.leaveGroup(); - - expect(vm.showModal).toBe(false); - expect(vm.targetGroup.isBeingRemoved).toBe(true); - expect(vm.service.leaveGroup).toHaveBeenCalledWith(vm.targetGroup.leavePath); - setTimeout(() => { - expect($.scrollTo).toHaveBeenCalledWith(0); - expect(vm.store.removeGroup).toHaveBeenCalledWith(vm.targetGroup, vm.targetParentGroup); - expect(window.Flash).toHaveBeenCalledWith(notice, 'notice'); - done(); - }, 0); - }); - - it('should show error flash message if request failed to leave group', done => { - const message = 'An error occurred. Please try again.'; - spyOn(vm.service, 'leaveGroup').and.returnValue( - returnServicePromise({ status: 500 }, true), - ); - spyOn(vm.store, 'removeGroup').and.callThrough(); - spyOn(window, 'Flash'); - - vm.leaveGroup(); - - expect(vm.targetGroup.isBeingRemoved).toBe(true); - expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath); - setTimeout(() => { - expect(vm.store.removeGroup).not.toHaveBeenCalled(); - expect(window.Flash).toHaveBeenCalledWith(message); - expect(vm.targetGroup.isBeingRemoved).toBe(false); - done(); - }, 0); - }); - - it('should show appropriate error flash message if request forbids to leave group', done => { - const message = 'Failed to leave the group. Please make sure you are not the only owner.'; - spyOn(vm.service, 'leaveGroup').and.returnValue( - returnServicePromise({ status: 403 }, true), - ); - spyOn(vm.store, 'removeGroup').and.callThrough(); - spyOn(window, 'Flash'); - - vm.leaveGroup(childGroupItem, groupItem); - - expect(vm.targetGroup.isBeingRemoved).toBe(true); - expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath); - setTimeout(() => { - expect(vm.store.removeGroup).not.toHaveBeenCalled(); - expect(window.Flash).toHaveBeenCalledWith(message); - expect(vm.targetGroup.isBeingRemoved).toBe(false); - done(); - }, 0); - }); - }); - - describe('updatePagination', () => { - it('should set pagination info to store from provided headers', () => { - spyOn(vm.store, 'setPaginationInfo'); - - vm.updatePagination(mockRawPageInfo); - - expect(vm.store.setPaginationInfo).toHaveBeenCalledWith(mockRawPageInfo); - }); - }); - - describe('updateGroups', () => { - it('should call setGroups on store if method was called directly', () => { - spyOn(vm.store, 'setGroups'); - - vm.updateGroups(mockGroups); - - expect(vm.store.setGroups).toHaveBeenCalledWith(mockGroups); - }); - - it('should call setSearchedGroups on store if method was called with fromSearch param', () => { - spyOn(vm.store, 'setSearchedGroups'); - - vm.updateGroups(mockGroups, true); - - expect(vm.store.setSearchedGroups).toHaveBeenCalledWith(mockGroups); - }); - - it('should set `isSearchEmpty` prop based on groups count', () => { - vm.updateGroups(mockGroups); - - expect(vm.isSearchEmpty).toBe(false); - - vm.updateGroups([]); - - expect(vm.isSearchEmpty).toBe(true); - }); - }); - }); - - describe('created', () => { - it('should bind event listeners on eventHub', done => { - spyOn(eventHub, '$on'); - - const newVm = createComponent(); - newVm.$mount(); - - Vue.nextTick(() => { - expect(eventHub.$on).toHaveBeenCalledWith('fetchPage', jasmine.any(Function)); - expect(eventHub.$on).toHaveBeenCalledWith('toggleChildren', jasmine.any(Function)); - expect(eventHub.$on).toHaveBeenCalledWith('showLeaveGroupModal', jasmine.any(Function)); - expect(eventHub.$on).toHaveBeenCalledWith('updatePagination', jasmine.any(Function)); - expect(eventHub.$on).toHaveBeenCalledWith('updateGroups', jasmine.any(Function)); - newVm.$destroy(); - done(); - }); - }); - - it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `false`', done => { - const newVm = createComponent(); - newVm.$mount(); - Vue.nextTick(() => { - expect(newVm.searchEmptyMessage).toBe('No groups or projects matched your search'); - newVm.$destroy(); - done(); - }); - }); - - it('should initialize `searchEmptyMessage` prop with correct string when `hideProjects` is `true`', done => { - const newVm = createComponent(true); - newVm.$mount(); - Vue.nextTick(() => { - expect(newVm.searchEmptyMessage).toBe('No groups matched your search'); - newVm.$destroy(); - done(); - }); - }); - }); - - describe('beforeDestroy', () => { - it('should unbind event listeners on eventHub', done => { - spyOn(eventHub, '$off'); - - const newVm = createComponent(); - newVm.$mount(); - newVm.$destroy(); - - Vue.nextTick(() => { - expect(eventHub.$off).toHaveBeenCalledWith('fetchPage', jasmine.any(Function)); - expect(eventHub.$off).toHaveBeenCalledWith('toggleChildren', jasmine.any(Function)); - expect(eventHub.$off).toHaveBeenCalledWith('showLeaveGroupModal', jasmine.any(Function)); - expect(eventHub.$off).toHaveBeenCalledWith('updatePagination', jasmine.any(Function)); - expect(eventHub.$off).toHaveBeenCalledWith('updateGroups', jasmine.any(Function)); - done(); - }); - }); - }); - - describe('template', () => { - beforeEach(() => { - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('should render loading icon', done => { - vm.isLoading = true; - Vue.nextTick(() => { - expect(vm.$el.querySelector('.loading-animation')).toBeDefined(); - expect(vm.$el.querySelector('span').getAttribute('aria-label')).toBe('Loading groups'); - done(); - }); - }); - - it('should render groups tree', done => { - vm.store.state.groups = [mockParentGroupItem]; - vm.isLoading = false; - Vue.nextTick(() => { - expect(vm.$el.querySelector('.groups-list-tree-container')).toBeDefined(); - done(); - }); - }); - - it('renders modal confirmation dialog', done => { - vm.groupLeaveConfirmationMessage = 'Are you sure you want to leave the "foo" group?'; - vm.showModal = true; - Vue.nextTick(() => { - const modalDialogEl = vm.$el.querySelector('.modal'); - - expect(modalDialogEl).not.toBe(null); - expect(modalDialogEl.querySelector('.modal-title').innerText.trim()).toBe('Are you sure?'); - expect(modalDialogEl.querySelector('.btn.btn-warning').innerText.trim()).toBe('Leave'); - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/groups/components/group_folder_spec.js b/spec/javascripts/groups/components/group_folder_spec.js deleted file mode 100644 index fdfd1b82bd8..00000000000 --- a/spec/javascripts/groups/components/group_folder_spec.js +++ /dev/null @@ -1,67 +0,0 @@ -import Vue from 'vue'; - -import groupFolderComponent from '~/groups/components/group_folder.vue'; -import groupItemComponent from '~/groups/components/group_item.vue'; -import { mockGroups, mockParentGroupItem } from '../mock_data'; - -const createComponent = (groups = mockGroups, parentGroup = mockParentGroupItem) => { - const Component = Vue.extend(groupFolderComponent); - - return new Component({ - propsData: { - groups, - parentGroup, - }, - }); -}; - -describe('GroupFolderComponent', () => { - let vm; - - beforeEach(done => { - Vue.component('group-item', groupItemComponent); - - vm = createComponent(); - vm.$mount(); - - Vue.nextTick(() => { - done(); - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('computed', () => { - describe('hasMoreChildren', () => { - it('should return false when childrenCount of group is less than MAX_CHILDREN_COUNT', () => { - expect(vm.hasMoreChildren).toBeFalsy(); - }); - }); - - describe('moreChildrenStats', () => { - it('should return message with count of excess children over MAX_CHILDREN_COUNT limit', () => { - expect(vm.moreChildrenStats).toBe('3 more items'); - }); - }); - }); - - describe('template', () => { - it('should render component template correctly', () => { - expect(vm.$el.classList.contains('group-list-tree')).toBeTruthy(); - expect(vm.$el.querySelectorAll('li.group-row').length).toBe(7); - }); - - it('should render more children link when groups list has children over MAX_CHILDREN_COUNT limit', () => { - const parentGroup = Object.assign({}, mockParentGroupItem); - parentGroup.childrenCount = 21; - - const newVm = createComponent(mockGroups, parentGroup); - newVm.$mount(); - - expect(newVm.$el.querySelector('li.group-row a.has-more-items')).toBeDefined(); - newVm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/group_item_spec.js b/spec/javascripts/groups/components/group_item_spec.js deleted file mode 100644 index 2889d7ae4ff..00000000000 --- a/spec/javascripts/groups/components/group_item_spec.js +++ /dev/null @@ -1,218 +0,0 @@ -import Vue from 'vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import groupItemComponent from '~/groups/components/group_item.vue'; -import groupFolderComponent from '~/groups/components/group_folder.vue'; -import eventHub from '~/groups/event_hub'; -import { mockParentGroupItem, mockChildren } from '../mock_data'; - -const createComponent = (group = mockParentGroupItem, parentGroup = mockChildren[0]) => { - const Component = Vue.extend(groupItemComponent); - - return mountComponent(Component, { - group, - parentGroup, - }); -}; - -describe('GroupItemComponent', () => { - let vm; - - beforeEach(done => { - Vue.component('group-folder', groupFolderComponent); - - vm = createComponent(); - - Vue.nextTick(() => { - done(); - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('computed', () => { - describe('groupDomId', () => { - it('should return ID string suffixed with group ID', () => { - expect(vm.groupDomId).toBe('group-55'); - }); - }); - - describe('rowClass', () => { - it('should return map of classes based on group details', () => { - const classes = ['is-open', 'has-children', 'has-description', 'being-removed']; - const { rowClass } = vm; - - expect(Object.keys(rowClass).length).toBe(classes.length); - Object.keys(rowClass).forEach(className => { - expect(classes.indexOf(className)).toBeGreaterThan(-1); - }); - }); - }); - - describe('hasChildren', () => { - it('should return boolean value representing if group has any children present', () => { - let newVm; - const group = Object.assign({}, mockParentGroupItem); - - group.childrenCount = 5; - newVm = createComponent(group); - - expect(newVm.hasChildren).toBeTruthy(); - newVm.$destroy(); - - group.childrenCount = 0; - newVm = createComponent(group); - - expect(newVm.hasChildren).toBeFalsy(); - newVm.$destroy(); - }); - }); - - describe('hasAvatar', () => { - it('should return boolean value representing if group has any avatar present', () => { - let newVm; - const group = Object.assign({}, mockParentGroupItem); - - group.avatarUrl = null; - newVm = createComponent(group); - - expect(newVm.hasAvatar).toBeFalsy(); - newVm.$destroy(); - - group.avatarUrl = '/uploads/group_avatar.png'; - newVm = createComponent(group); - - expect(newVm.hasAvatar).toBeTruthy(); - newVm.$destroy(); - }); - }); - - describe('isGroup', () => { - it('should return boolean value representing if group item is of type `group` or not', () => { - let newVm; - const group = Object.assign({}, mockParentGroupItem); - - group.type = 'group'; - newVm = createComponent(group); - - expect(newVm.isGroup).toBeTruthy(); - newVm.$destroy(); - - group.type = 'project'; - newVm = createComponent(group); - - expect(newVm.isGroup).toBeFalsy(); - newVm.$destroy(); - }); - }); - }); - - describe('methods', () => { - describe('onClickRowGroup', () => { - let event; - - beforeEach(() => { - const classList = { - contains() { - return false; - }, - }; - - event = { - target: { - classList, - parentElement: { - classList, - }, - }, - }; - }); - - it('should emit `toggleChildren` event when expand is clicked on a group and it has children present', () => { - spyOn(eventHub, '$emit'); - - vm.onClickRowGroup(event); - - expect(eventHub.$emit).toHaveBeenCalledWith('toggleChildren', vm.group); - }); - - it('should navigate page to group homepage if group does not have any children present', done => { - const group = Object.assign({}, mockParentGroupItem); - group.childrenCount = 0; - const newVm = createComponent(group); - const visitUrl = spyOnDependency(groupItemComponent, 'visitUrl').and.stub(); - spyOn(eventHub, '$emit'); - - newVm.onClickRowGroup(event); - setTimeout(() => { - expect(eventHub.$emit).not.toHaveBeenCalled(); - expect(visitUrl).toHaveBeenCalledWith(newVm.group.relativePath); - done(); - }, 0); - }); - }); - }); - - describe('template', () => { - let group = null; - - describe('for a group pending deletion', () => { - beforeEach(() => { - group = { ...mockParentGroupItem, pendingRemoval: true }; - vm = createComponent(group); - }); - - it('renders the group pending removal badge', () => { - const badgeEl = vm.$el.querySelector('.badge-warning'); - - expect(badgeEl).toBeDefined(); - expect(badgeEl).toContainText('pending removal'); - }); - }); - - describe('for a group not scheduled for deletion', () => { - beforeEach(() => { - group = { ...mockParentGroupItem, pendingRemoval: false }; - vm = createComponent(group); - }); - - it('does not render the group pending removal badge', () => { - const groupTextContainer = vm.$el.querySelector('.group-text-container'); - - expect(groupTextContainer).not.toContainText('pending removal'); - }); - }); - - it('should render component template correctly', () => { - const visibilityIconEl = vm.$el.querySelector('.item-visibility'); - - expect(vm.$el.getAttribute('id')).toBe('group-55'); - expect(vm.$el.classList.contains('group-row')).toBeTruthy(); - - expect(vm.$el.querySelector('.group-row-contents')).toBeDefined(); - expect(vm.$el.querySelector('.group-row-contents .controls')).toBeDefined(); - expect(vm.$el.querySelector('.group-row-contents .stats')).toBeDefined(); - - expect(vm.$el.querySelector('.folder-toggle-wrap')).toBeDefined(); - expect(vm.$el.querySelector('.folder-toggle-wrap .folder-caret')).toBeDefined(); - expect(vm.$el.querySelector('.folder-toggle-wrap .item-type-icon')).toBeDefined(); - - expect(vm.$el.querySelector('.avatar-container')).toBeDefined(); - expect(vm.$el.querySelector('.avatar-container a.no-expand')).toBeDefined(); - expect(vm.$el.querySelector('.avatar-container .avatar')).toBeDefined(); - - expect(vm.$el.querySelector('.title')).toBeDefined(); - expect(vm.$el.querySelector('.title a.no-expand')).toBeDefined(); - - expect(visibilityIconEl).not.toBe(null); - expect(visibilityIconEl.dataset.originalTitle).toBe(vm.visibilityTooltip); - expect(visibilityIconEl.querySelectorAll('svg').length).toBeGreaterThan(0); - - expect(vm.$el.querySelector('.access-type')).toBeDefined(); - expect(vm.$el.querySelector('.description')).toBeDefined(); - - expect(vm.$el.querySelector('.group-list-tree')).toBeDefined(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/groups_spec.js b/spec/javascripts/groups/components/groups_spec.js deleted file mode 100644 index 8423467742e..00000000000 --- a/spec/javascripts/groups/components/groups_spec.js +++ /dev/null @@ -1,76 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import groupsComponent from '~/groups/components/groups.vue'; -import groupFolderComponent from '~/groups/components/group_folder.vue'; -import groupItemComponent from '~/groups/components/group_item.vue'; -import eventHub from '~/groups/event_hub'; -import { mockGroups, mockPageInfo } from '../mock_data'; - -const createComponent = (searchEmpty = false) => { - const Component = Vue.extend(groupsComponent); - - return mountComponent(Component, { - groups: mockGroups, - pageInfo: mockPageInfo, - searchEmptyMessage: 'No matching results', - searchEmpty, - }); -}; - -describe('GroupsComponent', () => { - let vm; - - beforeEach(done => { - Vue.component('group-folder', groupFolderComponent); - Vue.component('group-item', groupItemComponent); - - vm = createComponent(); - - Vue.nextTick(() => { - done(); - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('methods', () => { - describe('change', () => { - it('should emit `fetchPage` event when page is changed via pagination', () => { - spyOn(eventHub, '$emit').and.stub(); - - vm.change(2); - - expect(eventHub.$emit).toHaveBeenCalledWith( - 'fetchPage', - 2, - jasmine.any(Object), - jasmine.any(Object), - jasmine.any(Object), - ); - }); - }); - }); - - describe('template', () => { - it('should render component template correctly', done => { - Vue.nextTick(() => { - expect(vm.$el.querySelector('.groups-list-tree-container')).toBeDefined(); - expect(vm.$el.querySelector('.group-list-tree')).toBeDefined(); - expect(vm.$el.querySelector('.gl-pagination')).toBeDefined(); - expect(vm.$el.querySelectorAll('.has-no-search-results').length).toBe(0); - done(); - }); - }); - - it('should render empty search message when `searchEmpty` is `true`', done => { - vm.searchEmpty = true; - Vue.nextTick(() => { - expect(vm.$el.querySelector('.has-no-search-results')).toBeDefined(); - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/groups/components/item_actions_spec.js b/spec/javascripts/groups/components/item_actions_spec.js deleted file mode 100644 index 9a9d6208eac..00000000000 --- a/spec/javascripts/groups/components/item_actions_spec.js +++ /dev/null @@ -1,84 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import itemActionsComponent from '~/groups/components/item_actions.vue'; -import eventHub from '~/groups/event_hub'; -import { mockParentGroupItem, mockChildren } from '../mock_data'; - -const createComponent = (group = mockParentGroupItem, parentGroup = mockChildren[0]) => { - const Component = Vue.extend(itemActionsComponent); - - return mountComponent(Component, { - group, - parentGroup, - }); -}; - -describe('ItemActionsComponent', () => { - let vm; - - beforeEach(() => { - vm = createComponent(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('methods', () => { - describe('onLeaveGroup', () => { - it('emits `showLeaveGroupModal` event with `group` and `parentGroup` props', () => { - spyOn(eventHub, '$emit'); - vm.onLeaveGroup(); - - expect(eventHub.$emit).toHaveBeenCalledWith( - 'showLeaveGroupModal', - vm.group, - vm.parentGroup, - ); - }); - }); - }); - - describe('template', () => { - it('should render component template correctly', () => { - expect(vm.$el.classList.contains('controls')).toBeTruthy(); - }); - - it('should render Edit Group button with correct attribute values', () => { - const group = Object.assign({}, mockParentGroupItem); - group.canEdit = true; - const newVm = createComponent(group); - - const editBtn = newVm.$el.querySelector('a.edit-group'); - - expect(editBtn).toBeDefined(); - expect(editBtn.classList.contains('no-expand')).toBeTruthy(); - expect(editBtn.getAttribute('href')).toBe(group.editPath); - expect(editBtn.getAttribute('aria-label')).toBe('Edit group'); - expect(editBtn.dataset.originalTitle).toBe('Edit group'); - expect(editBtn.querySelectorAll('svg use').length).not.toBe(0); - expect(editBtn.querySelector('svg use').getAttribute('xlink:href')).toContain('#settings'); - - newVm.$destroy(); - }); - - it('should render Leave Group button with correct attribute values', () => { - const group = Object.assign({}, mockParentGroupItem); - group.canLeave = true; - const newVm = createComponent(group); - - const leaveBtn = newVm.$el.querySelector('a.leave-group'); - - expect(leaveBtn).toBeDefined(); - expect(leaveBtn.classList.contains('no-expand')).toBeTruthy(); - expect(leaveBtn.getAttribute('href')).toBe(group.leavePath); - expect(leaveBtn.getAttribute('aria-label')).toBe('Leave this group'); - expect(leaveBtn.dataset.originalTitle).toBe('Leave this group'); - expect(leaveBtn.querySelectorAll('svg use').length).not.toBe(0); - expect(leaveBtn.querySelector('svg use').getAttribute('xlink:href')).toContain('#leave'); - - newVm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/item_caret_spec.js b/spec/javascripts/groups/components/item_caret_spec.js deleted file mode 100644 index 0eb56abbd61..00000000000 --- a/spec/javascripts/groups/components/item_caret_spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import itemCaretComponent from '~/groups/components/item_caret.vue'; - -const createComponent = (isGroupOpen = false) => { - const Component = Vue.extend(itemCaretComponent); - - return mountComponent(Component, { - isGroupOpen, - }); -}; - -describe('ItemCaretComponent', () => { - describe('template', () => { - it('should render component template correctly', () => { - const vm = createComponent(); - - expect(vm.$el.classList.contains('folder-caret')).toBeTruthy(); - expect(vm.$el.querySelectorAll('svg').length).toBe(1); - vm.$destroy(); - }); - - it('should render caret down icon if `isGroupOpen` prop is `true`', () => { - const vm = createComponent(true); - - expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('angle-down'); - vm.$destroy(); - }); - - it('should render caret right icon if `isGroupOpen` prop is `false`', () => { - const vm = createComponent(); - - expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('angle-right'); - vm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/item_stats_spec.js b/spec/javascripts/groups/components/item_stats_spec.js deleted file mode 100644 index 13d17b87d76..00000000000 --- a/spec/javascripts/groups/components/item_stats_spec.js +++ /dev/null @@ -1,128 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import itemStatsComponent from '~/groups/components/item_stats.vue'; -import { - mockParentGroupItem, - ITEM_TYPE, - VISIBILITY_TYPE_ICON, - GROUP_VISIBILITY_TYPE, - PROJECT_VISIBILITY_TYPE, -} from '../mock_data'; - -const createComponent = (item = mockParentGroupItem) => { - const Component = Vue.extend(itemStatsComponent); - - return mountComponent(Component, { - item, - }); -}; - -describe('ItemStatsComponent', () => { - describe('computed', () => { - describe('visibilityIcon', () => { - it('should return icon class based on `item.visibility` value', () => { - Object.keys(VISIBILITY_TYPE_ICON).forEach(visibility => { - const item = Object.assign({}, mockParentGroupItem, { visibility }); - const vm = createComponent(item); - - expect(vm.visibilityIcon).toBe(VISIBILITY_TYPE_ICON[visibility]); - vm.$destroy(); - }); - }); - }); - - describe('visibilityTooltip', () => { - it('should return tooltip string for Group based on `item.visibility` value', () => { - Object.keys(GROUP_VISIBILITY_TYPE).forEach(visibility => { - const item = Object.assign({}, mockParentGroupItem, { - visibility, - type: ITEM_TYPE.GROUP, - }); - const vm = createComponent(item); - - expect(vm.visibilityTooltip).toBe(GROUP_VISIBILITY_TYPE[visibility]); - vm.$destroy(); - }); - }); - - it('should return tooltip string for Project based on `item.visibility` value', () => { - Object.keys(PROJECT_VISIBILITY_TYPE).forEach(visibility => { - const item = Object.assign({}, mockParentGroupItem, { - visibility, - type: ITEM_TYPE.PROJECT, - }); - const vm = createComponent(item); - - expect(vm.visibilityTooltip).toBe(PROJECT_VISIBILITY_TYPE[visibility]); - vm.$destroy(); - }); - }); - }); - - describe('isProject', () => { - it('should return boolean value representing whether `item.type` is Project or not', () => { - let item; - let vm; - - item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.PROJECT }); - vm = createComponent(item); - - expect(vm.isProject).toBeTruthy(); - vm.$destroy(); - - item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.GROUP }); - vm = createComponent(item); - - expect(vm.isProject).toBeFalsy(); - vm.$destroy(); - }); - }); - - describe('isGroup', () => { - it('should return boolean value representing whether `item.type` is Group or not', () => { - let item; - let vm; - - item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.GROUP }); - vm = createComponent(item); - - expect(vm.isGroup).toBeTruthy(); - vm.$destroy(); - - item = Object.assign({}, mockParentGroupItem, { type: ITEM_TYPE.PROJECT }); - vm = createComponent(item); - - expect(vm.isGroup).toBeFalsy(); - vm.$destroy(); - }); - }); - }); - - describe('template', () => { - it('renders component container element correctly', () => { - const vm = createComponent(); - - expect(vm.$el.classList.contains('stats')).toBeTruthy(); - - vm.$destroy(); - }); - - it('renders start count and last updated information for project item correctly', () => { - const item = Object.assign({}, mockParentGroupItem, { - type: ITEM_TYPE.PROJECT, - starCount: 4, - }); - const vm = createComponent(item); - - const projectStarIconEl = vm.$el.querySelector('.project-stars'); - - expect(projectStarIconEl).not.toBeNull(); - expect(projectStarIconEl.querySelectorAll('svg').length).toBeGreaterThan(0); - expect(projectStarIconEl.querySelectorAll('.stat-value').length).toBeGreaterThan(0); - expect(vm.$el.querySelectorAll('.last-updated').length).toBeGreaterThan(0); - - vm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/item_stats_value_spec.js b/spec/javascripts/groups/components/item_stats_value_spec.js deleted file mode 100644 index ff4e781ce1a..00000000000 --- a/spec/javascripts/groups/components/item_stats_value_spec.js +++ /dev/null @@ -1,82 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import itemStatsValueComponent from '~/groups/components/item_stats_value.vue'; - -const createComponent = ({ title, cssClass, iconName, tooltipPlacement, value }) => { - const Component = Vue.extend(itemStatsValueComponent); - - return mountComponent(Component, { - title, - cssClass, - iconName, - tooltipPlacement, - value, - }); -}; - -describe('ItemStatsValueComponent', () => { - describe('computed', () => { - let vm; - const itemConfig = { - title: 'Subgroups', - cssClass: 'number-subgroups', - iconName: 'folder', - tooltipPlacement: 'left', - }; - - describe('isValuePresent', () => { - it('returns true if non-empty `value` is present', () => { - vm = createComponent(Object.assign({}, itemConfig, { value: 10 })); - - expect(vm.isValuePresent).toBeTruthy(); - }); - - it('returns false if empty `value` is present', () => { - vm = createComponent(itemConfig); - - expect(vm.isValuePresent).toBeFalsy(); - }); - - afterEach(() => { - vm.$destroy(); - }); - }); - }); - - describe('template', () => { - let vm; - beforeEach(() => { - vm = createComponent({ - title: 'Subgroups', - cssClass: 'number-subgroups', - iconName: 'folder', - tooltipPlacement: 'left', - value: 10, - }); - }); - - it('renders component element correctly', () => { - expect(vm.$el.classList.contains('number-subgroups')).toBeTruthy(); - expect(vm.$el.querySelectorAll('svg').length).toBeGreaterThan(0); - expect(vm.$el.querySelectorAll('.stat-value').length).toBeGreaterThan(0); - }); - - it('renders element tooltip correctly', () => { - expect(vm.$el.dataset.originalTitle).toBe('Subgroups'); - expect(vm.$el.dataset.placement).toBe('left'); - }); - - it('renders element icon correctly', () => { - expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('folder'); - }); - - it('renders value count correctly', () => { - expect(vm.$el.querySelector('.stat-value').innerText.trim()).toContain('10'); - }); - - afterEach(() => { - vm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/components/item_type_icon_spec.js b/spec/javascripts/groups/components/item_type_icon_spec.js deleted file mode 100644 index 321712e54a6..00000000000 --- a/spec/javascripts/groups/components/item_type_icon_spec.js +++ /dev/null @@ -1,58 +0,0 @@ -import Vue from 'vue'; - -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import itemTypeIconComponent from '~/groups/components/item_type_icon.vue'; -import { ITEM_TYPE } from '../mock_data'; - -const createComponent = (itemType = ITEM_TYPE.GROUP, isGroupOpen = false) => { - const Component = Vue.extend(itemTypeIconComponent); - - return mountComponent(Component, { - itemType, - isGroupOpen, - }); -}; - -describe('ItemTypeIconComponent', () => { - describe('template', () => { - it('should render component template correctly', () => { - const vm = createComponent(); - vm.$mount(); - - expect(vm.$el.classList.contains('item-type-icon')).toBeTruthy(); - vm.$destroy(); - }); - - it('should render folder open or close icon based `isGroupOpen` prop value', () => { - let vm; - - vm = createComponent(ITEM_TYPE.GROUP, true); - vm.$mount(); - - expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('folder-open'); - vm.$destroy(); - - vm = createComponent(ITEM_TYPE.GROUP); - vm.$mount(); - - expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('folder'); - vm.$destroy(); - }); - - it('should render bookmark icon based on `isProject` prop value', () => { - let vm; - - vm = createComponent(ITEM_TYPE.PROJECT); - vm.$mount(); - - expect(vm.$el.querySelector('use').getAttribute('xlink:href')).toContain('bookmark'); - vm.$destroy(); - - vm = createComponent(ITEM_TYPE.GROUP); - vm.$mount(); - - expect(vm.$el.querySelector('use').getAttribute('xlink:href')).not.toContain('bookmark'); - vm.$destroy(); - }); - }); -}); diff --git a/spec/javascripts/groups/mock_data.js b/spec/javascripts/groups/mock_data.js deleted file mode 100644 index 380dda9f7b1..00000000000 --- a/spec/javascripts/groups/mock_data.js +++ /dev/null @@ -1,398 +0,0 @@ -export const mockEndpoint = '/dashboard/groups.json'; - -export const ITEM_TYPE = { - PROJECT: 'project', - GROUP: 'group', -}; - -export const GROUP_VISIBILITY_TYPE = { - public: 'Public - The group and any public projects can be viewed without any authentication.', - internal: 'Internal - The group and any internal projects can be viewed by any logged in user.', - private: 'Private - The group and its projects can only be viewed by members.', -}; - -export const PROJECT_VISIBILITY_TYPE = { - public: 'Public - The project can be accessed without any authentication.', - internal: 'Internal - The project can be accessed by any logged in user.', - private: - 'Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group.', -}; - -export const VISIBILITY_TYPE_ICON = { - public: 'earth', - internal: 'shield', - private: 'lock', -}; - -export const mockParentGroupItem = { - id: 55, - name: 'hardware', - description: '', - visibility: 'public', - fullName: 'platform / hardware', - relativePath: '/platform/hardware', - canEdit: true, - type: 'group', - avatarUrl: null, - permission: 'Owner', - editPath: '/groups/platform/hardware/edit', - childrenCount: 3, - leavePath: '/groups/platform/hardware/group_members/leave', - parentId: 54, - memberCount: '1', - projectCount: 1, - subgroupCount: 2, - canLeave: false, - children: [], - isOpen: true, - isChildrenLoading: false, - isBeingRemoved: false, - updatedAt: '2017-04-09T18:40:39.101Z', -}; - -export const mockRawChildren = [ - { - id: 57, - name: 'bsp', - description: '', - visibility: 'public', - full_name: 'platform / hardware / bsp', - relative_path: '/platform/hardware/bsp', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/hardware/bsp/edit', - children_count: 6, - leave_path: '/groups/platform/hardware/bsp/group_members/leave', - parent_id: 55, - number_users_with_delimiter: '1', - project_count: 4, - subgroup_count: 2, - can_leave: false, - children: [], - updated_at: '2017-04-09T18:40:39.101Z', - }, -]; - -export const mockChildren = [ - { - id: 57, - name: 'bsp', - description: '', - visibility: 'public', - fullName: 'platform / hardware / bsp', - relativePath: '/platform/hardware/bsp', - canEdit: true, - type: 'group', - avatarUrl: null, - permission: 'Owner', - editPath: '/groups/platform/hardware/bsp/edit', - childrenCount: 6, - leavePath: '/groups/platform/hardware/bsp/group_members/leave', - parentId: 55, - memberCount: '1', - projectCount: 4, - subgroupCount: 2, - canLeave: false, - children: [], - isOpen: true, - isChildrenLoading: false, - isBeingRemoved: false, - updatedAt: '2017-04-09T18:40:39.101Z', - }, -]; - -export const mockGroups = [ - { - id: 75, - name: 'test-group', - description: '', - visibility: 'public', - full_name: 'test-group', - relative_path: '/test-group', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/test-group/edit', - children_count: 2, - leave_path: '/groups/test-group/group_members/leave', - parent_id: null, - number_users_with_delimiter: '1', - project_count: 2, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 67, - name: 'open-source', - description: '', - visibility: 'private', - full_name: 'open-source', - relative_path: '/open-source', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/open-source/edit', - children_count: 0, - leave_path: '/groups/open-source/group_members/leave', - parent_id: null, - number_users_with_delimiter: '1', - project_count: 0, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 54, - name: 'platform', - description: '', - visibility: 'public', - full_name: 'platform', - relative_path: '/platform', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/edit', - children_count: 1, - leave_path: '/groups/platform/group_members/leave', - parent_id: null, - number_users_with_delimiter: '1', - project_count: 0, - subgroup_count: 1, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 5, - name: 'H5bp', - description: 'Minus dolor consequuntur qui nam recusandae quam incidunt.', - visibility: 'public', - full_name: 'H5bp', - relative_path: '/h5bp', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/h5bp/edit', - children_count: 1, - leave_path: '/groups/h5bp/group_members/leave', - parent_id: null, - number_users_with_delimiter: '5', - project_count: 1, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 4, - name: 'Twitter', - description: 'Deserunt hic nostrum placeat veniam.', - visibility: 'public', - full_name: 'Twitter', - relative_path: '/twitter', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/twitter/edit', - children_count: 2, - leave_path: '/groups/twitter/group_members/leave', - parent_id: null, - number_users_with_delimiter: '5', - project_count: 2, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 3, - name: 'Documentcloud', - description: 'Consequatur saepe totam ea pariatur maxime.', - visibility: 'public', - full_name: 'Documentcloud', - relative_path: '/documentcloud', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/documentcloud/edit', - children_count: 1, - leave_path: '/groups/documentcloud/group_members/leave', - parent_id: null, - number_users_with_delimiter: '5', - project_count: 1, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, - { - id: 2, - name: 'Gitlab Org', - description: 'Debitis ea quas aperiam velit doloremque ab.', - visibility: 'public', - full_name: 'Gitlab Org', - relative_path: '/gitlab-org', - can_edit: true, - type: 'group', - avatar_url: '/uploads/-/system/group/avatar/2/GitLab.png', - permission: 'Owner', - edit_path: '/groups/gitlab-org/edit', - children_count: 4, - leave_path: '/groups/gitlab-org/group_members/leave', - parent_id: null, - number_users_with_delimiter: '5', - project_count: 4, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - }, -]; - -export const mockSearchedGroups = [ - { - id: 55, - name: 'hardware', - description: '', - visibility: 'public', - full_name: 'platform / hardware', - relative_path: '/platform/hardware', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/hardware/edit', - children_count: 3, - leave_path: '/groups/platform/hardware/group_members/leave', - parent_id: 54, - number_users_with_delimiter: '1', - project_count: 1, - subgroup_count: 2, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - children: [ - { - id: 57, - name: 'bsp', - description: '', - visibility: 'public', - full_name: 'platform / hardware / bsp', - relative_path: '/platform/hardware/bsp', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/hardware/bsp/edit', - children_count: 6, - leave_path: '/groups/platform/hardware/bsp/group_members/leave', - parent_id: 55, - number_users_with_delimiter: '1', - project_count: 4, - subgroup_count: 2, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - children: [ - { - id: 60, - name: 'kernel', - description: '', - visibility: 'public', - full_name: 'platform / hardware / bsp / kernel', - relative_path: '/platform/hardware/bsp/kernel', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/hardware/bsp/kernel/edit', - children_count: 1, - leave_path: '/groups/platform/hardware/bsp/kernel/group_members/leave', - parent_id: 57, - number_users_with_delimiter: '1', - project_count: 0, - subgroup_count: 1, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - children: [ - { - id: 61, - name: 'common', - description: '', - visibility: 'public', - full_name: 'platform / hardware / bsp / kernel / common', - relative_path: '/platform/hardware/bsp/kernel/common', - can_edit: true, - type: 'group', - avatar_url: null, - permission: 'Owner', - edit_path: '/groups/platform/hardware/bsp/kernel/common/edit', - children_count: 2, - leave_path: '/groups/platform/hardware/bsp/kernel/common/group_members/leave', - parent_id: 60, - number_users_with_delimiter: '1', - project_count: 2, - subgroup_count: 0, - can_leave: false, - updated_at: '2017-04-09T18:40:39.101Z', - children: [ - { - id: 17, - name: 'v4.4', - description: - 'Voluptatem qui ea error aperiam veritatis doloremque consequatur temporibus.', - visibility: 'public', - full_name: 'platform / hardware / bsp / kernel / common / v4.4', - relative_path: '/platform/hardware/bsp/kernel/common/v4.4', - can_edit: true, - type: 'project', - avatar_url: null, - permission: null, - edit_path: '/platform/hardware/bsp/kernel/common/v4.4/edit', - star_count: 0, - updated_at: '2017-09-12T06:37:04.925Z', - }, - { - id: 16, - name: 'v4.1', - description: 'Rerum expedita voluptatem doloribus neque ducimus ut hic.', - visibility: 'public', - full_name: 'platform / hardware / bsp / kernel / common / v4.1', - relative_path: '/platform/hardware/bsp/kernel/common/v4.1', - can_edit: true, - type: 'project', - avatar_url: null, - permission: null, - edit_path: '/platform/hardware/bsp/kernel/common/v4.1/edit', - star_count: 0, - updated_at: '2017-04-09T18:41:03.112Z', - }, - ], - }, - ], - }, - ], - }, - ], - }, -]; - -export const mockRawPageInfo = { - 'x-per-page': 10, - 'x-page': 10, - 'x-total': 10, - 'x-total-pages': 10, - 'x-next-page': 10, - 'x-prev-page': 10, -}; - -export const mockPageInfo = { - perPage: 10, - page: 10, - total: 10, - totalPages: 10, - nextPage: 10, - prevPage: 10, -}; diff --git a/spec/javascripts/groups/service/groups_service_spec.js b/spec/javascripts/groups/service/groups_service_spec.js deleted file mode 100644 index 45db962a1ef..00000000000 --- a/spec/javascripts/groups/service/groups_service_spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import axios from '~/lib/utils/axios_utils'; - -import GroupsService from '~/groups/service/groups_service'; -import { mockEndpoint, mockParentGroupItem } from '../mock_data'; - -describe('GroupsService', () => { - let service; - - beforeEach(() => { - service = new GroupsService(mockEndpoint); - }); - - describe('getGroups', () => { - it('should return promise for `GET` request on provided endpoint', () => { - spyOn(axios, 'get').and.stub(); - const params = { - page: 2, - filter: 'git', - sort: 'created_asc', - archived: true, - }; - - service.getGroups(55, 2, 'git', 'created_asc', true); - - expect(axios.get).toHaveBeenCalledWith(mockEndpoint, { params: { parent_id: 55 } }); - - service.getGroups(null, 2, 'git', 'created_asc', true); - - expect(axios.get).toHaveBeenCalledWith(mockEndpoint, { params }); - }); - }); - - describe('leaveGroup', () => { - it('should return promise for `DELETE` request on provided endpoint', () => { - spyOn(axios, 'delete').and.stub(); - - service.leaveGroup(mockParentGroupItem.leavePath); - - expect(axios.delete).toHaveBeenCalledWith(mockParentGroupItem.leavePath); - }); - }); -}); diff --git a/spec/javascripts/groups/store/groups_store_spec.js b/spec/javascripts/groups/store/groups_store_spec.js deleted file mode 100644 index 38de4b89f31..00000000000 --- a/spec/javascripts/groups/store/groups_store_spec.js +++ /dev/null @@ -1,123 +0,0 @@ -import GroupsStore from '~/groups/store/groups_store'; -import { - mockGroups, - mockSearchedGroups, - mockParentGroupItem, - mockRawChildren, - mockRawPageInfo, -} from '../mock_data'; - -describe('ProjectsStore', () => { - describe('constructor', () => { - it('should initialize default state', () => { - let store; - - store = new GroupsStore(); - - expect(Object.keys(store.state).length).toBe(2); - expect(Array.isArray(store.state.groups)).toBeTruthy(); - expect(Object.keys(store.state.pageInfo).length).toBe(0); - expect(store.hideProjects).not.toBeDefined(); - - store = new GroupsStore(true); - - expect(store.hideProjects).toBeTruthy(); - }); - }); - - describe('setGroups', () => { - it('should set groups to state', () => { - const store = new GroupsStore(); - spyOn(store, 'formatGroupItem').and.callThrough(); - - store.setGroups(mockGroups); - - expect(store.state.groups.length).toBe(mockGroups.length); - expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object)); - expect(Object.keys(store.state.groups[0]).indexOf('fullName')).toBeGreaterThan(-1); - }); - }); - - describe('setSearchedGroups', () => { - it('should set searched groups to state', () => { - const store = new GroupsStore(); - spyOn(store, 'formatGroupItem').and.callThrough(); - - store.setSearchedGroups(mockSearchedGroups); - - expect(store.state.groups.length).toBe(mockSearchedGroups.length); - expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object)); - expect(Object.keys(store.state.groups[0]).indexOf('fullName')).toBeGreaterThan(-1); - expect(Object.keys(store.state.groups[0].children[0]).indexOf('fullName')).toBeGreaterThan( - -1, - ); - }); - }); - - describe('setGroupChildren', () => { - it('should set children to group item in state', () => { - const store = new GroupsStore(); - spyOn(store, 'formatGroupItem').and.callThrough(); - - store.setGroupChildren(mockParentGroupItem, mockRawChildren); - - expect(store.formatGroupItem).toHaveBeenCalledWith(jasmine.any(Object)); - expect(mockParentGroupItem.children.length).toBe(1); - expect(Object.keys(mockParentGroupItem.children[0]).indexOf('fullName')).toBeGreaterThan(-1); - expect(mockParentGroupItem.isOpen).toBeTruthy(); - expect(mockParentGroupItem.isChildrenLoading).toBeFalsy(); - }); - }); - - describe('setPaginationInfo', () => { - it('should parse and set pagination info in state', () => { - const store = new GroupsStore(); - - store.setPaginationInfo(mockRawPageInfo); - - expect(store.state.pageInfo.perPage).toBe(10); - expect(store.state.pageInfo.page).toBe(10); - expect(store.state.pageInfo.total).toBe(10); - expect(store.state.pageInfo.totalPages).toBe(10); - expect(store.state.pageInfo.nextPage).toBe(10); - expect(store.state.pageInfo.previousPage).toBe(10); - }); - }); - - describe('formatGroupItem', () => { - it('should parse group item object and return updated object', () => { - let store; - let updatedGroupItem; - - store = new GroupsStore(); - updatedGroupItem = store.formatGroupItem(mockRawChildren[0]); - - expect(Object.keys(updatedGroupItem).indexOf('fullName')).toBeGreaterThan(-1); - expect(updatedGroupItem.childrenCount).toBe(mockRawChildren[0].children_count); - expect(updatedGroupItem.isChildrenLoading).toBe(false); - expect(updatedGroupItem.isBeingRemoved).toBe(false); - - store = new GroupsStore(true); - updatedGroupItem = store.formatGroupItem(mockRawChildren[0]); - - expect(Object.keys(updatedGroupItem).indexOf('fullName')).toBeGreaterThan(-1); - expect(updatedGroupItem.childrenCount).toBe(mockRawChildren[0].subgroup_count); - }); - }); - - describe('removeGroup', () => { - it('should remove children from group item in state', () => { - const store = new GroupsStore(); - const rawParentGroup = Object.assign({}, mockGroups[0]); - const rawChildGroup = Object.assign({}, mockGroups[1]); - - store.setGroups([rawParentGroup]); - store.setGroupChildren(store.state.groups[0], [rawChildGroup]); - const childItem = store.state.groups[0].children[0]; - - store.removeGroup(childItem, store.state.groups[0]); - - expect(store.state.groups[0].children.length).toBe(0); - }); - }); -}); diff --git a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js deleted file mode 100644 index 76827cde093..00000000000 --- a/spec/javascripts/vue_mr_widget/components/mr_widget_pipeline_container_spec.js +++ /dev/null @@ -1,99 +0,0 @@ -import { mount, createLocalVue } from '@vue/test-utils'; -import MrWidgetPipelineContainer from '~/vue_merge_request_widget/components/mr_widget_pipeline_container.vue'; -import MrWidgetPipeline from '~/vue_merge_request_widget/components/mr_widget_pipeline.vue'; -import ArtifactsApp from '~/vue_merge_request_widget/components/artifacts_list_app.vue'; -import { mockStore } from '../mock_data'; - -const localVue = createLocalVue(); - -describe('MrWidgetPipelineContainer', () => { - let wrapper; - - const factory = (props = {}) => { - wrapper = mount(localVue.extend(MrWidgetPipelineContainer), { - propsData: { - mr: Object.assign({}, mockStore), - ...props, - }, - localVue, - }); - }; - - afterEach(() => { - wrapper.destroy(); - }); - - describe('when pre merge', () => { - beforeEach(() => { - factory(); - }); - - it('renders pipeline', () => { - expect(wrapper.find(MrWidgetPipeline).exists()).toBe(true); - expect(wrapper.find(MrWidgetPipeline).props()).toEqual( - jasmine.objectContaining({ - pipeline: mockStore.pipeline, - pipelineCoverageDelta: mockStore.pipelineCoverageDelta, - ciStatus: mockStore.ciStatus, - hasCi: mockStore.hasCI, - sourceBranch: mockStore.sourceBranch, - sourceBranchLink: mockStore.sourceBranchLink, - }), - ); - }); - - it('renders deployments', () => { - const expectedProps = mockStore.deployments.map(dep => - jasmine.objectContaining({ - deployment: dep, - showMetrics: false, - }), - ); - - const deployments = wrapper.findAll('.mr-widget-extension .js-pre-deployment'); - - expect(deployments.wrappers.map(x => x.props())).toEqual(expectedProps); - }); - }); - - describe('when post merge', () => { - beforeEach(() => { - factory({ - isPostMerge: true, - }); - }); - - it('renders pipeline', () => { - expect(wrapper.find(MrWidgetPipeline).exists()).toBe(true); - expect(wrapper.find(MrWidgetPipeline).props()).toEqual( - jasmine.objectContaining({ - pipeline: mockStore.mergePipeline, - pipelineCoverageDelta: mockStore.pipelineCoverageDelta, - ciStatus: mockStore.ciStatus, - hasCi: mockStore.hasCI, - sourceBranch: mockStore.targetBranch, - sourceBranchLink: mockStore.targetBranch, - }), - ); - }); - - it('renders deployments', () => { - const expectedProps = mockStore.postMergeDeployments.map(dep => - jasmine.objectContaining({ - deployment: dep, - showMetrics: true, - }), - ); - - const deployments = wrapper.findAll('.mr-widget-extension .js-post-deployment'); - - expect(deployments.wrappers.map(x => x.props())).toEqual(expectedProps); - }); - }); - - describe('with artifacts path', () => { - it('renders the artifacts app', () => { - expect(wrapper.find(ArtifactsApp).isVisible()).toBe(true); - }); - }); -}); |