diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-07 00:07:51 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-07 00:07:51 +0000 |
commit | 4e375367b78bb44bd00957522cd9fc3e6d403fef (patch) | |
tree | 059b1ce541e4128bf03683407d7b5bbbc2094ed5 /spec/javascripts | |
parent | 99ddca0d88f1e4e49d61b1aa9d41b5785528d1dc (diff) | |
download | gitlab-ce-4e375367b78bb44bd00957522cd9fc3e6d403fef.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
19 files changed, 1 insertions, 4613 deletions
diff --git a/spec/javascripts/ide/components/branches/item_spec.js b/spec/javascripts/ide/components/branches/item_spec.js deleted file mode 100644 index 36b6736bfd4..00000000000 --- a/spec/javascripts/ide/components/branches/item_spec.js +++ /dev/null @@ -1,56 +0,0 @@ -import Vue from 'vue'; -import mountCompontent from 'spec/helpers/vue_mount_component_helper'; -import router from '~/ide/ide_router'; -import Item from '~/ide/components/branches/item.vue'; -import { getTimeago } from '~/lib/utils/datetime_utility'; -import { projectData } from '../../mock_data'; - -const TEST_BRANCH = { - name: 'master', - committedDate: '2018-01-05T05:50Z', -}; -const TEST_PROJECT_ID = projectData.name_with_namespace; - -describe('IDE branch item', () => { - const Component = Vue.extend(Item); - let vm; - - beforeEach(() => { - vm = mountCompontent(Component, { - item: { ...TEST_BRANCH }, - projectId: TEST_PROJECT_ID, - isActive: false, - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders branch name and timeago', () => { - const timeText = getTimeago().format(TEST_BRANCH.committedDate); - - expect(vm.$el).toContainText(TEST_BRANCH.name); - expect(vm.$el.querySelector('time')).toHaveText(timeText); - expect(vm.$el.querySelector('.ic-mobile-issue-close')).toBe(null); - }); - - it('renders link to branch', () => { - const expectedHref = router.resolve(`/project/${TEST_PROJECT_ID}/edit/${TEST_BRANCH.name}`) - .href; - - expect(vm.$el).toMatch('a'); - expect(vm.$el).toHaveAttr('href', expectedHref); - }); - - it('renders icon if isActive', done => { - vm.isActive = true; - - vm.$nextTick() - .then(() => { - expect(vm.$el.querySelector('.ic-mobile-issue-close')).not.toBe(null); - }) - .then(done) - .catch(done.fail); - }); -}); diff --git a/spec/javascripts/ide/components/panes/right_spec.js b/spec/javascripts/ide/components/panes/right_spec.js deleted file mode 100644 index 4899f850cf4..00000000000 --- a/spec/javascripts/ide/components/panes/right_spec.js +++ /dev/null @@ -1,87 +0,0 @@ -import Vue from 'vue'; -import '~/behaviors/markdown/render_gfm'; -import { createStore } from '~/ide/stores'; -import RightPane from '~/ide/components/panes/right.vue'; -import { rightSidebarViews } from '~/ide/constants'; -import { createComponentWithStore } from '../../../helpers/vue_mount_component_helper'; - -describe('IDE right pane', () => { - let Component; - let vm; - - beforeAll(() => { - Component = Vue.extend(RightPane); - }); - - beforeEach(() => { - const store = createStore(); - - vm = createComponentWithStore(Component, store).$mount(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('active', () => { - it('renders merge request button as active', done => { - vm.$store.state.rightPane.isOpen = true; - vm.$store.state.rightPane.currentView = rightSidebarViews.mergeRequestInfo.name; - vm.$store.state.currentMergeRequestId = '123'; - vm.$store.state.currentProjectId = 'gitlab-ce'; - vm.$store.state.currentMergeRequestId = 1; - vm.$store.state.projects['gitlab-ce'] = { - mergeRequests: { - 1: { - iid: 1, - title: 'Testing', - title_html: '<span class="title-html">Testing</span>', - description: 'Description', - description_html: '<p class="description-html">Description HTML</p>', - }, - }, - }; - - vm.$nextTick() - .then(() => { - expect(vm.$el.querySelector('.ide-sidebar-link.active')).not.toBe(null); - expect( - vm.$el.querySelector('.ide-sidebar-link.active').getAttribute('data-original-title'), - ).toBe('Merge Request'); - }) - .then(done) - .catch(done.fail); - }); - }); - - describe('click', () => { - beforeEach(() => { - spyOn(vm, 'open'); - }); - - it('sets view to merge request', done => { - vm.$store.state.currentMergeRequestId = '123'; - - vm.$nextTick(() => { - vm.$el.querySelector('.ide-sidebar-link').click(); - - expect(vm.open).toHaveBeenCalledWith(rightSidebarViews.mergeRequestInfo); - - done(); - }); - }); - }); - - describe('live preview', () => { - it('renders live preview button', done => { - Vue.set(vm.$store.state.entries, 'package.json', { name: 'package.json' }); - vm.$store.state.clientsidePreviewEnabled = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('button[aria-label="Live preview"]')).not.toBeNull(); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/preview/navigator_spec.js b/spec/javascripts/ide/components/preview/navigator_spec.js deleted file mode 100644 index a5341997a3a..00000000000 --- a/spec/javascripts/ide/components/preview/navigator_spec.js +++ /dev/null @@ -1,185 +0,0 @@ -import Vue from 'vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import ClientsideNavigator from '~/ide/components/preview/navigator.vue'; - -describe('IDE clientside preview navigator', () => { - let vm; - let Component; - let manager; - - beforeAll(() => { - Component = Vue.extend(ClientsideNavigator); - }); - - beforeEach(() => { - manager = { - bundlerURL: gl.TEST_HOST, - iframe: { src: '' }, - }; - - vm = mountComponent(Component, { - manager, - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders readonly URL bar', () => { - expect(vm.$el.querySelector('input[readonly]').value).toBe('/'); - }); - - it('disables back button when navigationStack is empty', () => { - expect(vm.$el.querySelector('.ide-navigator-btn')).toHaveAttr('disabled'); - expect(vm.$el.querySelector('.ide-navigator-btn').classList).toContain('disabled-content'); - }); - - it('disables forward button when forwardNavigationStack is empty', () => { - vm.forwardNavigationStack = []; - - expect(vm.$el.querySelectorAll('.ide-navigator-btn')[1]).toHaveAttr('disabled'); - expect(vm.$el.querySelectorAll('.ide-navigator-btn')[1].classList).toContain( - 'disabled-content', - ); - }); - - it('calls back method when clicking back button', done => { - vm.navigationStack.push('/test'); - vm.navigationStack.push('/test2'); - spyOn(vm, 'back'); - - vm.$nextTick(() => { - vm.$el.querySelector('.ide-navigator-btn').click(); - - expect(vm.back).toHaveBeenCalled(); - - done(); - }); - }); - - it('calls forward method when clicking forward button', done => { - vm.forwardNavigationStack.push('/test'); - spyOn(vm, 'forward'); - - vm.$nextTick(() => { - vm.$el.querySelectorAll('.ide-navigator-btn')[1].click(); - - expect(vm.forward).toHaveBeenCalled(); - - done(); - }); - }); - - describe('onUrlChange', () => { - it('updates the path', () => { - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - expect(vm.path).toBe('/url'); - }); - - it('sets currentBrowsingIndex 0 if not already set', () => { - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - expect(vm.currentBrowsingIndex).toBe(0); - }); - - it('increases currentBrowsingIndex if path doesnt match', () => { - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url2`, - }); - - expect(vm.currentBrowsingIndex).toBe(1); - }); - - it('does not increase currentBrowsingIndex if path matches', () => { - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - expect(vm.currentBrowsingIndex).toBe(0); - }); - - it('pushes path into navigation stack', () => { - vm.onUrlChange({ - url: `${gl.TEST_HOST}/url`, - }); - - expect(vm.navigationStack).toEqual(['/url']); - }); - }); - - describe('back', () => { - beforeEach(() => { - vm.path = '/test2'; - vm.currentBrowsingIndex = 1; - vm.navigationStack.push('/test'); - vm.navigationStack.push('/test2'); - - spyOn(vm, 'visitPath'); - - vm.back(); - }); - - it('visits the last entry in navigationStack', () => { - expect(vm.visitPath).toHaveBeenCalledWith('/test'); - }); - - it('adds last entry to forwardNavigationStack', () => { - expect(vm.forwardNavigationStack).toEqual(['/test2']); - }); - - it('clears navigation stack if currentBrowsingIndex is 1', () => { - expect(vm.navigationStack).toEqual([]); - }); - - it('sets currentBrowsingIndex to null is currentBrowsingIndex is 1', () => { - expect(vm.currentBrowsingIndex).toBe(null); - }); - }); - - describe('forward', () => { - it('calls visitPath with first entry in forwardNavigationStack', () => { - spyOn(vm, 'visitPath'); - - vm.forwardNavigationStack.push('/test'); - vm.forwardNavigationStack.push('/test2'); - - vm.forward(); - - expect(vm.visitPath).toHaveBeenCalledWith('/test'); - }); - }); - - describe('refresh', () => { - it('calls refresh with current path', () => { - spyOn(vm, 'visitPath'); - - vm.path = '/test'; - - vm.refresh(); - - expect(vm.visitPath).toHaveBeenCalledWith('/test'); - }); - }); - - describe('visitPath', () => { - it('updates iframe src with passed in path', () => { - vm.visitPath('/testpath'); - - expect(manager.iframe.src).toBe(`${gl.TEST_HOST}/testpath`); - }); - }); -}); diff --git a/spec/javascripts/ide/helpers.js b/spec/javascripts/ide/helpers.js index 7e107747346..2c52780f316 100644 --- a/spec/javascripts/ide/helpers.js +++ b/spec/javascripts/ide/helpers.js @@ -1,54 +1 @@ -import * as pathUtils from 'path'; -import { decorateData } from '~/ide/stores/utils'; -import state from '~/ide/stores/state'; -import commitState from '~/ide/stores/modules/commit/state'; -import mergeRequestsState from '~/ide/stores/modules/merge_requests/state'; -import pipelinesState from '~/ide/stores/modules/pipelines/state'; -import branchesState from '~/ide/stores/modules/branches/state'; -import fileTemplatesState from '~/ide/stores/modules/file_templates/state'; -import paneState from '~/ide/stores/modules/pane/state'; - -export const resetStore = store => { - const newState = { - ...state(), - commit: commitState(), - mergeRequests: mergeRequestsState(), - pipelines: pipelinesState(), - branches: branchesState(), - fileTemplates: fileTemplatesState(), - rightPane: paneState(), - }; - store.replaceState(newState); -}; - -export const file = (name = 'name', id = name, type = '', parent = null) => - decorateData({ - id, - type, - icon: 'icon', - url: 'url', - name, - path: parent ? `${parent.path}/${name}` : name, - parentPath: parent ? parent.path : '', - lastCommit: {}, - }); - -export const createEntriesFromPaths = paths => - paths - .map(path => ({ - name: pathUtils.basename(path), - dir: pathUtils.dirname(path), - ext: pathUtils.extname(path), - })) - .reduce((entries, path, idx) => { - const { name } = path; - const parent = path.dir ? entries[path.dir] : null; - const type = path.ext ? 'blob' : 'tree'; - - const entry = file(name, (idx + 1).toString(), type, parent); - - return { - [entry.path]: entry, - ...entries, - }; - }, {}); +export * from '../../frontend/ide/helpers'; diff --git a/spec/javascripts/ide/ide_router_spec.js b/spec/javascripts/ide/ide_router_spec.js deleted file mode 100644 index 52ea0882bf4..00000000000 --- a/spec/javascripts/ide/ide_router_spec.js +++ /dev/null @@ -1,44 +0,0 @@ -import router from '~/ide/ide_router'; -import store from '~/ide/stores'; - -describe('IDE router', () => { - const PROJECT_NAMESPACE = 'my-group/sub-group'; - const PROJECT_NAME = 'my-project'; - - afterEach(() => { - router.push('/'); - }); - - afterAll(() => { - // VueRouter leaves this window.history at the "base" url. We need to clean this up. - window.history.replaceState({}, '', '/'); - }); - - [ - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/master/-/src/blob/`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/master/-/src/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/blob/-/src/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/master/-/src/tree/`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/weird:branch/name-123/-/src/tree/`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/master/-/src/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/master/-/src/edit`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/master/-/src/merge_requests/2`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/blob/-/src/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/edit/blob/-/src/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/merge_requests/2`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/blob`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/edit`, - `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}`, - ].forEach(route => { - it(`finds project path when route is "${route}"`, () => { - spyOn(store, 'dispatch').and.returnValue(new Promise(() => {})); - - router.push(route); - - expect(store.dispatch).toHaveBeenCalledWith('getProjectData', { - namespace: PROJECT_NAMESPACE, - projectId: PROJECT_NAME, - }); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/getters_spec.js b/spec/javascripts/ide/stores/getters_spec.js deleted file mode 100644 index 558674cc845..00000000000 --- a/spec/javascripts/ide/stores/getters_spec.js +++ /dev/null @@ -1,293 +0,0 @@ -import * as getters from '~/ide/stores/getters'; -import state from '~/ide/stores/state'; -import { file } from '../helpers'; - -describe('IDE store getters', () => { - let localState; - - beforeEach(() => { - localState = state(); - }); - - describe('activeFile', () => { - it('returns the current active file', () => { - localState.openFiles.push(file()); - localState.openFiles.push(file('active')); - localState.openFiles[1].active = true; - - expect(getters.activeFile(localState).name).toBe('active'); - }); - - it('returns undefined if no active files are found', () => { - localState.openFiles.push(file()); - localState.openFiles.push(file('active')); - - expect(getters.activeFile(localState)).toBeNull(); - }); - }); - - describe('modifiedFiles', () => { - it('returns a list of modified files', () => { - localState.openFiles.push(file()); - localState.changedFiles.push(file('changed')); - localState.changedFiles[0].changed = true; - - const modifiedFiles = getters.modifiedFiles(localState); - - expect(modifiedFiles.length).toBe(1); - expect(modifiedFiles[0].name).toBe('changed'); - }); - }); - - describe('currentMergeRequest', () => { - it('returns Current Merge Request', () => { - localState.currentProjectId = 'abcproject'; - localState.currentMergeRequestId = 1; - localState.projects.abcproject = { - mergeRequests: { - 1: { mergeId: 1 }, - }, - }; - - expect(getters.currentMergeRequest(localState).mergeId).toBe(1); - }); - - it('returns null if no active Merge Request was found', () => { - localState.currentProjectId = 'otherproject'; - - expect(getters.currentMergeRequest(localState)).toBeNull(); - }); - }); - - describe('allBlobs', () => { - beforeEach(() => { - Object.assign(localState.entries, { - index: { type: 'blob', name: 'index', lastOpenedAt: 0 }, - app: { type: 'blob', name: 'blob', lastOpenedAt: 0 }, - folder: { type: 'folder', name: 'folder', lastOpenedAt: 0 }, - }); - }); - - it('returns only blobs', () => { - expect(getters.allBlobs(localState).length).toBe(2); - }); - - it('returns list sorted by lastOpenedAt', () => { - localState.entries.app.lastOpenedAt = new Date().getTime(); - - expect(getters.allBlobs(localState)[0].name).toBe('blob'); - }); - }); - - describe('getChangesInFolder', () => { - it('returns length of changed files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'app/123', - name: '123', - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(1); - }); - - it('returns length of changed & staged files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'testing/123', - name: '123', - }, - ); - - localState.stagedFiles.push( - { - path: 'test/123', - name: '123', - }, - { - path: 'test/index', - name: 'index', - }, - { - path: 'testing/12345', - name: '12345', - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(2); - }); - - it('returns length of changed & tempFiles files for a path', () => { - localState.changedFiles.push( - { - path: 'test/index', - name: 'index', - }, - { - path: 'test/newfile', - name: 'newfile', - tempFile: true, - }, - ); - - expect(getters.getChangesInFolder(localState)('test')).toBe(2); - }); - }); - - describe('lastCommit', () => { - it('returns the last commit of the current branch on the current project', () => { - const commitTitle = 'Example commit title'; - const localGetters = { - currentProject: { - name: 'test-project', - }, - currentBranch: { - commit: { - title: commitTitle, - }, - }, - }; - localState.currentBranchId = 'example-branch'; - - expect(getters.lastCommit(localState, localGetters).title).toBe(commitTitle); - }); - }); - - describe('currentBranch', () => { - it('returns current projects branch', () => { - localState.currentProjectId = 'abcproject'; - localState.currentBranchId = 'master'; - localState.projects.abcproject = { - name: 'abcproject', - branches: { - master: { - name: 'master', - }, - }, - }; - const localGetters = { - findBranch: jasmine.createSpy('findBranchSpy'), - }; - getters.currentBranch(localState, localGetters); - - expect(localGetters.findBranch).toHaveBeenCalledWith('abcproject', 'master'); - }); - }); - - describe('findProject', () => { - it('returns the project matching the id', () => { - localState.currentProjectId = 'abcproject'; - localState.projects.abcproject = { - name: 'abcproject', - }; - - expect(getters.findProject(localState)('abcproject').name).toBe('abcproject'); - }); - }); - - describe('findBranch', () => { - let result; - - it('returns the selected branch from a project', () => { - localState.currentProjectId = 'abcproject'; - localState.currentBranchId = 'master'; - localState.projects.abcproject = { - name: 'abcproject', - branches: { - master: { - name: 'master', - }, - }, - }; - const localGetters = { - findProject: () => localState.projects.abcproject, - }; - - result = getters.findBranch(localState, localGetters)('abcproject', 'master'); - - expect(result.name).toBe('master'); - }); - }); - - describe('isOnDefaultBranch', () => { - it('returns false when no project exists', () => { - const localGetters = { - currentProject: undefined, - }; - - expect(getters.isOnDefaultBranch({}, localGetters)).toBeFalsy(); - }); - - it("returns true when project's default branch matches current branch", () => { - const localGetters = { - currentProject: { - default_branch: 'master', - }, - branchName: 'master', - }; - - expect(getters.isOnDefaultBranch({}, localGetters)).toBeTruthy(); - }); - - it("returns false when project's default branch doesn't match current branch", () => { - const localGetters = { - currentProject: { - default_branch: 'master', - }, - branchName: 'feature', - }; - - expect(getters.isOnDefaultBranch({}, localGetters)).toBeFalsy(); - }); - }); - - describe('packageJson', () => { - it('returns package.json entry', () => { - localState.entries['package.json'] = { name: 'package.json' }; - - expect(getters.packageJson(localState)).toEqual({ - name: 'package.json', - }); - }); - }); - - describe('canPushToBranch', () => { - it('returns false when no currentBranch exists', () => { - const localGetters = { - currentProject: undefined, - }; - - expect(getters.canPushToBranch({}, localGetters)).toBeFalsy(); - }); - - it('returns true when can_push to currentBranch', () => { - const localGetters = { - currentProject: { - default_branch: 'master', - }, - currentBranch: { can_push: true }, - }; - - expect(getters.canPushToBranch({}, localGetters)).toBeTruthy(); - }); - - it('returns false when !can_push to currentBranch', () => { - const localGetters = { - currentProject: { - default_branch: 'master', - }, - currentBranch: { can_push: false }, - }; - - expect(getters.canPushToBranch({}, localGetters)).toBeFalsy(); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/branches/actions_spec.js b/spec/javascripts/ide/stores/modules/branches/actions_spec.js deleted file mode 100644 index 4896eac46f4..00000000000 --- a/spec/javascripts/ide/stores/modules/branches/actions_spec.js +++ /dev/null @@ -1,176 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import testAction from 'spec/helpers/vuex_action_helper'; -import axios from '~/lib/utils/axios_utils'; -import state from '~/ide/stores/modules/branches/state'; -import * as types from '~/ide/stores/modules/branches/mutation_types'; -import { - requestBranches, - receiveBranchesError, - receiveBranchesSuccess, - fetchBranches, - resetBranches, -} from '~/ide/stores/modules/branches/actions'; -import { branches, projectData } from '../../../mock_data'; - -describe('IDE branches actions', () => { - const TEST_SEARCH = 'foosearch'; - let mockedContext; - let mockedState; - let mock; - - beforeEach(() => { - mockedContext = { - dispatch() {}, - rootState: { - currentProjectId: projectData.name_with_namespace, - }, - rootGetters: { - currentProject: projectData, - }, - state: state(), - }; - - // testAction looks for rootGetters in state, - // so they need to be concatenated here. - mockedState = { - ...mockedContext.state, - ...mockedContext.rootGetters, - ...mockedContext.rootState, - }; - - mock = new MockAdapter(axios); - }); - - afterEach(() => { - mock.restore(); - }); - - describe('requestBranches', () => { - it('should commit request', done => { - testAction( - requestBranches, - null, - mockedContext.state, - [{ type: types.REQUEST_BRANCHES }], - [], - done, - ); - }); - }); - - describe('receiveBranchesError', () => { - it('should commit error', done => { - testAction( - receiveBranchesError, - { search: TEST_SEARCH }, - mockedContext.state, - [{ type: types.RECEIVE_BRANCHES_ERROR }], - [ - { - type: 'setErrorMessage', - payload: { - text: 'Error loading branches.', - action: jasmine.any(Function), - actionText: 'Please try again', - actionPayload: { search: TEST_SEARCH }, - }, - }, - ], - done, - ); - }); - }); - - describe('receiveBranchesSuccess', () => { - it('should commit received data', done => { - testAction( - receiveBranchesSuccess, - branches, - mockedContext.state, - [{ type: types.RECEIVE_BRANCHES_SUCCESS, payload: branches }], - [], - done, - ); - }); - }); - - describe('fetchBranches', () => { - beforeEach(() => { - gon.api_version = 'v4'; - }); - - describe('success', () => { - beforeEach(() => { - mock.onGet(/\/api\/v4\/projects\/\d+\/repository\/branches(.*)$/).replyOnce(200, branches); - }); - - it('calls API with params', () => { - const apiSpy = spyOn(axios, 'get').and.callThrough(); - - fetchBranches(mockedContext, { search: TEST_SEARCH }); - - expect(apiSpy).toHaveBeenCalledWith(jasmine.anything(), { - params: jasmine.objectContaining({ - search: TEST_SEARCH, - sort: 'updated_desc', - }), - }); - }); - - it('dispatches success with received data', done => { - testAction( - fetchBranches, - { search: TEST_SEARCH }, - mockedState, - [], - [ - { type: 'requestBranches' }, - { type: 'resetBranches' }, - { - type: 'receiveBranchesSuccess', - payload: branches, - }, - ], - done, - ); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(/\/api\/v4\/projects\/\d+\/repository\/branches(.*)$/).replyOnce(500); - }); - - it('dispatches error', done => { - testAction( - fetchBranches, - { search: TEST_SEARCH }, - mockedState, - [], - [ - { type: 'requestBranches' }, - { type: 'resetBranches' }, - { - type: 'receiveBranchesError', - payload: { search: TEST_SEARCH }, - }, - ], - done, - ); - }); - }); - - describe('resetBranches', () => { - it('commits reset', done => { - testAction( - resetBranches, - null, - mockedContext.state, - [{ type: types.RESET_BRANCHES }], - [], - done, - ); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/branches/mutations_spec.js b/spec/javascripts/ide/stores/modules/branches/mutations_spec.js deleted file mode 100644 index be91440f119..00000000000 --- a/spec/javascripts/ide/stores/modules/branches/mutations_spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import state from '~/ide/stores/modules/branches/state'; -import mutations from '~/ide/stores/modules/branches/mutations'; -import * as types from '~/ide/stores/modules/branches/mutation_types'; -import { branches } from '../../../mock_data'; - -describe('IDE branches mutations', () => { - let mockedState; - - beforeEach(() => { - mockedState = state(); - }); - - describe(types.REQUEST_BRANCHES, () => { - it('sets loading to true', () => { - mutations[types.REQUEST_BRANCHES](mockedState); - - expect(mockedState.isLoading).toBe(true); - }); - }); - - describe(types.RECEIVE_BRANCHES_ERROR, () => { - it('sets loading to false', () => { - mutations[types.RECEIVE_BRANCHES_ERROR](mockedState); - - expect(mockedState.isLoading).toBe(false); - }); - }); - - describe(types.RECEIVE_BRANCHES_SUCCESS, () => { - it('sets branches', () => { - const expectedBranches = branches.map(branch => ({ - name: branch.name, - committedDate: branch.commit.committed_date, - })); - - mutations[types.RECEIVE_BRANCHES_SUCCESS](mockedState, branches); - - expect(mockedState.branches).toEqual(expectedBranches); - }); - }); - - describe(types.RESET_BRANCHES, () => { - it('clears branches array', () => { - mockedState.branches = ['test']; - - mutations[types.RESET_BRANCHES](mockedState); - - expect(mockedState.branches).toEqual([]); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/commit/getters_spec.js b/spec/javascripts/ide/stores/modules/commit/getters_spec.js deleted file mode 100644 index 07445c22917..00000000000 --- a/spec/javascripts/ide/stores/modules/commit/getters_spec.js +++ /dev/null @@ -1,295 +0,0 @@ -import commitState from '~/ide/stores/modules/commit/state'; -import * as getters from '~/ide/stores/modules/commit/getters'; -import consts from '~/ide/stores/modules/commit/constants'; - -describe('IDE commit module getters', () => { - let state; - - beforeEach(() => { - state = commitState(); - }); - - describe('discardDraftButtonDisabled', () => { - it('returns true when commitMessage is empty', () => { - expect(getters.discardDraftButtonDisabled(state)).toBeTruthy(); - }); - - it('returns false when commitMessage is not empty & loading is false', () => { - state.commitMessage = 'test'; - state.submitCommitLoading = false; - - expect(getters.discardDraftButtonDisabled(state)).toBeFalsy(); - }); - - it('returns true when commitMessage is not empty & loading is true', () => { - state.commitMessage = 'test'; - state.submitCommitLoading = true; - - expect(getters.discardDraftButtonDisabled(state)).toBeTruthy(); - }); - }); - - describe('placeholderBranchName', () => { - it('includes username, currentBranchId, patch & random number', () => { - gon.current_username = 'username'; - - const branch = getters.placeholderBranchName(state, null, { - currentBranchId: 'testing', - }); - - expect(branch).toMatch(/username-testing-patch-\d{5}$/); - }); - }); - - describe('branchName', () => { - const rootState = { - currentBranchId: 'master', - }; - const localGetters = { - placeholderBranchName: 'placeholder-branch-name', - }; - - beforeEach(() => { - Object.assign(state, { - newBranchName: 'state-newBranchName', - }); - }); - - it('defaults to currentBranchId when not committing to a new branch', () => { - localGetters.isCreatingNewBranch = false; - - expect(getters.branchName(state, localGetters, rootState)).toBe('master'); - }); - - describe('commit to a new branch', () => { - beforeEach(() => { - localGetters.isCreatingNewBranch = true; - }); - - it('uses newBranchName when not empty', () => { - const newBranchName = 'nonempty-branch-name'; - Object.assign(state, { - newBranchName, - }); - - expect(getters.branchName(state, localGetters, rootState)).toBe(newBranchName); - }); - - it('uses placeholderBranchName when state newBranchName is empty', () => { - Object.assign(state, { - newBranchName: '', - }); - - expect(getters.branchName(state, localGetters, rootState)).toBe('placeholder-branch-name'); - }); - }); - }); - - describe('preBuiltCommitMessage', () => { - let rootState = {}; - - beforeEach(() => { - rootState.changedFiles = []; - rootState.stagedFiles = []; - }); - - afterEach(() => { - rootState = {}; - }); - - it('returns commitMessage when set', () => { - state.commitMessage = 'test commit message'; - - expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe('test commit message'); - }); - - ['changedFiles', 'stagedFiles'].forEach(key => { - it('returns commitMessage with updated file', () => { - rootState[key].push({ - path: 'test-file', - }); - - expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe('Update test-file'); - }); - - it('returns commitMessage with updated files', () => { - rootState[key].push( - { - path: 'test-file', - }, - { - path: 'index.js', - }, - ); - - expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe( - 'Update test-file, index.js files', - ); - }); - - it('returns commitMessage with deleted files', () => { - rootState[key].push( - { - path: 'test-file', - deleted: true, - }, - { - path: 'index.js', - }, - ); - - expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe( - 'Update index.js\nDeleted test-file', - ); - }); - }); - }); - - describe('isCreatingNewBranch', () => { - it('returns false if NOT creating a new branch', () => { - state.commitAction = consts.COMMIT_TO_CURRENT_BRANCH; - - expect(getters.isCreatingNewBranch(state)).toBeFalsy(); - }); - - it('returns true if creating a new branch', () => { - state.commitAction = consts.COMMIT_TO_NEW_BRANCH; - - expect(getters.isCreatingNewBranch(state)).toBeTruthy(); - }); - }); - - describe('shouldHideNewMrOption', () => { - let localGetters = {}; - let rootGetters = {}; - - beforeEach(() => { - localGetters = { - isCreatingNewBranch: null, - }; - rootGetters = { - isOnDefaultBranch: null, - hasMergeRequest: null, - canPushToBranch: null, - }; - }); - - describe('NO existing MR for the branch', () => { - beforeEach(() => { - rootGetters.hasMergeRequest = false; - }); - - it('should never hide "New MR" option', () => { - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - }); - - describe('existing MR for the branch', () => { - beforeEach(() => { - rootGetters.hasMergeRequest = true; - }); - - it('should NOT hide "New MR" option if user can NOT push to the current branch', () => { - rootGetters.canPushToBranch = false; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - - it('should hide "New MR" option if user can push to the current branch', () => { - rootGetters.canPushToBranch = true; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeTruthy(); - }); - }); - - describe('user can NOT push the branch', () => { - beforeEach(() => { - rootGetters.canPushToBranch = false; - }); - - it('should never hide "New MR" option', () => { - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - }); - - describe('user can push to the branch', () => { - beforeEach(() => { - rootGetters.canPushToBranch = true; - }); - - it('should NOT hide "New MR" option if there is NO existing MR for the current branch', () => { - rootGetters.hasMergeRequest = false; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - - it('should hide "New MR" option if there is existing MR for the current branch', () => { - rootGetters.hasMergeRequest = true; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeTruthy(); - }); - }); - - describe('default branch', () => { - beforeEach(() => { - rootGetters.isOnDefaultBranch = true; - }); - - describe('committing to the same branch', () => { - beforeEach(() => { - localGetters.isCreatingNewBranch = false; - rootGetters.canPushToBranch = true; - }); - - it('should hide "New MR" when there is an existing MR', () => { - rootGetters.hasMergeRequest = true; - - expect( - getters.shouldHideNewMrOption(state, localGetters, null, rootGetters), - ).toBeTruthy(); - }); - - it('should hide "New MR" when there is no existing MR', () => { - rootGetters.hasMergeRequest = false; - - expect( - getters.shouldHideNewMrOption(state, localGetters, null, rootGetters), - ).toBeTruthy(); - }); - }); - - describe('creating a new branch', () => { - beforeEach(() => { - localGetters.isCreatingNewBranch = true; - }); - - it('should NOT hide "New MR" option no matter existence of an MR or write access', () => { - rootGetters.hasMergeRequest = false; - rootGetters.canPushToBranch = true; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - - rootGetters.hasMergeRequest = true; - rootGetters.canPushToBranch = true; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - - rootGetters.hasMergeRequest = false; - rootGetters.canPushToBranch = false; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - }); - }); - - it('should never hide "New MR" option when creating a new branch', () => { - localGetters.isCreatingNewBranch = true; - - rootGetters.isOnDefaultBranch = false; - rootGetters.hasMergeRequest = true; - rootGetters.canPushToBranch = true; - - expect(getters.shouldHideNewMrOption(state, localGetters, null, rootGetters)).toBeFalsy(); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js b/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js deleted file mode 100644 index f049e6e01e4..00000000000 --- a/spec/javascripts/ide/stores/modules/file_templates/actions_spec.js +++ /dev/null @@ -1,411 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import testAction from 'spec/helpers/vuex_action_helper'; -import axios from '~/lib/utils/axios_utils'; -import createState from '~/ide/stores/modules/file_templates/state'; -import * as actions from '~/ide/stores/modules/file_templates/actions'; -import * as types from '~/ide/stores/modules/file_templates/mutation_types'; - -describe('IDE file templates actions', () => { - let state; - let mock; - - beforeEach(() => { - state = createState(); - - mock = new MockAdapter(axios); - }); - - afterEach(() => { - mock.restore(); - }); - - describe('requestTemplateTypes', () => { - it('commits REQUEST_TEMPLATE_TYPES', done => { - testAction( - actions.requestTemplateTypes, - null, - state, - [{ type: types.REQUEST_TEMPLATE_TYPES }], - [], - done, - ); - }); - }); - - describe('receiveTemplateTypesError', () => { - it('commits RECEIVE_TEMPLATE_TYPES_ERROR and dispatches setErrorMessage', done => { - testAction( - actions.receiveTemplateTypesError, - null, - state, - [{ type: types.RECEIVE_TEMPLATE_TYPES_ERROR }], - [ - { - type: 'setErrorMessage', - payload: { - action: jasmine.any(Function), - actionText: 'Please try again', - text: 'Error loading template types.', - }, - }, - ], - done, - ); - }); - }); - - describe('receiveTemplateTypesSuccess', () => { - it('commits RECEIVE_TEMPLATE_TYPES_SUCCESS', done => { - testAction( - actions.receiveTemplateTypesSuccess, - 'test', - state, - [{ type: types.RECEIVE_TEMPLATE_TYPES_SUCCESS, payload: 'test' }], - [], - done, - ); - }); - }); - - describe('fetchTemplateTypes', () => { - describe('success', () => { - const pages = [[{ name: 'MIT' }], [{ name: 'Apache' }], [{ name: 'CC' }]]; - - beforeEach(() => { - mock.onGet(/api\/(.*)\/templates\/licenses/).reply(({ params }) => { - const pageNum = params.page; - const page = pages[pageNum - 1]; - const hasNextPage = pageNum < pages.length; - - return [200, page, hasNextPage ? { 'X-NEXT-PAGE': pageNum + 1 } : {}]; - }); - }); - - it('rejects if selectedTemplateType is empty', done => { - const dispatch = jasmine.createSpy('dispatch'); - - actions - .fetchTemplateTypes({ dispatch, state }) - .then(done.fail) - .catch(() => { - expect(dispatch).not.toHaveBeenCalled(); - - done(); - }); - }); - - it('dispatches actions', done => { - state.selectedTemplateType = { - key: 'licenses', - }; - - testAction( - actions.fetchTemplateTypes, - null, - state, - [], - [ - { - type: 'requestTemplateTypes', - }, - { - type: 'receiveTemplateTypesSuccess', - payload: pages[0], - }, - { - type: 'receiveTemplateTypesSuccess', - payload: pages[0].concat(pages[1]), - }, - { - type: 'receiveTemplateTypesSuccess', - payload: pages[0].concat(pages[1]).concat(pages[2]), - }, - ], - done, - ); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(/api\/(.*)\/templates\/licenses/).replyOnce(500); - }); - - it('dispatches actions', done => { - state.selectedTemplateType = { - key: 'licenses', - }; - - testAction( - actions.fetchTemplateTypes, - null, - state, - [], - [ - { - type: 'requestTemplateTypes', - }, - { - type: 'receiveTemplateTypesError', - }, - ], - done, - ); - }); - }); - }); - - describe('setSelectedTemplateType', () => { - it('commits SET_SELECTED_TEMPLATE_TYPE', () => { - const commit = jasmine.createSpy('commit'); - const options = { - commit, - dispatch() {}, - rootGetters: { - activeFile: { - name: 'test', - prevPath: '', - }, - }, - }; - - actions.setSelectedTemplateType(options, { name: 'test' }); - - expect(commit).toHaveBeenCalledWith(types.SET_SELECTED_TEMPLATE_TYPE, { name: 'test' }); - }); - - it('dispatches discardFileChanges if prevPath matches templates name', () => { - const dispatch = jasmine.createSpy('dispatch'); - const options = { - commit() {}, - dispatch, - rootGetters: { - activeFile: { - name: 'test', - path: 'test', - prevPath: 'test', - }, - }, - }; - - actions.setSelectedTemplateType(options, { name: 'test' }); - - expect(dispatch).toHaveBeenCalledWith('discardFileChanges', 'test', { root: true }); - }); - - it('dispatches renameEntry if file name doesnt match', () => { - const dispatch = jasmine.createSpy('dispatch'); - const options = { - commit() {}, - dispatch, - rootGetters: { - activeFile: { - name: 'oldtest', - path: 'oldtest', - prevPath: '', - }, - }, - }; - - actions.setSelectedTemplateType(options, { name: 'test' }); - - expect(dispatch).toHaveBeenCalledWith( - 'renameEntry', - { - path: 'oldtest', - name: 'test', - }, - { root: true }, - ); - }); - }); - - describe('receiveTemplateError', () => { - it('dispatches setErrorMessage', done => { - testAction( - actions.receiveTemplateError, - 'test', - state, - [], - [ - { - type: 'setErrorMessage', - payload: { - action: jasmine.any(Function), - actionText: 'Please try again', - text: 'Error loading template.', - actionPayload: 'test', - }, - }, - ], - done, - ); - }); - }); - - describe('fetchTemplate', () => { - describe('success', () => { - beforeEach(() => { - mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(200, { - content: 'MIT content', - }); - mock.onGet(/api\/(.*)\/templates\/licenses\/testing/).replyOnce(200, { - content: 'testing content', - }); - }); - - it('dispatches setFileTemplate if template already has content', done => { - const template = { - content: 'already has content', - }; - - testAction( - actions.fetchTemplate, - template, - state, - [], - [{ type: 'setFileTemplate', payload: template }], - done, - ); - }); - - it('dispatches success', done => { - const template = { - key: 'mit', - }; - - state.selectedTemplateType = { - key: 'licenses', - }; - - testAction( - actions.fetchTemplate, - template, - state, - [], - [{ type: 'setFileTemplate', payload: { content: 'MIT content' } }], - done, - ); - }); - - it('dispatches success and uses name key for API call', done => { - const template = { - name: 'testing', - }; - - state.selectedTemplateType = { - key: 'licenses', - }; - - testAction( - actions.fetchTemplate, - template, - state, - [], - [{ type: 'setFileTemplate', payload: { content: 'testing content' } }], - done, - ); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(/api\/(.*)\/templates\/licenses\/mit/).replyOnce(500); - }); - - it('dispatches error', done => { - const template = { - name: 'testing', - }; - - state.selectedTemplateType = { - key: 'licenses', - }; - - testAction( - actions.fetchTemplate, - template, - state, - [], - [{ type: 'receiveTemplateError', payload: template }], - done, - ); - }); - }); - }); - - describe('setFileTemplate', () => { - it('dispatches changeFileContent', () => { - const dispatch = jasmine.createSpy('dispatch'); - const commit = jasmine.createSpy('commit'); - const rootGetters = { - activeFile: { path: 'test' }, - }; - - actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' }); - - expect(dispatch).toHaveBeenCalledWith( - 'changeFileContent', - { path: 'test', content: 'content' }, - { root: true }, - ); - }); - - it('commits SET_UPDATE_SUCCESS', () => { - const dispatch = jasmine.createSpy('dispatch'); - const commit = jasmine.createSpy('commit'); - const rootGetters = { - activeFile: { path: 'test' }, - }; - - actions.setFileTemplate({ dispatch, commit, rootGetters }, { content: 'content' }); - - expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', true); - }); - }); - - describe('undoFileTemplate', () => { - it('dispatches changeFileContent', () => { - const dispatch = jasmine.createSpy('dispatch'); - const commit = jasmine.createSpy('commit'); - const rootGetters = { - activeFile: { path: 'test', raw: 'raw content' }, - }; - - actions.undoFileTemplate({ dispatch, commit, rootGetters }); - - expect(dispatch).toHaveBeenCalledWith( - 'changeFileContent', - { path: 'test', content: 'raw content' }, - { root: true }, - ); - }); - - it('commits SET_UPDATE_SUCCESS', () => { - const dispatch = jasmine.createSpy('dispatch'); - const commit = jasmine.createSpy('commit'); - const rootGetters = { - activeFile: { path: 'test', raw: 'raw content' }, - }; - - actions.undoFileTemplate({ dispatch, commit, rootGetters }); - - expect(commit).toHaveBeenCalledWith('SET_UPDATE_SUCCESS', false); - }); - - it('dispatches discardFileChanges if file has prevPath', () => { - const dispatch = jasmine.createSpy('dispatch'); - const rootGetters = { - activeFile: { path: 'test', prevPath: 'newtest', raw: 'raw content' }, - }; - - actions.undoFileTemplate({ dispatch, commit() {}, rootGetters }); - - expect(dispatch.calls.mostRecent().args).toEqual([ - 'discardFileChanges', - 'test', - { root: true }, - ]); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/merge_requests/actions_spec.js b/spec/javascripts/ide/stores/modules/merge_requests/actions_spec.js deleted file mode 100644 index 9e2ba1f5ce9..00000000000 --- a/spec/javascripts/ide/stores/modules/merge_requests/actions_spec.js +++ /dev/null @@ -1,226 +0,0 @@ -import MockAdapter from 'axios-mock-adapter'; -import axios from '~/lib/utils/axios_utils'; -import state from '~/ide/stores/modules/merge_requests/state'; -import * as types from '~/ide/stores/modules/merge_requests/mutation_types'; -import { - requestMergeRequests, - receiveMergeRequestsError, - receiveMergeRequestsSuccess, - fetchMergeRequests, - resetMergeRequests, -} from '~/ide/stores/modules/merge_requests/actions'; -import { mergeRequests } from '../../../mock_data'; -import testAction from '../../../../helpers/vuex_action_helper'; - -describe('IDE merge requests actions', () => { - let mockedState; - let mockedRootState; - let mock; - - beforeEach(() => { - mockedState = state(); - mockedRootState = { - currentProjectId: 7, - }; - mock = new MockAdapter(axios); - }); - - afterEach(() => { - mock.restore(); - }); - - describe('requestMergeRequests', () => { - it('should commit request', done => { - testAction( - requestMergeRequests, - null, - mockedState, - [{ type: types.REQUEST_MERGE_REQUESTS }], - [], - done, - ); - }); - }); - - describe('receiveMergeRequestsError', () => { - it('should commit error', done => { - testAction( - receiveMergeRequestsError, - { type: 'created', search: '' }, - mockedState, - [{ type: types.RECEIVE_MERGE_REQUESTS_ERROR }], - [ - { - type: 'setErrorMessage', - payload: { - text: 'Error loading merge requests.', - action: jasmine.any(Function), - actionText: 'Please try again', - actionPayload: { type: 'created', search: '' }, - }, - }, - ], - done, - ); - }); - }); - - describe('receiveMergeRequestsSuccess', () => { - it('should commit received data', done => { - testAction( - receiveMergeRequestsSuccess, - mergeRequests, - mockedState, - [ - { - type: types.RECEIVE_MERGE_REQUESTS_SUCCESS, - payload: mergeRequests, - }, - ], - [], - done, - ); - }); - }); - - describe('fetchMergeRequests', () => { - beforeEach(() => { - gon.api_version = 'v4'; - }); - - describe('success', () => { - beforeEach(() => { - mock.onGet(/\/api\/v4\/merge_requests\/?/).replyOnce(200, mergeRequests); - }); - - it('calls API with params', () => { - const apiSpy = spyOn(axios, 'get').and.callThrough(); - - fetchMergeRequests( - { dispatch() {}, state: mockedState, rootState: mockedRootState }, - { type: 'created' }, - ); - - expect(apiSpy).toHaveBeenCalledWith(jasmine.anything(), { - params: { - scope: 'created-by-me', - state: 'opened', - search: '', - }, - }); - }); - - it('calls API with search', () => { - const apiSpy = spyOn(axios, 'get').and.callThrough(); - - fetchMergeRequests( - { dispatch() {}, state: mockedState, rootState: mockedRootState }, - { type: 'created', search: 'testing search' }, - ); - - expect(apiSpy).toHaveBeenCalledWith(jasmine.anything(), { - params: { - scope: 'created-by-me', - state: 'opened', - search: 'testing search', - }, - }); - }); - - it('dispatches success with received data', done => { - testAction( - fetchMergeRequests, - { type: 'created' }, - mockedState, - [], - [ - { type: 'requestMergeRequests' }, - { type: 'resetMergeRequests' }, - { - type: 'receiveMergeRequestsSuccess', - payload: mergeRequests, - }, - ], - done, - ); - }); - }); - - describe('success without type', () => { - beforeEach(() => { - mock.onGet(/\/api\/v4\/projects\/.+\/merge_requests\/?$/).replyOnce(200, mergeRequests); - }); - - it('calls API with project', () => { - const apiSpy = spyOn(axios, 'get').and.callThrough(); - - fetchMergeRequests( - { dispatch() {}, state: mockedState, rootState: mockedRootState }, - { type: null, search: 'testing search' }, - ); - - expect(apiSpy).toHaveBeenCalledWith( - jasmine.stringMatching(`projects/${mockedRootState.currentProjectId}/merge_requests`), - { - params: { - state: 'opened', - search: 'testing search', - }, - }, - ); - }); - - it('dispatches success with received data', done => { - testAction( - fetchMergeRequests, - { type: null }, - { ...mockedState, ...mockedRootState }, - [], - [ - { type: 'requestMergeRequests' }, - { type: 'resetMergeRequests' }, - { - type: 'receiveMergeRequestsSuccess', - payload: mergeRequests, - }, - ], - done, - ); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(/\/api\/v4\/merge_requests(.*)$/).replyOnce(500); - }); - - it('dispatches error', done => { - testAction( - fetchMergeRequests, - { type: 'created', search: '' }, - mockedState, - [], - [ - { type: 'requestMergeRequests' }, - { type: 'resetMergeRequests' }, - { type: 'receiveMergeRequestsError', payload: { type: 'created', search: '' } }, - ], - done, - ); - }); - }); - }); - - describe('resetMergeRequests', () => { - it('commits reset', done => { - testAction( - resetMergeRequests, - null, - mockedState, - [{ type: types.RESET_MERGE_REQUESTS }], - [], - done, - ); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/merge_requests/mutations_spec.js b/spec/javascripts/ide/stores/modules/merge_requests/mutations_spec.js deleted file mode 100644 index 664d3914564..00000000000 --- a/spec/javascripts/ide/stores/modules/merge_requests/mutations_spec.js +++ /dev/null @@ -1,55 +0,0 @@ -import state from '~/ide/stores/modules/merge_requests/state'; -import mutations from '~/ide/stores/modules/merge_requests/mutations'; -import * as types from '~/ide/stores/modules/merge_requests/mutation_types'; -import { mergeRequests } from '../../../mock_data'; - -describe('IDE merge requests mutations', () => { - let mockedState; - - beforeEach(() => { - mockedState = state(); - }); - - describe(types.REQUEST_MERGE_REQUESTS, () => { - it('sets loading to true', () => { - mutations[types.REQUEST_MERGE_REQUESTS](mockedState); - - expect(mockedState.isLoading).toBe(true); - }); - }); - - describe(types.RECEIVE_MERGE_REQUESTS_ERROR, () => { - it('sets loading to false', () => { - mutations[types.RECEIVE_MERGE_REQUESTS_ERROR](mockedState); - - expect(mockedState.isLoading).toBe(false); - }); - }); - - describe(types.RECEIVE_MERGE_REQUESTS_SUCCESS, () => { - it('sets merge requests', () => { - gon.gitlab_url = gl.TEST_HOST; - mutations[types.RECEIVE_MERGE_REQUESTS_SUCCESS](mockedState, mergeRequests); - - expect(mockedState.mergeRequests).toEqual([ - { - id: 1, - iid: 1, - title: 'Test merge request', - projectId: 1, - projectPathWithNamespace: 'namespace/project-path', - }, - ]); - }); - }); - - describe(types.RESET_MERGE_REQUESTS, () => { - it('clears merge request array', () => { - mockedState.mergeRequests = ['test']; - - mutations[types.RESET_MERGE_REQUESTS](mockedState); - - expect(mockedState.mergeRequests).toEqual([]); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/pane/actions_spec.js b/spec/javascripts/ide/stores/modules/pane/actions_spec.js index 9345a58746a..e69de29bb2d 100644 --- a/spec/javascripts/ide/stores/modules/pane/actions_spec.js +++ b/spec/javascripts/ide/stores/modules/pane/actions_spec.js @@ -1,66 +0,0 @@ -import testAction from 'spec/helpers/vuex_action_helper'; -import * as actions from '~/ide/stores/modules/pane/actions'; -import * as types from '~/ide/stores/modules/pane/mutation_types'; - -describe('IDE pane module actions', () => { - const TEST_VIEW = { name: 'test' }; - const TEST_VIEW_KEEP_ALIVE = { name: 'test-keep-alive', keepAlive: true }; - - describe('toggleOpen', () => { - it('dispatches open if closed', done => { - testAction( - actions.toggleOpen, - TEST_VIEW, - { isOpen: false }, - [], - [{ type: 'open', payload: TEST_VIEW }], - done, - ); - }); - - it('dispatches close if opened', done => { - testAction(actions.toggleOpen, TEST_VIEW, { isOpen: true }, [], [{ type: 'close' }], done); - }); - }); - - describe('open', () => { - it('commits SET_OPEN', done => { - testAction(actions.open, null, {}, [{ type: types.SET_OPEN, payload: true }], [], done); - }); - - it('commits SET_CURRENT_VIEW if view is given', done => { - testAction( - actions.open, - TEST_VIEW, - {}, - [ - { type: types.SET_OPEN, payload: true }, - { type: types.SET_CURRENT_VIEW, payload: TEST_VIEW.name }, - ], - [], - done, - ); - }); - - it('commits KEEP_ALIVE_VIEW if keepAlive is true', done => { - testAction( - actions.open, - TEST_VIEW_KEEP_ALIVE, - {}, - [ - { type: types.SET_OPEN, payload: true }, - { type: types.SET_CURRENT_VIEW, payload: TEST_VIEW_KEEP_ALIVE.name }, - { type: types.KEEP_ALIVE_VIEW, payload: TEST_VIEW_KEEP_ALIVE.name }, - ], - [], - done, - ); - }); - }); - - describe('close', () => { - it('commits SET_OPEN', done => { - testAction(actions.close, null, {}, [{ type: types.SET_OPEN, payload: false }], [], done); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js b/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js deleted file mode 100644 index 0937ee38390..00000000000 --- a/spec/javascripts/ide/stores/modules/pipelines/actions_spec.js +++ /dev/null @@ -1,457 +0,0 @@ -import Visibility from 'visibilityjs'; -import MockAdapter from 'axios-mock-adapter'; -import axios from '~/lib/utils/axios_utils'; -import { - requestLatestPipeline, - receiveLatestPipelineError, - receiveLatestPipelineSuccess, - fetchLatestPipeline, - stopPipelinePolling, - clearEtagPoll, - requestJobs, - receiveJobsError, - receiveJobsSuccess, - fetchJobs, - toggleStageCollapsed, - setDetailJob, - requestJobTrace, - receiveJobTraceError, - receiveJobTraceSuccess, - fetchJobTrace, - resetLatestPipeline, -} from '~/ide/stores/modules/pipelines/actions'; -import state from '~/ide/stores/modules/pipelines/state'; -import * as types from '~/ide/stores/modules/pipelines/mutation_types'; -import { rightSidebarViews } from '~/ide/constants'; -import testAction from '../../../../helpers/vuex_action_helper'; -import { pipelines, jobs } from '../../../mock_data'; - -describe('IDE pipelines actions', () => { - let mockedState; - let mock; - - beforeEach(() => { - mockedState = state(); - mock = new MockAdapter(axios); - - gon.api_version = 'v4'; - mockedState.currentProjectId = 'test/project'; - }); - - afterEach(() => { - mock.restore(); - }); - - describe('requestLatestPipeline', () => { - it('commits request', done => { - testAction( - requestLatestPipeline, - null, - mockedState, - [{ type: types.REQUEST_LATEST_PIPELINE }], - [], - done, - ); - }); - }); - - describe('receiveLatestPipelineError', () => { - it('commits error', done => { - testAction( - receiveLatestPipelineError, - { status: 404 }, - mockedState, - [{ type: types.RECEIVE_LASTEST_PIPELINE_ERROR }], - [{ type: 'stopPipelinePolling' }], - done, - ); - }); - - it('dispatches setErrorMessage is not 404', done => { - testAction( - receiveLatestPipelineError, - { status: 500 }, - mockedState, - [{ type: types.RECEIVE_LASTEST_PIPELINE_ERROR }], - [ - { - type: 'setErrorMessage', - payload: { - text: 'An error occurred whilst fetching the latest pipeline.', - action: jasmine.any(Function), - actionText: 'Please try again', - actionPayload: null, - }, - }, - { type: 'stopPipelinePolling' }, - ], - done, - ); - }); - }); - - describe('receiveLatestPipelineSuccess', () => { - const rootGetters = { - lastCommit: { id: '123' }, - }; - let commit; - - beforeEach(() => { - commit = jasmine.createSpy('commit'); - }); - - it('commits pipeline', () => { - receiveLatestPipelineSuccess({ rootGetters, commit }, { pipelines }); - - expect(commit.calls.argsFor(0)).toEqual([ - types.RECEIVE_LASTEST_PIPELINE_SUCCESS, - pipelines[0], - ]); - }); - - it('commits false when there are no pipelines', () => { - receiveLatestPipelineSuccess({ rootGetters, commit }, { pipelines: [] }); - - expect(commit.calls.argsFor(0)).toEqual([types.RECEIVE_LASTEST_PIPELINE_SUCCESS, false]); - }); - }); - - describe('fetchLatestPipeline', () => { - beforeEach(() => { - jasmine.clock().install(); - }); - - afterEach(() => { - jasmine.clock().uninstall(); - stopPipelinePolling(); - clearEtagPoll(); - }); - - describe('success', () => { - beforeEach(() => { - mock - .onGet('/abc/def/commit/abc123def456ghi789jkl/pipelines') - .reply(200, { data: { foo: 'bar' } }, { 'poll-interval': '10000' }); - }); - - it('dispatches request', done => { - spyOn(axios, 'get').and.callThrough(); - spyOn(Visibility, 'hidden').and.returnValue(false); - - const dispatch = jasmine.createSpy('dispatch'); - const rootGetters = { - lastCommit: { id: 'abc123def456ghi789jkl' }, - currentProject: { path_with_namespace: 'abc/def' }, - }; - - fetchLatestPipeline({ dispatch, rootGetters }); - - expect(dispatch.calls.argsFor(0)).toEqual(['requestLatestPipeline']); - - jasmine.clock().tick(1000); - - new Promise(resolve => requestAnimationFrame(resolve)) - .then(() => { - expect(axios.get).toHaveBeenCalled(); - expect(axios.get.calls.count()).toBe(1); - - expect(dispatch.calls.argsFor(1)).toEqual([ - 'receiveLatestPipelineSuccess', - jasmine.anything(), - ]); - - jasmine.clock().tick(10000); - }) - .then(() => new Promise(resolve => requestAnimationFrame(resolve))) - .then(() => { - expect(axios.get).toHaveBeenCalled(); - expect(axios.get.calls.count()).toBe(2); - - expect(dispatch.calls.argsFor(2)).toEqual([ - 'receiveLatestPipelineSuccess', - jasmine.anything(), - ]); - }) - .then(done) - .catch(done.fail); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet('/abc/def/commit/abc123def456ghi789jkl/pipelines').reply(500); - }); - - it('dispatches error', done => { - const dispatch = jasmine.createSpy('dispatch'); - const rootGetters = { - lastCommit: { id: 'abc123def456ghi789jkl' }, - currentProject: { path_with_namespace: 'abc/def' }, - }; - - fetchLatestPipeline({ dispatch, rootGetters }); - - jasmine.clock().tick(1500); - - new Promise(resolve => requestAnimationFrame(resolve)) - .then(() => { - expect(dispatch.calls.argsFor(1)).toEqual([ - 'receiveLatestPipelineError', - jasmine.anything(), - ]); - }) - .then(done) - .catch(done.fail); - }); - }); - }); - - describe('requestJobs', () => { - it('commits request', done => { - testAction(requestJobs, 1, mockedState, [{ type: types.REQUEST_JOBS, payload: 1 }], [], done); - }); - }); - - describe('receiveJobsError', () => { - it('commits error', done => { - testAction( - receiveJobsError, - { id: 1 }, - mockedState, - [{ type: types.RECEIVE_JOBS_ERROR, payload: 1 }], - [ - { - type: 'setErrorMessage', - payload: { - text: 'An error occurred whilst loading the pipelines jobs.', - action: jasmine.anything(), - actionText: 'Please try again', - actionPayload: { id: 1 }, - }, - }, - ], - done, - ); - }); - }); - - describe('receiveJobsSuccess', () => { - it('commits data', done => { - testAction( - receiveJobsSuccess, - { id: 1, data: jobs }, - mockedState, - [{ type: types.RECEIVE_JOBS_SUCCESS, payload: { id: 1, data: jobs } }], - [], - done, - ); - }); - }); - - describe('fetchJobs', () => { - const stage = { - id: 1, - dropdownPath: `${gl.TEST_HOST}/jobs`, - }; - - describe('success', () => { - beforeEach(() => { - mock.onGet(stage.dropdownPath).replyOnce(200, jobs); - }); - - it('dispatches request', done => { - testAction( - fetchJobs, - stage, - mockedState, - [], - [ - { type: 'requestJobs', payload: stage.id }, - { type: 'receiveJobsSuccess', payload: { id: stage.id, data: jobs } }, - ], - done, - ); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(stage.dropdownPath).replyOnce(500); - }); - - it('dispatches error', done => { - testAction( - fetchJobs, - stage, - mockedState, - [], - [ - { type: 'requestJobs', payload: stage.id }, - { type: 'receiveJobsError', payload: stage }, - ], - done, - ); - }); - }); - }); - - describe('toggleStageCollapsed', () => { - it('commits collapse', done => { - testAction( - toggleStageCollapsed, - 1, - mockedState, - [{ type: types.TOGGLE_STAGE_COLLAPSE, payload: 1 }], - [], - done, - ); - }); - }); - - describe('setDetailJob', () => { - it('commits job', done => { - testAction( - setDetailJob, - 'job', - mockedState, - [{ type: types.SET_DETAIL_JOB, payload: 'job' }], - [{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }], - done, - ); - }); - - it('dispatches rightPane/open as pipeline when job is null', done => { - testAction( - setDetailJob, - null, - mockedState, - [{ type: types.SET_DETAIL_JOB, payload: null }], - [{ type: 'rightPane/open', payload: rightSidebarViews.pipelines }], - done, - ); - }); - - it('dispatches rightPane/open as job', done => { - testAction( - setDetailJob, - 'job', - mockedState, - [{ type: types.SET_DETAIL_JOB, payload: 'job' }], - [{ type: 'rightPane/open', payload: rightSidebarViews.jobsDetail }], - done, - ); - }); - }); - - describe('requestJobTrace', () => { - it('commits request', done => { - testAction(requestJobTrace, null, mockedState, [{ type: types.REQUEST_JOB_TRACE }], [], done); - }); - }); - - describe('receiveJobTraceError', () => { - it('commits error', done => { - testAction( - receiveJobTraceError, - null, - mockedState, - [{ type: types.RECEIVE_JOB_TRACE_ERROR }], - [ - { - type: 'setErrorMessage', - payload: { - text: 'An error occurred whilst fetching the job trace.', - action: jasmine.any(Function), - actionText: 'Please try again', - actionPayload: null, - }, - }, - ], - done, - ); - }); - }); - - describe('receiveJobTraceSuccess', () => { - it('commits data', done => { - testAction( - receiveJobTraceSuccess, - 'data', - mockedState, - [{ type: types.RECEIVE_JOB_TRACE_SUCCESS, payload: 'data' }], - [], - done, - ); - }); - }); - - describe('fetchJobTrace', () => { - beforeEach(() => { - mockedState.detailJob = { - path: `${gl.TEST_HOST}/project/builds`, - }; - }); - - describe('success', () => { - beforeEach(() => { - spyOn(axios, 'get').and.callThrough(); - mock.onGet(`${gl.TEST_HOST}/project/builds/trace`).replyOnce(200, { html: 'html' }); - }); - - it('dispatches request', done => { - testAction( - fetchJobTrace, - null, - mockedState, - [], - [ - { type: 'requestJobTrace' }, - { type: 'receiveJobTraceSuccess', payload: { html: 'html' } }, - ], - done, - ); - }); - - it('sends get request to correct URL', () => { - fetchJobTrace({ state: mockedState, dispatch() {} }); - - expect(axios.get).toHaveBeenCalledWith(`${gl.TEST_HOST}/project/builds/trace`, { - params: { format: 'json' }, - }); - }); - }); - - describe('error', () => { - beforeEach(() => { - mock.onGet(`${gl.TEST_HOST}/project/builds/trace`).replyOnce(500); - }); - - it('dispatches error', done => { - testAction( - fetchJobTrace, - null, - mockedState, - [], - [{ type: 'requestJobTrace' }, { type: 'receiveJobTraceError' }], - done, - ); - }); - }); - }); - - describe('resetLatestPipeline', () => { - it('commits reset mutations', done => { - testAction( - resetLatestPipeline, - null, - mockedState, - [ - { type: types.RECEIVE_LASTEST_PIPELINE_SUCCESS, payload: null }, - { type: types.SET_DETAIL_JOB, payload: null }, - ], - [], - done, - ); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/modules/pipelines/mutations_spec.js b/spec/javascripts/ide/stores/modules/pipelines/mutations_spec.js deleted file mode 100644 index b558c45f574..00000000000 --- a/spec/javascripts/ide/stores/modules/pipelines/mutations_spec.js +++ /dev/null @@ -1,231 +0,0 @@ -import mutations from '~/ide/stores/modules/pipelines/mutations'; -import state from '~/ide/stores/modules/pipelines/state'; -import * as types from '~/ide/stores/modules/pipelines/mutation_types'; -import { fullPipelinesResponse, stages, jobs } from '../../../mock_data'; - -describe('IDE pipelines mutations', () => { - let mockedState; - - beforeEach(() => { - mockedState = state(); - }); - - describe(types.REQUEST_LATEST_PIPELINE, () => { - it('sets loading to true', () => { - mutations[types.REQUEST_LATEST_PIPELINE](mockedState); - - expect(mockedState.isLoadingPipeline).toBe(true); - }); - }); - - describe(types.RECEIVE_LASTEST_PIPELINE_ERROR, () => { - it('sets loading to false', () => { - mutations[types.RECEIVE_LASTEST_PIPELINE_ERROR](mockedState); - - expect(mockedState.isLoadingPipeline).toBe(false); - }); - }); - - describe(types.RECEIVE_LASTEST_PIPELINE_SUCCESS, () => { - const itSetsPipelineLoadingStates = () => { - it('sets has loaded to true', () => { - expect(mockedState.hasLoadedPipeline).toBe(true); - }); - - it('sets loading to false on success', () => { - expect(mockedState.isLoadingPipeline).toBe(false); - }); - }; - - describe('with pipeline', () => { - beforeEach(() => { - mutations[types.RECEIVE_LASTEST_PIPELINE_SUCCESS]( - mockedState, - fullPipelinesResponse.data.pipelines[0], - ); - }); - - itSetsPipelineLoadingStates(); - - it('sets latestPipeline', () => { - expect(mockedState.latestPipeline).toEqual({ - id: '51', - path: 'test', - commit: { id: '123' }, - details: { status: jasmine.any(Object) }, - yamlError: undefined, - }); - }); - - it('sets stages', () => { - expect(mockedState.stages.length).toBe(2); - expect(mockedState.stages).toEqual([ - { - id: 0, - dropdownPath: stages[0].dropdown_path, - name: stages[0].name, - status: stages[0].status, - isCollapsed: false, - isLoading: false, - jobs: [], - }, - { - id: 1, - dropdownPath: stages[1].dropdown_path, - name: stages[1].name, - status: stages[1].status, - isCollapsed: false, - isLoading: false, - jobs: [], - }, - ]); - }); - }); - - describe('with null', () => { - beforeEach(() => { - mutations[types.RECEIVE_LASTEST_PIPELINE_SUCCESS](mockedState, null); - }); - - itSetsPipelineLoadingStates(); - - it('does not set latest pipeline if pipeline is null', () => { - expect(mockedState.latestPipeline).toEqual(null); - }); - }); - }); - - describe(types.REQUEST_JOBS, () => { - beforeEach(() => { - mockedState.stages = stages.map((stage, i) => ({ - ...stage, - id: i, - })); - }); - - it('sets isLoading on stage', () => { - mutations[types.REQUEST_JOBS](mockedState, mockedState.stages[0].id); - - expect(mockedState.stages[0].isLoading).toBe(true); - }); - }); - - describe(types.RECEIVE_JOBS_ERROR, () => { - beforeEach(() => { - mockedState.stages = stages.map((stage, i) => ({ - ...stage, - id: i, - })); - }); - - it('sets isLoading on stage after error', () => { - mutations[types.RECEIVE_JOBS_ERROR](mockedState, mockedState.stages[0].id); - - expect(mockedState.stages[0].isLoading).toBe(false); - }); - }); - - describe(types.RECEIVE_JOBS_SUCCESS, () => { - let data; - - beforeEach(() => { - mockedState.stages = stages.map((stage, i) => ({ - ...stage, - id: i, - })); - - data = { - latest_statuses: [...jobs], - }; - }); - - it('updates loading', () => { - mutations[types.RECEIVE_JOBS_SUCCESS](mockedState, { id: mockedState.stages[0].id, data }); - - expect(mockedState.stages[0].isLoading).toBe(false); - }); - - it('sets jobs on stage', () => { - mutations[types.RECEIVE_JOBS_SUCCESS](mockedState, { id: mockedState.stages[0].id, data }); - - expect(mockedState.stages[0].jobs.length).toBe(jobs.length); - expect(mockedState.stages[0].jobs).toEqual( - jobs.map(job => ({ - id: job.id, - name: job.name, - status: job.status, - path: job.build_path, - rawPath: `${job.build_path}/raw`, - started: job.started, - isLoading: false, - output: '', - })), - ); - }); - }); - - describe(types.TOGGLE_STAGE_COLLAPSE, () => { - beforeEach(() => { - mockedState.stages = stages.map((stage, i) => ({ - ...stage, - id: i, - isCollapsed: false, - })); - }); - - it('toggles collapsed state', () => { - mutations[types.TOGGLE_STAGE_COLLAPSE](mockedState, mockedState.stages[0].id); - - expect(mockedState.stages[0].isCollapsed).toBe(true); - - mutations[types.TOGGLE_STAGE_COLLAPSE](mockedState, mockedState.stages[0].id); - - expect(mockedState.stages[0].isCollapsed).toBe(false); - }); - }); - - describe(types.SET_DETAIL_JOB, () => { - it('sets detail job', () => { - mutations[types.SET_DETAIL_JOB](mockedState, jobs[0]); - - expect(mockedState.detailJob).toEqual(jobs[0]); - }); - }); - - describe(types.REQUEST_JOB_TRACE, () => { - beforeEach(() => { - mockedState.detailJob = { ...jobs[0] }; - }); - - it('sets loading on detail job', () => { - mutations[types.REQUEST_JOB_TRACE](mockedState); - - expect(mockedState.detailJob.isLoading).toBe(true); - }); - }); - - describe(types.RECEIVE_JOB_TRACE_ERROR, () => { - beforeEach(() => { - mockedState.detailJob = { ...jobs[0], isLoading: true }; - }); - - it('sets loading to false on detail job', () => { - mutations[types.RECEIVE_JOB_TRACE_ERROR](mockedState); - - expect(mockedState.detailJob.isLoading).toBe(false); - }); - }); - - describe(types.RECEIVE_JOB_TRACE_SUCCESS, () => { - beforeEach(() => { - mockedState.detailJob = { ...jobs[0], isLoading: true }; - }); - - it('sets output on detail job', () => { - mutations[types.RECEIVE_JOB_TRACE_SUCCESS](mockedState, { html: 'html' }); - - expect(mockedState.detailJob.output).toBe('html'); - expect(mockedState.detailJob.isLoading).toBe(false); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/mutations/file_spec.js b/spec/javascripts/ide/stores/mutations/file_spec.js deleted file mode 100644 index 7c46bf55318..00000000000 --- a/spec/javascripts/ide/stores/mutations/file_spec.js +++ /dev/null @@ -1,469 +0,0 @@ -import mutations from '~/ide/stores/mutations/file'; -import state from '~/ide/stores/state'; -import { FILE_VIEW_MODE_PREVIEW } from '~/ide/constants'; -import { file } from '../../helpers'; - -describe('IDE store file mutations', () => { - let localState; - let localFile; - - beforeEach(() => { - localState = state(); - localFile = { - ...file(), - type: 'blob', - }; - - localState.entries[localFile.path] = localFile; - }); - - describe('SET_FILE_ACTIVE', () => { - it('sets the file active', () => { - mutations.SET_FILE_ACTIVE(localState, { - path: localFile.path, - active: true, - }); - - expect(localFile.active).toBeTruthy(); - }); - - it('sets pending tab as not active', () => { - localState.openFiles.push({ - ...localFile, - pending: true, - active: true, - }); - - mutations.SET_FILE_ACTIVE(localState, { - path: localFile.path, - active: true, - }); - - expect(localState.openFiles[0].active).toBe(false); - }); - }); - - describe('TOGGLE_FILE_OPEN', () => { - beforeEach(() => { - mutations.TOGGLE_FILE_OPEN(localState, localFile.path); - }); - - it('adds into opened files', () => { - expect(localFile.opened).toBeTruthy(); - expect(localState.openFiles.length).toBe(1); - }); - - it('removes from opened files', () => { - mutations.TOGGLE_FILE_OPEN(localState, localFile.path); - - expect(localFile.opened).toBeFalsy(); - expect(localState.openFiles.length).toBe(0); - }); - }); - - describe('SET_FILE_DATA', () => { - it('sets extra file data', () => { - mutations.SET_FILE_DATA(localState, { - data: { - blame_path: 'blame', - commits_path: 'commits', - permalink: 'permalink', - raw_path: 'raw', - binary: true, - render_error: 'render_error', - }, - file: localFile, - }); - - expect(localFile.blamePath).toBe('blame'); - expect(localFile.commitsPath).toBe('commits'); - expect(localFile.permalink).toBe('permalink'); - expect(localFile.rawPath).toBe('raw'); - expect(localFile.binary).toBeTruthy(); - expect(localFile.renderError).toBe('render_error'); - expect(localFile.raw).toBeNull(); - expect(localFile.baseRaw).toBeNull(); - }); - - it('sets extra file data to all arrays concerned', () => { - localState.stagedFiles = [localFile]; - localState.changedFiles = [localFile]; - localState.openFiles = [localFile]; - - const rawPath = 'foo/bar/blah.md'; - - mutations.SET_FILE_DATA(localState, { - data: { - raw_path: rawPath, - }, - file: localFile, - }); - - expect(localState.stagedFiles[0].rawPath).toEqual(rawPath); - expect(localState.changedFiles[0].rawPath).toEqual(rawPath); - expect(localState.openFiles[0].rawPath).toEqual(rawPath); - expect(localFile.rawPath).toEqual(rawPath); - }); - - it('does not mutate certain props on the file', () => { - const path = 'New Path'; - const name = 'New Name'; - localFile.path = path; - localFile.name = name; - - localState.stagedFiles = [localFile]; - localState.changedFiles = [localFile]; - localState.openFiles = [localFile]; - - mutations.SET_FILE_DATA(localState, { - data: { - path: 'Old Path', - name: 'Old Name', - raw: 'Old Raw', - base_raw: 'Old Base Raw', - }, - file: localFile, - }); - - [ - localState.stagedFiles[0], - localState.changedFiles[0], - localState.openFiles[0], - localFile, - ].forEach(f => { - expect(f).toEqual( - jasmine.objectContaining({ - path, - name, - raw: null, - baseRaw: null, - }), - ); - }); - }); - }); - - describe('SET_FILE_RAW_DATA', () => { - it('sets raw data', () => { - mutations.SET_FILE_RAW_DATA(localState, { - file: localFile, - raw: 'testing', - }); - - expect(localFile.raw).toBe('testing'); - }); - - it('adds raw data to open pending file', () => { - localState.openFiles.push({ - ...localFile, - pending: true, - }); - - mutations.SET_FILE_RAW_DATA(localState, { - file: localFile, - raw: 'testing', - }); - - expect(localState.openFiles[0].raw).toBe('testing'); - }); - - it('does not add raw data to open pending tempFile file', () => { - localState.openFiles.push({ - ...localFile, - pending: true, - tempFile: true, - }); - - mutations.SET_FILE_RAW_DATA(localState, { - file: localFile, - raw: 'testing', - }); - - expect(localState.openFiles[0].raw).not.toBe('testing'); - }); - }); - - describe('SET_FILE_BASE_RAW_DATA', () => { - it('sets raw data from base branch', () => { - mutations.SET_FILE_BASE_RAW_DATA(localState, { - file: localFile, - baseRaw: 'testing', - }); - - expect(localFile.baseRaw).toBe('testing'); - }); - }); - - describe('UPDATE_FILE_CONTENT', () => { - beforeEach(() => { - localFile.raw = 'test'; - }); - - it('sets content', () => { - mutations.UPDATE_FILE_CONTENT(localState, { - path: localFile.path, - content: 'test', - }); - - expect(localFile.content).toBe('test'); - }); - - it('sets changed if content does not match raw', () => { - mutations.UPDATE_FILE_CONTENT(localState, { - path: localFile.path, - content: 'testing', - }); - - expect(localFile.content).toBe('testing'); - expect(localFile.changed).toBeTruthy(); - }); - - it('sets changed if file is a temp file', () => { - localFile.tempFile = true; - - mutations.UPDATE_FILE_CONTENT(localState, { - path: localFile.path, - content: '', - }); - - expect(localFile.changed).toBeTruthy(); - }); - }); - - describe('SET_FILE_MERGE_REQUEST_CHANGE', () => { - it('sets file mr change', () => { - mutations.SET_FILE_MERGE_REQUEST_CHANGE(localState, { - file: localFile, - mrChange: { diff: 'ABC' }, - }); - - expect(localFile.mrChange.diff).toBe('ABC'); - }); - - it('has diffMode replaced by default', () => { - mutations.SET_FILE_MERGE_REQUEST_CHANGE(localState, { - file: localFile, - mrChange: { - diff: 'ABC', - }, - }); - - expect(localFile.mrChange.diffMode).toBe('replaced'); - }); - - it('has diffMode new', () => { - mutations.SET_FILE_MERGE_REQUEST_CHANGE(localState, { - file: localFile, - mrChange: { - diff: 'ABC', - new_file: true, - }, - }); - - expect(localFile.mrChange.diffMode).toBe('new'); - }); - - it('has diffMode deleted', () => { - mutations.SET_FILE_MERGE_REQUEST_CHANGE(localState, { - file: localFile, - mrChange: { - diff: 'ABC', - deleted_file: true, - }, - }); - - expect(localFile.mrChange.diffMode).toBe('deleted'); - }); - - it('has diffMode renamed', () => { - mutations.SET_FILE_MERGE_REQUEST_CHANGE(localState, { - file: localFile, - mrChange: { - diff: 'ABC', - renamed_file: true, - }, - }); - - expect(localFile.mrChange.diffMode).toBe('renamed'); - }); - }); - - describe('DISCARD_FILE_CHANGES', () => { - beforeEach(() => { - localFile.content = 'test'; - localFile.changed = true; - localState.currentProjectId = 'gitlab-ce'; - localState.currentBranchId = 'master'; - localState.trees['gitlab-ce/master'] = { - tree: [], - }; - }); - - it('resets content and changed', () => { - mutations.DISCARD_FILE_CHANGES(localState, localFile.path); - - expect(localFile.content).toBe(''); - expect(localFile.changed).toBeFalsy(); - }); - - it('adds to root tree if deleted', () => { - localFile.deleted = true; - - mutations.DISCARD_FILE_CHANGES(localState, localFile.path); - - expect(localState.trees['gitlab-ce/master'].tree).toEqual([ - { - ...localFile, - deleted: false, - }, - ]); - }); - - it('adds to parent tree if deleted', () => { - localFile.deleted = true; - localFile.parentPath = 'parentPath'; - localState.entries.parentPath = { - tree: [], - }; - - mutations.DISCARD_FILE_CHANGES(localState, localFile.path); - - expect(localState.entries.parentPath.tree).toEqual([ - { - ...localFile, - deleted: false, - }, - ]); - }); - }); - - describe('ADD_FILE_TO_CHANGED', () => { - it('adds file into changed files array', () => { - mutations.ADD_FILE_TO_CHANGED(localState, localFile.path); - - expect(localState.changedFiles.length).toBe(1); - }); - }); - - describe('REMOVE_FILE_FROM_CHANGED', () => { - it('removes files from changed files array', () => { - localState.changedFiles.push(localFile); - - mutations.REMOVE_FILE_FROM_CHANGED(localState, localFile.path); - - expect(localState.changedFiles.length).toBe(0); - }); - }); - - describe('STAGE_CHANGE', () => { - beforeEach(() => { - mutations.STAGE_CHANGE(localState, localFile.path); - }); - - it('adds file into stagedFiles array', () => { - expect(localState.stagedFiles.length).toBe(1); - expect(localState.stagedFiles[0]).toEqual(localFile); - }); - - it('updates stagedFile if it is already staged', () => { - localFile.raw = 'testing 123'; - - mutations.STAGE_CHANGE(localState, localFile.path); - - expect(localState.stagedFiles.length).toBe(1); - expect(localState.stagedFiles[0].raw).toEqual('testing 123'); - }); - }); - - describe('UNSTAGE_CHANGE', () => { - let f; - - beforeEach(() => { - f = { - ...file(), - type: 'blob', - staged: true, - }; - - localState.stagedFiles.push(f); - localState.changedFiles.push(f); - localState.entries[f.path] = f; - }); - - it('removes from stagedFiles array', () => { - mutations.UNSTAGE_CHANGE(localState, f.path); - - expect(localState.stagedFiles.length).toBe(0); - expect(localState.changedFiles.length).toBe(1); - }); - }); - - describe('TOGGLE_FILE_CHANGED', () => { - it('updates file changed status', () => { - mutations.TOGGLE_FILE_CHANGED(localState, { - file: localFile, - changed: true, - }); - - expect(localFile.changed).toBeTruthy(); - }); - }); - - describe('SET_FILE_VIEWMODE', () => { - it('updates file view mode', () => { - mutations.SET_FILE_VIEWMODE(localState, { - file: localFile, - viewMode: FILE_VIEW_MODE_PREVIEW, - }); - - expect(localFile.viewMode).toBe(FILE_VIEW_MODE_PREVIEW); - }); - }); - - describe('ADD_PENDING_TAB', () => { - beforeEach(() => { - const f = { - ...file('openFile'), - path: 'openFile', - active: true, - opened: true, - }; - - localState.entries[f.path] = f; - localState.openFiles.push(f); - }); - - it('adds file into openFiles as pending', () => { - mutations.ADD_PENDING_TAB(localState, { file: localFile }); - - expect(localState.openFiles.length).toBe(1); - expect(localState.openFiles[0].pending).toBe(true); - expect(localState.openFiles[0].key).toBe(`pending-${localFile.key}`); - }); - - it('only allows 1 open pending file', () => { - const newFile = file('test'); - localState.entries[newFile.path] = newFile; - - mutations.ADD_PENDING_TAB(localState, { file: localFile }); - - expect(localState.openFiles.length).toBe(1); - - mutations.ADD_PENDING_TAB(localState, { file: file('test') }); - - expect(localState.openFiles.length).toBe(1); - expect(localState.openFiles[0].name).toBe('test'); - }); - }); - - describe('REMOVE_PENDING_TAB', () => { - it('removes pending tab from openFiles', () => { - localFile.key = 'testing'; - localState.openFiles.push(localFile); - - mutations.REMOVE_PENDING_TAB(localState, localFile); - - expect(localState.openFiles.length).toBe(0); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/mutations/tree_spec.js b/spec/javascripts/ide/stores/mutations/tree_spec.js deleted file mode 100644 index 7f9c978aa46..00000000000 --- a/spec/javascripts/ide/stores/mutations/tree_spec.js +++ /dev/null @@ -1,116 +0,0 @@ -import mutations from '~/ide/stores/mutations/tree'; -import state from '~/ide/stores/state'; -import { file } from '../../helpers'; - -describe('Multi-file store tree mutations', () => { - let localState; - let localTree; - - beforeEach(() => { - localState = state(); - localTree = file(); - - localState.entries[localTree.path] = localTree; - }); - - describe('TOGGLE_TREE_OPEN', () => { - it('toggles tree open', () => { - mutations.TOGGLE_TREE_OPEN(localState, localTree.path); - - expect(localTree.opened).toBeTruthy(); - - mutations.TOGGLE_TREE_OPEN(localState, localTree.path); - - expect(localTree.opened).toBeFalsy(); - }); - }); - - describe('SET_DIRECTORY_DATA', () => { - let data; - - beforeEach(() => { - data = [file('tree'), file('foo'), file('blob')]; - }); - - it('adds directory data', () => { - localState.trees['project/master'] = { - tree: [], - }; - - mutations.SET_DIRECTORY_DATA(localState, { - data, - treePath: 'project/master', - }); - - const tree = localState.trees['project/master']; - - expect(tree.tree.length).toBe(3); - expect(tree.tree[0].name).toBe('tree'); - expect(tree.tree[1].name).toBe('foo'); - expect(tree.tree[2].name).toBe('blob'); - }); - - it('keeps loading state', () => { - mutations.CREATE_TREE(localState, { treePath: 'project/master' }); - mutations.SET_DIRECTORY_DATA(localState, { - data, - treePath: 'project/master', - }); - - expect(localState.trees['project/master'].loading).toBe(true); - }); - - it('does not override tree already in state, but merges the two with correct order', () => { - const openedFile = file('new'); - - localState.trees['project/master'] = { - loading: true, - tree: [openedFile], - }; - - mutations.SET_DIRECTORY_DATA(localState, { - data, - treePath: 'project/master', - }); - - const { tree } = localState.trees['project/master']; - - expect(tree.length).toBe(4); - expect(tree[0].name).toBe('blob'); - expect(tree[1].name).toBe('foo'); - expect(tree[2].name).toBe('new'); - expect(tree[3].name).toBe('tree'); - }); - - it('returns tree unchanged if the opened file is already in the tree', () => { - const openedFile = file('foo'); - localState.trees['project/master'] = { - loading: true, - tree: [openedFile], - }; - - mutations.SET_DIRECTORY_DATA(localState, { - data, - treePath: 'project/master', - }); - - const { tree } = localState.trees['project/master']; - - expect(tree.length).toBe(3); - - expect(tree[0].name).toBe('tree'); - expect(tree[1].name).toBe('foo'); - expect(tree[2].name).toBe('blob'); - }); - }); - - describe('REMOVE_ALL_CHANGES_FILES', () => { - it('removes all files from changedFiles state', () => { - localState.changedFiles.push(file('REMOVE_ALL_CHANGES_FILES')); - - mutations.REMOVE_ALL_CHANGES_FILES(localState); - - expect(localState.changedFiles.length).toBe(0); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/mutations_spec.js b/spec/javascripts/ide/stores/mutations_spec.js deleted file mode 100644 index 7dd5d323f69..00000000000 --- a/spec/javascripts/ide/stores/mutations_spec.js +++ /dev/null @@ -1,711 +0,0 @@ -import mutations from '~/ide/stores/mutations'; -import state from '~/ide/stores/state'; -import { file } from '../helpers'; - -describe('Multi-file store mutations', () => { - let localState; - let entry; - - beforeEach(() => { - localState = state(); - entry = file(); - - localState.entries[entry.path] = entry; - }); - - describe('SET_INITIAL_DATA', () => { - it('sets all initial data', () => { - mutations.SET_INITIAL_DATA(localState, { - test: 'test', - }); - - expect(localState.test).toBe('test'); - }); - }); - - describe('TOGGLE_LOADING', () => { - it('toggles loading of entry', () => { - mutations.TOGGLE_LOADING(localState, { entry }); - - expect(entry.loading).toBeTruthy(); - - mutations.TOGGLE_LOADING(localState, { entry }); - - expect(entry.loading).toBeFalsy(); - }); - - it('toggles loading of entry and sets specific value', () => { - mutations.TOGGLE_LOADING(localState, { entry }); - - expect(entry.loading).toBeTruthy(); - - mutations.TOGGLE_LOADING(localState, { entry, forceValue: true }); - - expect(entry.loading).toBeTruthy(); - }); - }); - - describe('SET_LEFT_PANEL_COLLAPSED', () => { - it('sets left panel collapsed', () => { - mutations.SET_LEFT_PANEL_COLLAPSED(localState, true); - - expect(localState.leftPanelCollapsed).toBeTruthy(); - - mutations.SET_LEFT_PANEL_COLLAPSED(localState, false); - - expect(localState.leftPanelCollapsed).toBeFalsy(); - }); - }); - - describe('SET_RIGHT_PANEL_COLLAPSED', () => { - it('sets right panel collapsed', () => { - mutations.SET_RIGHT_PANEL_COLLAPSED(localState, true); - - expect(localState.rightPanelCollapsed).toBeTruthy(); - - mutations.SET_RIGHT_PANEL_COLLAPSED(localState, false); - - expect(localState.rightPanelCollapsed).toBeFalsy(); - }); - }); - - describe('CLEAR_STAGED_CHANGES', () => { - it('clears stagedFiles array', () => { - localState.stagedFiles.push('a'); - - mutations.CLEAR_STAGED_CHANGES(localState); - - expect(localState.stagedFiles.length).toBe(0); - }); - }); - - describe('UPDATE_VIEWER', () => { - it('sets viewer state', () => { - mutations.UPDATE_VIEWER(localState, 'diff'); - - expect(localState.viewer).toBe('diff'); - }); - }); - - describe('UPDATE_ACTIVITY_BAR_VIEW', () => { - it('updates currentActivityBar', () => { - mutations.UPDATE_ACTIVITY_BAR_VIEW(localState, 'test'); - - expect(localState.currentActivityView).toBe('test'); - }); - }); - - describe('SET_EMPTY_STATE_SVGS', () => { - it('updates empty state SVGs', () => { - mutations.SET_EMPTY_STATE_SVGS(localState, { - emptyStateSvgPath: 'emptyState', - noChangesStateSvgPath: 'noChanges', - committedStateSvgPath: 'commited', - }); - - expect(localState.emptyStateSvgPath).toBe('emptyState'); - expect(localState.noChangesStateSvgPath).toBe('noChanges'); - expect(localState.committedStateSvgPath).toBe('commited'); - }); - }); - - describe('CREATE_TMP_ENTRY', () => { - beforeEach(() => { - localState.currentProjectId = 'gitlab-ce'; - localState.currentBranchId = 'master'; - localState.trees['gitlab-ce/master'] = { - tree: [], - }; - }); - - it('creates temp entry in the tree', () => { - const tmpFile = file('test'); - mutations.CREATE_TMP_ENTRY(localState, { - data: { - entries: { - test: { - ...tmpFile, - tempFile: true, - changed: true, - }, - }, - treeList: [tmpFile], - }, - projectId: 'gitlab-ce', - branchId: 'master', - }); - - expect(localState.trees['gitlab-ce/master'].tree.length).toEqual(1); - expect(localState.entries.test.tempFile).toEqual(true); - }); - - it('marks entry as replacing previous entry if the old one has been deleted', () => { - const tmpFile = file('test'); - localState.entries.test = { - ...tmpFile, - deleted: true, - }; - mutations.CREATE_TMP_ENTRY(localState, { - data: { - entries: { - test: { - ...tmpFile, - tempFile: true, - changed: true, - }, - }, - treeList: [tmpFile], - }, - projectId: 'gitlab-ce', - branchId: 'master', - }); - - expect(localState.trees['gitlab-ce/master'].tree.length).toEqual(1); - expect(localState.entries.test.replaces).toEqual(true); - }); - }); - - describe('UPDATE_TEMP_FLAG', () => { - beforeEach(() => { - localState.entries.test = { - ...file(), - tempFile: true, - changed: true, - }; - }); - - it('updates tempFile flag', () => { - mutations.UPDATE_TEMP_FLAG(localState, { path: 'test', tempFile: false }); - - expect(localState.entries.test.tempFile).toBe(false); - }); - - it('updates changed flag', () => { - mutations.UPDATE_TEMP_FLAG(localState, { path: 'test', tempFile: false }); - - expect(localState.entries.test.changed).toBe(false); - }); - }); - - describe('TOGGLE_FILE_FINDER', () => { - it('updates fileFindVisible', () => { - mutations.TOGGLE_FILE_FINDER(localState, true); - - expect(localState.fileFindVisible).toBe(true); - }); - }); - - describe('BURST_UNUSED_SEAL', () => { - it('updates unusedSeal', () => { - expect(localState.unusedSeal).toBe(true); - - mutations.BURST_UNUSED_SEAL(localState); - - expect(localState.unusedSeal).toBe(false); - }); - }); - - describe('SET_ERROR_MESSAGE', () => { - it('updates error message', () => { - mutations.SET_ERROR_MESSAGE(localState, 'error'); - - expect(localState.errorMessage).toBe('error'); - }); - }); - - describe('DELETE_ENTRY', () => { - beforeEach(() => { - localState.currentProjectId = 'gitlab-ce'; - localState.currentBranchId = 'master'; - localState.trees['gitlab-ce/master'] = { - tree: [], - }; - }); - - it('sets deleted flag', () => { - localState.entries.filePath = { - deleted: false, - }; - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.entries.filePath.deleted).toBe(true); - }); - - it('removes from root tree', () => { - localState.entries.filePath = { - path: 'filePath', - deleted: false, - }; - localState.trees['gitlab-ce/master'].tree.push(localState.entries.filePath); - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.trees['gitlab-ce/master'].tree).toEqual([]); - }); - - it('removes from parent tree', () => { - localState.entries.filePath = { - path: 'filePath', - deleted: false, - parentPath: 'parentPath', - }; - localState.entries.parentPath = { - tree: [localState.entries.filePath], - }; - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.entries.parentPath.tree).toEqual([]); - }); - - it('adds to changedFiles', () => { - localState.entries.filePath = { - deleted: false, - type: 'blob', - }; - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.changedFiles).toEqual([localState.entries.filePath]); - }); - - it('does not add tempFile into changedFiles', () => { - localState.entries.filePath = { - deleted: false, - type: 'blob', - tempFile: true, - }; - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.changedFiles).toEqual([]); - }); - - it('removes tempFile from changedFiles when deleted', () => { - localState.entries.filePath = { - path: 'filePath', - deleted: false, - type: 'blob', - tempFile: true, - }; - - localState.changedFiles.push({ ...localState.entries.filePath }); - - mutations.DELETE_ENTRY(localState, 'filePath'); - - expect(localState.changedFiles).toEqual([]); - }); - }); - - describe('UPDATE_FILE_AFTER_COMMIT', () => { - it('updates URLs if prevPath is set', () => { - const f = { - ...file('test'), - prevPath: 'testing-123', - rawPath: `${gl.TEST_HOST}/testing-123`, - permalink: `${gl.TEST_HOST}/testing-123`, - commitsPath: `${gl.TEST_HOST}/testing-123`, - blamePath: `${gl.TEST_HOST}/testing-123`, - replaces: true, - }; - localState.entries.test = f; - localState.changedFiles.push(f); - - mutations.UPDATE_FILE_AFTER_COMMIT(localState, { file: f, lastCommit: { commit: {} } }); - - expect(f).toEqual( - jasmine.objectContaining({ - rawPath: `${gl.TEST_HOST}/test`, - permalink: `${gl.TEST_HOST}/test`, - commitsPath: `${gl.TEST_HOST}/test`, - blamePath: `${gl.TEST_HOST}/test`, - replaces: false, - prevId: undefined, - prevPath: undefined, - prevName: undefined, - prevUrl: undefined, - prevKey: undefined, - }), - ); - }); - }); - - describe('OPEN_NEW_ENTRY_MODAL', () => { - it('sets entryModal', () => { - localState.entries.testPath = file(); - - mutations.OPEN_NEW_ENTRY_MODAL(localState, { type: 'test', path: 'testPath' }); - - expect(localState.entryModal).toEqual({ - type: 'test', - path: 'testPath', - entry: localState.entries.testPath, - }); - }); - }); - - describe('RENAME_ENTRY', () => { - beforeEach(() => { - localState.trees = { - 'gitlab-ce/master': { tree: [] }, - }; - localState.currentProjectId = 'gitlab-ce'; - localState.currentBranchId = 'master'; - localState.entries = { - oldPath: file('oldPath', 'oldPath', 'blob'), - }; - }); - - it('updates existing entry without creating a new one', () => { - mutations.RENAME_ENTRY(localState, { - path: 'oldPath', - name: 'newPath', - parentPath: '', - }); - - expect(localState.entries).toEqual({ - newPath: jasmine.objectContaining({ - path: 'newPath', - prevPath: 'oldPath', - }), - }); - }); - - it('correctly handles consecutive renames for the same entry', () => { - mutations.RENAME_ENTRY(localState, { - path: 'oldPath', - name: 'newPath', - parentPath: '', - }); - - mutations.RENAME_ENTRY(localState, { - path: 'newPath', - name: 'newestPath', - parentPath: '', - }); - - expect(localState.entries).toEqual({ - newestPath: jasmine.objectContaining({ - path: 'newestPath', - prevPath: 'oldPath', - }), - }); - }); - - it('correctly handles the same entry within a consecutively renamed folder', () => { - const oldPath = file('root-folder/oldPath', 'root-folder/oldPath', 'blob'); - localState.entries = { - 'root-folder': { - ...file('root-folder', 'root-folder', 'tree'), - tree: [oldPath], - }, - 'root-folder/oldPath': oldPath, - }; - Object.assign(localState.entries['root-folder/oldPath'], { - parentPath: 'root-folder', - url: 'root-folder/oldPath-blob-root-folder/oldPath', - }); - - mutations.RENAME_ENTRY(localState, { - path: 'root-folder/oldPath', - name: 'renamed-folder/oldPath', - entryPath: null, - parentPath: '', - }); - - mutations.RENAME_ENTRY(localState, { - path: 'renamed-folder/oldPath', - name: 'simply-renamed/oldPath', - entryPath: null, - parentPath: '', - }); - - expect(localState.entries).toEqual({ - 'root-folder': jasmine.objectContaining({ - path: 'root-folder', - }), - 'simply-renamed/oldPath': jasmine.objectContaining({ - path: 'simply-renamed/oldPath', - prevPath: 'root-folder/oldPath', - }), - }); - }); - - it('renames entry, preserving old parameters', () => { - Object.assign(localState.entries.oldPath, { - url: `project/-/oldPath`, - }); - const oldPathData = localState.entries.oldPath; - - mutations.RENAME_ENTRY(localState, { - path: 'oldPath', - name: 'newPath', - parentPath: '', - }); - - expect(localState.entries.newPath).toEqual({ - ...oldPathData, - id: 'newPath', - path: 'newPath', - name: 'newPath', - url: `project/-/newPath`, - key: jasmine.stringMatching('newPath'), - - prevId: 'oldPath', - prevName: 'oldPath', - prevPath: 'oldPath', - prevUrl: `project/-/oldPath`, - prevKey: oldPathData.key, - prevParentPath: oldPathData.parentPath, - }); - }); - - it('does not store previous attributes on temp files', () => { - Object.assign(localState.entries.oldPath, { - tempFile: true, - }); - mutations.RENAME_ENTRY(localState, { - path: 'oldPath', - name: 'newPath', - entryPath: null, - parentPath: '', - }); - - expect(localState.entries.newPath).not.toEqual( - jasmine.objectContaining({ - prevId: jasmine.anything(), - prevName: jasmine.anything(), - prevPath: jasmine.anything(), - prevUrl: jasmine.anything(), - prevKey: jasmine.anything(), - prevParentPath: jasmine.anything(), - }), - ); - }); - - it('properly handles files with spaces in name', () => { - const path = 'my fancy path'; - const newPath = 'new path'; - const oldEntry = { - ...file(path, path, 'blob'), - url: `project/-/${encodeURI(path)}`, - }; - - localState.entries[path] = oldEntry; - - mutations.RENAME_ENTRY(localState, { - path, - name: newPath, - entryPath: null, - parentPath: '', - }); - - expect(localState.entries[newPath]).toEqual({ - ...oldEntry, - id: newPath, - path: newPath, - name: newPath, - url: `project/-/new%20path`, - key: jasmine.stringMatching(newPath), - - prevId: path, - prevName: path, - prevPath: path, - prevUrl: `project/-/my%20fancy%20path`, - prevKey: oldEntry.key, - prevParentPath: oldEntry.parentPath, - }); - }); - - it('adds to parent tree', () => { - const parentEntry = { - ...file('parentPath', 'parentPath', 'tree'), - tree: [localState.entries.oldPath], - }; - localState.entries.parentPath = parentEntry; - - mutations.RENAME_ENTRY(localState, { - path: 'oldPath', - name: 'newPath', - entryPath: null, - parentPath: 'parentPath', - }); - - expect(parentEntry.tree.length).toBe(1); - expect(parentEntry.tree[0].name).toBe('newPath'); - }); - - it('sorts tree after renaming an entry', () => { - const alpha = file('alpha', 'alpha', 'blob'); - const beta = file('beta', 'beta', 'blob'); - const gamma = file('gamma', 'gamma', 'blob'); - localState.entries = { alpha, beta, gamma }; - - localState.trees['gitlab-ce/master'].tree = [alpha, beta, gamma]; - - mutations.RENAME_ENTRY(localState, { - path: 'alpha', - name: 'theta', - entryPath: null, - parentPath: '', - }); - - expect(localState.trees['gitlab-ce/master'].tree).toEqual([ - jasmine.objectContaining({ name: 'beta' }), - jasmine.objectContaining({ name: 'gamma' }), - jasmine.objectContaining({ - path: 'theta', - name: 'theta', - }), - ]); - }); - - it('updates openFiles with the renamed one if the original one is open', () => { - Object.assign(localState.entries.oldPath, { - opened: true, - type: 'blob', - }); - Object.assign(localState, { - openFiles: [localState.entries.oldPath], - }); - - mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' }); - - expect(localState.openFiles.length).toBe(1); - expect(localState.openFiles[0].path).toBe('newPath'); - }); - - it('does not add renamed entry to changedFiles', () => { - mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' }); - - expect(localState.changedFiles.length).toBe(0); - }); - - it('updates existing changedFiles entry with the renamed one', () => { - const origFile = { - ...file('oldPath', 'oldPath', 'blob'), - content: 'Foo', - }; - - Object.assign(localState, { - changedFiles: [origFile], - }); - Object.assign(localState.entries, { - oldPath: origFile, - }); - - mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' }); - - expect(localState.changedFiles).toEqual([ - jasmine.objectContaining({ - path: 'newPath', - content: 'Foo', - }), - ]); - }); - - it('correctly saves original values if an entry is renamed multiple times', () => { - const original = { ...localState.entries.oldPath }; - const paramsToCheck = ['prevId', 'prevPath', 'prevName', 'prevUrl']; - const expectedObj = paramsToCheck.reduce( - (o, param) => ({ ...o, [param]: original[param.replace('prev', '').toLowerCase()] }), - {}, - ); - - mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' }); - - expect(localState.entries.newPath).toEqual(jasmine.objectContaining(expectedObj)); - - mutations.RENAME_ENTRY(localState, { path: 'newPath', name: 'newer' }); - - expect(localState.entries.newer).toEqual(jasmine.objectContaining(expectedObj)); - }); - - describe('renaming back to original', () => { - beforeEach(() => { - const renamedEntry = { - ...file('renamed', 'renamed', 'blob'), - prevId: 'lorem/orig', - prevPath: 'lorem/orig', - prevName: 'orig', - prevUrl: 'project/-/loren/orig', - prevKey: 'lorem/orig', - prevParentPath: 'lorem', - }; - - localState.entries = { - renamed: renamedEntry, - }; - - mutations.RENAME_ENTRY(localState, { path: 'renamed', name: 'orig', parentPath: 'lorem' }); - }); - - it('renames entry and clears prev properties', () => { - expect(localState.entries).toEqual({ - 'lorem/orig': jasmine.objectContaining({ - id: 'lorem/orig', - path: 'lorem/orig', - name: 'orig', - prevId: undefined, - prevPath: undefined, - prevName: undefined, - prevUrl: undefined, - prevKey: undefined, - prevParentPath: undefined, - }), - }); - }); - }); - - describe('key updates', () => { - beforeEach(() => { - const rootFolder = file('rootFolder', 'rootFolder', 'tree'); - localState.entries = { - rootFolder, - oldPath: file('oldPath', 'oldPath', 'blob'), - 'oldPath.txt': file('oldPath.txt', 'oldPath.txt', 'blob'), - 'rootFolder/oldPath.md': file('oldPath.md', 'oldPath.md', 'blob', rootFolder), - }; - }); - - it('sets properly constucted key while preserving the original one', () => { - const key = 'oldPath.txt-blob-oldPath.txt'; - localState.entries['oldPath.txt'].key = key; - mutations.RENAME_ENTRY(localState, { path: 'oldPath.txt', name: 'newPath.md' }); - - expect(localState.entries['newPath.md'].key).toBe('newPath.md-blob-newPath.md'); - expect(localState.entries['newPath.md'].prevKey).toBe(key); - }); - - it('correctly updates key for an entry without an extension', () => { - localState.entries.oldPath.key = 'oldPath-blob-oldPath'; - mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath.md' }); - - expect(localState.entries['newPath.md'].key).toBe('newPath.md-blob-newPath.md'); - }); - - it('correctly updates key when new name does not have an extension', () => { - localState.entries['oldPath.txt'].key = 'oldPath.txt-blob-oldPath.txt'; - mutations.RENAME_ENTRY(localState, { path: 'oldPath.txt', name: 'newPath' }); - - expect(localState.entries.newPath.key).toBe('newPath-blob-newPath'); - }); - - it('correctly updates key when renaming an entry in a folder', () => { - localState.entries['rootFolder/oldPath.md'].key = - 'rootFolder/oldPath.md-blob-rootFolder/oldPath.md'; - mutations.RENAME_ENTRY(localState, { - path: 'rootFolder/oldPath.md', - name: 'newPath.md', - entryPath: null, - parentPath: 'rootFolder', - }); - - expect(localState.entries['rootFolder/newPath.md'].key).toBe( - 'rootFolder/newPath.md-blob-rootFolder/newPath.md', - ); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/stores/utils_spec.js b/spec/javascripts/ide/stores/utils_spec.js deleted file mode 100644 index 37290864e3d..00000000000 --- a/spec/javascripts/ide/stores/utils_spec.js +++ /dev/null @@ -1,630 +0,0 @@ -import * as utils from '~/ide/stores/utils'; -import { commitActionTypes } from '~/ide/constants'; -import { file } from '../helpers'; - -describe('Multi-file store utils', () => { - describe('setPageTitle', () => { - it('sets the document page title', () => { - utils.setPageTitle('test'); - - expect(document.title).toBe('test'); - }); - }); - - describe('setPageTitleForFile', () => { - it('sets the document page title for the file passed', () => { - const f = { - path: 'README.md', - }; - - const state = { - currentBranchId: 'master', - currentProjectId: 'test/test', - }; - - utils.setPageTitleForFile(state, f); - - expect(document.title).toBe('README.md · master · test/test · GitLab'); - }); - }); - - describe('findIndexOfFile', () => { - let localState; - - beforeEach(() => { - localState = [ - { - path: '1', - }, - { - path: '2', - }, - ]; - }); - - it('finds in the index of an entry by path', () => { - const index = utils.findIndexOfFile(localState, { - path: '2', - }); - - expect(index).toBe(1); - }); - }); - - describe('findEntry', () => { - let localState; - - beforeEach(() => { - localState = { - tree: [ - { - type: 'tree', - name: 'test', - }, - { - type: 'blob', - name: 'file', - }, - ], - }; - }); - - it('returns an entry found by name', () => { - const foundEntry = utils.findEntry(localState.tree, 'tree', 'test'); - - expect(foundEntry.type).toBe('tree'); - expect(foundEntry.name).toBe('test'); - }); - - it('returns undefined when no entry found', () => { - const foundEntry = utils.findEntry(localState.tree, 'blob', 'test'); - - expect(foundEntry).toBeUndefined(); - }); - }); - - describe('createCommitPayload', () => { - it('returns API payload', () => { - const state = { - commitMessage: 'commit message', - }; - const rootState = { - stagedFiles: [ - { - ...file('staged'), - path: 'staged', - content: 'updated file content', - lastCommitSha: '123456789', - }, - { - ...file('newFile'), - path: 'added', - tempFile: true, - content: 'new file content', - base64: true, - lastCommitSha: '123456789', - }, - { - ...file('deletedFile'), - path: 'deletedFile', - deleted: true, - }, - { - ...file('renamedFile'), - path: 'renamedFile', - prevPath: 'prevPath', - }, - { - ...file('replacingFile'), - path: 'replacingFile', - replaces: true, - }, - ], - currentBranchId: 'master', - }; - const payload = utils.createCommitPayload({ - branch: 'master', - newBranch: false, - state, - rootState, - getters: {}, - }); - - expect(payload).toEqual({ - branch: 'master', - commit_message: 'commit message', - actions: [ - { - action: commitActionTypes.update, - file_path: 'staged', - content: 'updated file content', - encoding: 'text', - last_commit_id: '123456789', - previous_path: undefined, - }, - { - action: commitActionTypes.create, - file_path: 'added', - content: 'new file content', - encoding: 'base64', - last_commit_id: '123456789', - previous_path: undefined, - }, - { - action: commitActionTypes.delete, - file_path: 'deletedFile', - content: undefined, - encoding: 'text', - last_commit_id: undefined, - previous_path: undefined, - }, - { - action: commitActionTypes.move, - file_path: 'renamedFile', - content: null, - encoding: 'text', - last_commit_id: undefined, - previous_path: 'prevPath', - }, - { - action: commitActionTypes.update, - file_path: 'replacingFile', - content: undefined, - encoding: 'text', - last_commit_id: undefined, - previous_path: undefined, - }, - ], - start_sha: undefined, - }); - }); - - it('uses prebuilt commit message when commit message is empty', () => { - const rootState = { - stagedFiles: [ - { - ...file('staged'), - path: 'staged', - content: 'updated file content', - lastCommitSha: '123456789', - }, - { - ...file('newFile'), - path: 'added', - tempFile: true, - content: 'new file content', - base64: true, - lastCommitSha: '123456789', - }, - ], - currentBranchId: 'master', - }; - const payload = utils.createCommitPayload({ - branch: 'master', - newBranch: false, - state: {}, - rootState, - getters: { - preBuiltCommitMessage: 'prebuilt test commit message', - }, - }); - - expect(payload).toEqual({ - branch: 'master', - commit_message: 'prebuilt test commit message', - actions: [ - { - action: commitActionTypes.update, - file_path: 'staged', - content: 'updated file content', - encoding: 'text', - last_commit_id: '123456789', - previous_path: undefined, - }, - { - action: commitActionTypes.create, - file_path: 'added', - content: 'new file content', - encoding: 'base64', - last_commit_id: '123456789', - previous_path: undefined, - }, - ], - start_sha: undefined, - }); - }); - }); - - describe('commitActionForFile', () => { - it('returns deleted for deleted file', () => { - expect(utils.commitActionForFile({ deleted: true })).toBe(commitActionTypes.delete); - }); - - it('returns create for tempFile', () => { - expect(utils.commitActionForFile({ tempFile: true })).toBe(commitActionTypes.create); - }); - - it('returns move for moved file', () => { - expect(utils.commitActionForFile({ prevPath: 'test' })).toBe(commitActionTypes.move); - }); - - it('returns update by default', () => { - expect(utils.commitActionForFile({})).toBe(commitActionTypes.update); - }); - }); - - describe('getCommitFiles', () => { - it('filters out folders from the list', () => { - const files = [ - { - path: 'a', - type: 'blob', - deleted: true, - }, - { - path: 'c', - type: 'tree', - deleted: true, - }, - { - path: 'c/d', - type: 'blob', - deleted: true, - }, - ]; - - const flattendFiles = utils.getCommitFiles(files); - - expect(flattendFiles).toEqual([ - { - path: 'a', - type: 'blob', - deleted: true, - }, - { - path: 'c/d', - type: 'blob', - deleted: true, - }, - ]); - }); - }); - - describe('mergeTrees', () => { - let fromTree; - let toTree; - - beforeEach(() => { - fromTree = [file('foo')]; - toTree = [file('bar')]; - }); - - it('merges simple trees with sorting the result', () => { - toTree = [file('beta'), file('alpha'), file('gamma')]; - const res = utils.mergeTrees(fromTree, toTree); - - expect(res.length).toEqual(4); - expect(res[0].name).toEqual('alpha'); - expect(res[1].name).toEqual('beta'); - expect(res[2].name).toEqual('foo'); - expect(res[3].name).toEqual('gamma'); - expect(res[2]).toBe(fromTree[0]); - }); - - it('handles edge cases', () => { - expect(utils.mergeTrees({}, []).length).toEqual(0); - - let res = utils.mergeTrees({}, toTree); - - expect(res.length).toEqual(1); - expect(res[0].name).toEqual('bar'); - - res = utils.mergeTrees(fromTree, []); - - expect(res.length).toEqual(1); - expect(res[0].name).toEqual('foo'); - expect(res[0]).toBe(fromTree[0]); - }); - - it('merges simple trees without producing duplicates', () => { - toTree.push(file('foo')); - - const res = utils.mergeTrees(fromTree, toTree); - - expect(res.length).toEqual(2); - expect(res[0].name).toEqual('bar'); - expect(res[1].name).toEqual('foo'); - expect(res[1]).not.toBe(fromTree[0]); - }); - - it('merges nested tree into the main one without duplicates', () => { - fromTree[0].tree.push({ - ...file('alpha'), - path: 'foo/alpha', - tree: [ - { - ...file('beta.md'), - path: 'foo/alpha/beta.md', - }, - ], - }); - - toTree.push({ - ...file('foo'), - tree: [ - { - ...file('alpha'), - path: 'foo/alpha', - tree: [ - { - ...file('gamma.md'), - path: 'foo/alpha/gamma.md', - }, - ], - }, - ], - }); - - const res = utils.mergeTrees(fromTree, toTree); - - expect(res.length).toEqual(2); - expect(res[1].name).toEqual('foo'); - - const finalBranch = res[1].tree[0].tree; - - expect(finalBranch.length).toEqual(2); - expect(finalBranch[0].name).toEqual('beta.md'); - expect(finalBranch[1].name).toEqual('gamma.md'); - }); - - it('marks correct folders as opened as the parsing goes on', () => { - fromTree[0].tree.push({ - ...file('alpha'), - path: 'foo/alpha', - tree: [ - { - ...file('beta.md'), - path: 'foo/alpha/beta.md', - }, - ], - }); - - toTree.push({ - ...file('foo'), - tree: [ - { - ...file('alpha'), - path: 'foo/alpha', - tree: [ - { - ...file('gamma.md'), - path: 'foo/alpha/gamma.md', - }, - ], - }, - ], - }); - - const res = utils.mergeTrees(fromTree, toTree); - - expect(res[1].name).toEqual('foo'); - expect(res[1].opened).toEqual(true); - - expect(res[1].tree[0].name).toEqual('alpha'); - expect(res[1].tree[0].opened).toEqual(true); - }); - }); - - describe('escapeFileUrl', () => { - it('encodes URL excluding the slashes', () => { - expect(utils.escapeFileUrl('/foo-bar/file.md')).toBe('/foo-bar/file.md'); - expect(utils.escapeFileUrl('foo bar/file.md')).toBe('foo%20bar/file.md'); - expect(utils.escapeFileUrl('foo/bar/file.md')).toBe('foo/bar/file.md'); - }); - }); - - describe('swapInStateArray', () => { - let localState; - - beforeEach(() => { - localState = []; - }); - - it('swaps existing entry with a new one', () => { - const file1 = { - ...file('old'), - key: 'foo', - }; - const file2 = file('new'); - const arr = [file1]; - - Object.assign(localState, { - dummyArray: arr, - entries: { - new: file2, - }, - }); - - utils.swapInStateArray(localState, 'dummyArray', 'foo', 'new'); - - expect(localState.dummyArray.length).toBe(1); - expect(localState.dummyArray[0]).toBe(file2); - }); - - it('does not add an item if it does not exist yet in array', () => { - const file1 = file('file'); - Object.assign(localState, { - dummyArray: [], - entries: { - file: file1, - }, - }); - - utils.swapInStateArray(localState, 'dummyArray', 'foo', 'file'); - - expect(localState.dummyArray.length).toBe(0); - }); - }); - - describe('swapInParentTreeWithSorting', () => { - let localState; - let branchInfo; - const currentProjectId = '123-foo'; - const currentBranchId = 'master'; - - beforeEach(() => { - localState = { - currentBranchId, - currentProjectId, - trees: { - [`${currentProjectId}/${currentBranchId}`]: { - tree: [], - }, - }, - entries: { - oldPath: file('oldPath', 'oldPath', 'blob'), - newPath: file('newPath', 'newPath', 'blob'), - parentPath: file('parentPath', 'parentPath', 'tree'), - }, - }; - branchInfo = localState.trees[`${currentProjectId}/${currentBranchId}`]; - }); - - it('does not change tree if newPath is not supplied', () => { - branchInfo.tree = [localState.entries.oldPath]; - - utils.swapInParentTreeWithSorting(localState, 'oldPath', undefined, undefined); - - expect(branchInfo.tree).toEqual([localState.entries.oldPath]); - }); - - describe('oldPath to replace is not defined: simple addition to tree', () => { - it('adds to tree on the state if there is no parent for the entry', () => { - expect(branchInfo.tree.length).toBe(0); - - utils.swapInParentTreeWithSorting(localState, undefined, 'oldPath', undefined); - - expect(branchInfo.tree.length).toBe(1); - expect(branchInfo.tree[0].name).toBe('oldPath'); - - utils.swapInParentTreeWithSorting(localState, undefined, 'newPath', undefined); - - expect(branchInfo.tree.length).toBe(2); - expect(branchInfo.tree).toEqual([ - jasmine.objectContaining({ name: 'newPath' }), - jasmine.objectContaining({ name: 'oldPath' }), - ]); - }); - - it('adds to parent tree if it is supplied', () => { - utils.swapInParentTreeWithSorting(localState, undefined, 'newPath', 'parentPath'); - - expect(localState.entries.parentPath.tree.length).toBe(1); - expect(localState.entries.parentPath.tree).toEqual([ - jasmine.objectContaining({ name: 'newPath' }), - ]); - - localState.entries.parentPath.tree = [localState.entries.oldPath]; - - utils.swapInParentTreeWithSorting(localState, undefined, 'newPath', 'parentPath'); - - expect(localState.entries.parentPath.tree.length).toBe(2); - expect(localState.entries.parentPath.tree).toEqual([ - jasmine.objectContaining({ name: 'newPath' }), - jasmine.objectContaining({ name: 'oldPath' }), - ]); - }); - }); - - describe('swapping of the items', () => { - it('swaps entries if both paths are supplied', () => { - branchInfo.tree = [localState.entries.oldPath]; - - utils.swapInParentTreeWithSorting(localState, localState.entries.oldPath.key, 'newPath'); - - expect(branchInfo.tree).toEqual([jasmine.objectContaining({ name: 'newPath' })]); - - utils.swapInParentTreeWithSorting(localState, localState.entries.newPath.key, 'oldPath'); - - expect(branchInfo.tree).toEqual([jasmine.objectContaining({ name: 'oldPath' })]); - }); - - it('sorts tree after swapping the entries', () => { - const alpha = file('alpha', 'alpha', 'blob'); - const beta = file('beta', 'beta', 'blob'); - const gamma = file('gamma', 'gamma', 'blob'); - const theta = file('theta', 'theta', 'blob'); - localState.entries = { alpha, beta, gamma, theta }; - - branchInfo.tree = [alpha, beta, gamma]; - - utils.swapInParentTreeWithSorting(localState, alpha.key, 'theta'); - - expect(branchInfo.tree).toEqual([ - jasmine.objectContaining({ name: 'beta' }), - jasmine.objectContaining({ name: 'gamma' }), - jasmine.objectContaining({ name: 'theta' }), - ]); - - utils.swapInParentTreeWithSorting(localState, gamma.key, 'alpha'); - - expect(branchInfo.tree).toEqual([ - jasmine.objectContaining({ name: 'alpha' }), - jasmine.objectContaining({ name: 'beta' }), - jasmine.objectContaining({ name: 'theta' }), - ]); - - utils.swapInParentTreeWithSorting(localState, beta.key, 'gamma'); - - expect(branchInfo.tree).toEqual([ - jasmine.objectContaining({ name: 'alpha' }), - jasmine.objectContaining({ name: 'gamma' }), - jasmine.objectContaining({ name: 'theta' }), - ]); - }); - }); - }); - - describe('cleanTrailingSlash', () => { - [ - { input: '', output: '' }, - { input: 'abc', output: 'abc' }, - { input: 'abc/', output: 'abc' }, - { input: 'abc/def', output: 'abc/def' }, - { input: 'abc/def/', output: 'abc/def' }, - ].forEach(({ input, output }) => { - it(`cleans trailing slash from string "${input}"`, () => { - expect(utils.cleanTrailingSlash(input)).toEqual(output); - }); - }); - }); - - describe('pathsAreEqual', () => { - [ - { args: ['abc', 'abc'], output: true }, - { args: ['abc', 'def'], output: false }, - { args: ['abc/', 'abc'], output: true }, - { args: ['abc/abc', 'abc'], output: false }, - { args: ['/', ''], output: true }, - { args: ['', '/'], output: true }, - { args: [false, '/'], output: true }, - ].forEach(({ args, output }) => { - it(`cleans and tests equality (${JSON.stringify(args)})`, () => { - expect(utils.pathsAreEqual(...args)).toEqual(output); - }); - }); - }); - - describe('addFinalNewlineIfNeeded', () => { - it('adds a newline if it doesnt already exist', () => { - [ - { input: 'some text', output: 'some text\n' }, - { input: 'some text\n', output: 'some text\n' }, - { input: 'some text\n\n', output: 'some text\n\n' }, - { input: 'some\n text', output: 'some\n text\n' }, - ].forEach(({ input, output }) => { - expect(utils.addFinalNewlineIfNeeded(input)).toEqual(output); - }); - }); - }); -}); |