diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
commit | 9f46488805e86b1bc341ea1620b866016c2ce5ed (patch) | |
tree | f9748c7e287041e37d6da49e0a29c9511dc34768 /spec/javascripts/ide/components | |
parent | dfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff) | |
download | gitlab-ce-9f46488805e86b1bc341ea1620b866016c2ce5ed.tar.gz |
Add latest changes from gitlab-org/gitlab@13-0-stable-ee
Diffstat (limited to 'spec/javascripts/ide/components')
23 files changed, 16 insertions, 2083 deletions
diff --git a/spec/javascripts/ide/components/activity_bar_spec.js b/spec/javascripts/ide/components/activity_bar_spec.js deleted file mode 100644 index 823ca29dab9..00000000000 --- a/spec/javascripts/ide/components/activity_bar_spec.js +++ /dev/null @@ -1,72 +0,0 @@ -import Vue from 'vue'; -import store from '~/ide/stores'; -import { leftSidebarViews } from '~/ide/constants'; -import ActivityBar from '~/ide/components/activity_bar.vue'; -import { createComponentWithStore } from '../../helpers/vue_mount_component_helper'; -import { resetStore } from '../helpers'; - -describe('IDE activity bar', () => { - const Component = Vue.extend(ActivityBar); - let vm; - - beforeEach(() => { - Vue.set(store.state.projects, 'abcproject', { - web_url: 'testing', - }); - Vue.set(store.state, 'currentProjectId', 'abcproject'); - - vm = createComponentWithStore(Component, store); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - describe('updateActivityBarView', () => { - beforeEach(() => { - spyOn(vm, 'updateActivityBarView'); - - vm.$mount(); - }); - - it('calls updateActivityBarView with edit value on click', () => { - vm.$el.querySelector('.js-ide-edit-mode').click(); - - expect(vm.updateActivityBarView).toHaveBeenCalledWith(leftSidebarViews.edit.name); - }); - - it('calls updateActivityBarView with commit value on click', () => { - vm.$el.querySelector('.js-ide-commit-mode').click(); - - expect(vm.updateActivityBarView).toHaveBeenCalledWith(leftSidebarViews.commit.name); - }); - - it('calls updateActivityBarView with review value on click', () => { - vm.$el.querySelector('.js-ide-review-mode').click(); - - expect(vm.updateActivityBarView).toHaveBeenCalledWith(leftSidebarViews.review.name); - }); - }); - - describe('active item', () => { - beforeEach(() => { - vm.$mount(); - }); - - it('sets edit item active', () => { - expect(vm.$el.querySelector('.js-ide-edit-mode').classList).toContain('active'); - }); - - it('sets commit item active', done => { - vm.$store.state.currentActivityView = leftSidebarViews.commit.name; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.js-ide-commit-mode').classList).toContain('active'); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/commit_sidebar/radio_group_spec.js b/spec/javascripts/ide/components/commit_sidebar/radio_group_spec.js deleted file mode 100644 index b30f0e6822b..00000000000 --- a/spec/javascripts/ide/components/commit_sidebar/radio_group_spec.js +++ /dev/null @@ -1,139 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import { resetStore } from 'spec/ide/helpers'; -import store from '~/ide/stores'; -import radioGroup from '~/ide/components/commit_sidebar/radio_group.vue'; - -describe('IDE commit sidebar radio group', () => { - let vm; - - beforeEach(done => { - const Component = Vue.extend(radioGroup); - - store.state.commit.commitAction = '2'; - - vm = createComponentWithStore(Component, store, { - value: '1', - label: 'test', - checked: true, - }); - - vm.$mount(); - - Vue.nextTick(done); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('uses label if present', () => { - expect(vm.$el.textContent).toContain('test'); - }); - - it('uses slot if label is not present', done => { - vm.$destroy(); - - vm = new Vue({ - components: { - radioGroup, - }, - store, - template: ` - <radio-group - value="1" - > - Testing slot - </radio-group> - `, - }); - - vm.$mount(); - - Vue.nextTick(() => { - expect(vm.$el.textContent).toContain('Testing slot'); - - done(); - }); - }); - - it('updates store when changing radio button', done => { - vm.$el.querySelector('input').dispatchEvent(new Event('change')); - - Vue.nextTick(() => { - expect(store.state.commit.commitAction).toBe('1'); - - done(); - }); - }); - - describe('with input', () => { - beforeEach(done => { - vm.$destroy(); - - const Component = Vue.extend(radioGroup); - - store.state.commit.commitAction = '1'; - store.state.commit.newBranchName = 'test-123'; - - vm = createComponentWithStore(Component, store, { - value: '1', - label: 'test', - checked: true, - showInput: true, - }); - - vm.$mount(); - - Vue.nextTick(done); - }); - - it('renders input box when commitAction matches value', () => { - expect(vm.$el.querySelector('.form-control')).not.toBeNull(); - }); - - it('hides input when commitAction doesnt match value', done => { - store.state.commit.commitAction = '2'; - - Vue.nextTick(() => { - expect(vm.$el.querySelector('.form-control')).toBeNull(); - done(); - }); - }); - - it('updates branch name in store on input', done => { - const input = vm.$el.querySelector('.form-control'); - input.value = 'testing-123'; - input.dispatchEvent(new Event('input')); - - Vue.nextTick(() => { - expect(store.state.commit.newBranchName).toBe('testing-123'); - - done(); - }); - }); - - it('renders newBranchName if present', () => { - const input = vm.$el.querySelector('.form-control'); - - expect(input.value).toBe('test-123'); - }); - }); - - describe('tooltipTitle', () => { - it('returns title when disabled', () => { - vm.title = 'test title'; - vm.disabled = true; - - expect(vm.tooltipTitle).toBe('test title'); - }); - - it('returns blank when not disabled', () => { - vm.title = 'test title'; - - expect(vm.tooltipTitle).not.toBe('test title'); - }); - }); -}); diff --git a/spec/javascripts/ide/components/file_row_extra_spec.js b/spec/javascripts/ide/components/file_row_extra_spec.js deleted file mode 100644 index 9fd014b50ef..00000000000 --- a/spec/javascripts/ide/components/file_row_extra_spec.js +++ /dev/null @@ -1,170 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import { createStore } from '~/ide/stores'; -import FileRowExtra from '~/ide/components/file_row_extra.vue'; -import { file, resetStore } from '../helpers'; - -describe('IDE extra file row component', () => { - let Component; - let vm; - let unstagedFilesCount = 0; - let stagedFilesCount = 0; - let changesCount = 0; - - beforeAll(() => { - Component = Vue.extend(FileRowExtra); - }); - - beforeEach(() => { - vm = createComponentWithStore(Component, createStore(), { - file: { - ...file('test'), - }, - dropdownOpen: false, - }); - - spyOnProperty(vm, 'getUnstagedFilesCountForPath').and.returnValue(() => unstagedFilesCount); - spyOnProperty(vm, 'getStagedFilesCountForPath').and.returnValue(() => stagedFilesCount); - spyOnProperty(vm, 'getChangesInFolder').and.returnValue(() => changesCount); - - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - resetStore(vm.$store); - - stagedFilesCount = 0; - unstagedFilesCount = 0; - changesCount = 0; - }); - - describe('folderChangesTooltip', () => { - it('returns undefined when changes count is 0', () => { - changesCount = 0; - - expect(vm.folderChangesTooltip).toBe(undefined); - }); - - [{ input: 1, output: '1 changed file' }, { input: 2, output: '2 changed files' }].forEach( - ({ input, output }) => { - it('returns changed files count if changes count is not 0', () => { - changesCount = input; - - expect(vm.folderChangesTooltip).toBe(output); - }); - }, - ); - }); - - describe('show tree changes count', () => { - it('does not show for blobs', () => { - vm.file.type = 'blob'; - - expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null); - }); - - it('does not show when changes count is 0', () => { - vm.file.type = 'tree'; - - expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null); - }); - - it('does not show when tree is open', done => { - vm.file.type = 'tree'; - vm.file.opened = true; - changesCount = 1; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ide-tree-changes')).toBe(null); - - done(); - }); - }); - - it('shows for trees with changes', done => { - vm.file.type = 'tree'; - vm.file.opened = false; - changesCount = 1; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ide-tree-changes')).not.toBe(null); - - done(); - }); - }); - }); - - describe('changes file icon', () => { - it('hides when file is not changed', () => { - expect(vm.$el.querySelector('.file-changed-icon')).toBe(null); - }); - - it('shows when file is changed', done => { - vm.file.changed = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null); - - done(); - }); - }); - - it('shows when file is staged', done => { - vm.file.staged = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null); - - done(); - }); - }); - - it('shows when file is a tempFile', done => { - vm.file.tempFile = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null); - - done(); - }); - }); - - it('shows when file is renamed', done => { - vm.file.prevPath = 'original-file'; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.file-changed-icon')).not.toBe(null); - - done(); - }); - }); - - it('hides when file is renamed', done => { - vm.file.prevPath = 'original-file'; - vm.file.type = 'tree'; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.file-changed-icon')).toBe(null); - - done(); - }); - }); - }); - - describe('merge request icon', () => { - it('hides when not a merge request change', () => { - expect(vm.$el.querySelector('.ic-git-merge')).toBe(null); - }); - - it('shows when a merge request change', done => { - vm.file.mrChange = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ic-git-merge')).not.toBe(null); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/file_templates/bar_spec.js b/spec/javascripts/ide/components/file_templates/bar_spec.js deleted file mode 100644 index 5399ada94ae..00000000000 --- a/spec/javascripts/ide/components/file_templates/bar_spec.js +++ /dev/null @@ -1,117 +0,0 @@ -import Vue from 'vue'; -import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import { createStore } from '~/ide/stores'; -import Bar from '~/ide/components/file_templates/bar.vue'; -import { resetStore, file } from '../../helpers'; - -describe('IDE file templates bar component', () => { - let Component; - let vm; - - beforeAll(() => { - Component = Vue.extend(Bar); - }); - - beforeEach(() => { - const store = createStore(); - - store.state.openFiles.push({ - ...file('file'), - opened: true, - active: true, - }); - - vm = mountComponentWithStore(Component, { store }); - }); - - afterEach(() => { - vm.$destroy(); - resetStore(vm.$store); - }); - - describe('template type dropdown', () => { - it('renders dropdown component', () => { - expect(vm.$el.querySelector('.dropdown').textContent).toContain('Choose a type'); - }); - - it('calls setSelectedTemplateType when clicking item', () => { - spyOn(vm, 'setSelectedTemplateType').and.stub(); - - vm.$el.querySelector('.dropdown-content button').click(); - - expect(vm.setSelectedTemplateType).toHaveBeenCalledWith({ - name: '.gitlab-ci.yml', - key: 'gitlab_ci_ymls', - }); - }); - }); - - describe('template dropdown', () => { - beforeEach(done => { - vm.$store.state.fileTemplates.templates = [ - { - name: 'test', - }, - ]; - vm.$store.state.fileTemplates.selectedTemplateType = { - name: '.gitlab-ci.yml', - key: 'gitlab_ci_ymls', - }; - - vm.$nextTick(done); - }); - - it('renders dropdown component', () => { - expect(vm.$el.querySelectorAll('.dropdown')[1].textContent).toContain('Choose a template'); - }); - - it('calls fetchTemplate on click', () => { - spyOn(vm, 'fetchTemplate').and.stub(); - - vm.$el - .querySelectorAll('.dropdown-content')[1] - .querySelector('button') - .click(); - - expect(vm.fetchTemplate).toHaveBeenCalledWith({ - name: 'test', - }); - }); - }); - - it('shows undo button if updateSuccess is true', done => { - vm.$store.state.fileTemplates.updateSuccess = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.btn-default').style.display).not.toBe('none'); - - done(); - }); - }); - - it('calls undoFileTemplate when clicking undo button', () => { - spyOn(vm, 'undoFileTemplate').and.stub(); - - vm.$el.querySelector('.btn-default').click(); - - expect(vm.undoFileTemplate).toHaveBeenCalled(); - }); - - it('calls setSelectedTemplateType if activeFile name matches a template', done => { - const fileName = '.gitlab-ci.yml'; - - spyOn(vm, 'setSelectedTemplateType'); - vm.$store.state.openFiles[0].name = fileName; - - vm.setInitialType(); - - vm.$nextTick(() => { - expect(vm.setSelectedTemplateType).toHaveBeenCalledWith({ - name: fileName, - key: 'gitlab_ci_ymls', - }); - - done(); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_review_spec.js b/spec/javascripts/ide/components/ide_review_spec.js deleted file mode 100644 index 396c5d282d4..00000000000 --- a/spec/javascripts/ide/components/ide_review_spec.js +++ /dev/null @@ -1,69 +0,0 @@ -import Vue from 'vue'; -import IdeReview from '~/ide/components/ide_review.vue'; -import store from '~/ide/stores'; -import { createComponentWithStore } from '../../helpers/vue_mount_component_helper'; -import { trimText } from '../../helpers/text_helper'; -import { resetStore, file } from '../helpers'; -import { projectData } from '../mock_data'; - -describe('IDE review mode', () => { - const Component = Vue.extend(IdeReview); - let vm; - - beforeEach(() => { - store.state.currentProjectId = 'abcproject'; - store.state.currentBranchId = 'master'; - store.state.projects.abcproject = Object.assign({}, projectData); - Vue.set(store.state.trees, 'abcproject/master', { - tree: [file('fileName')], - loading: false, - }); - - vm = createComponentWithStore(Component, store).$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders list of files', () => { - expect(vm.$el.textContent).toContain('fileName'); - }); - - describe('merge request', () => { - beforeEach(done => { - store.state.currentMergeRequestId = '1'; - store.state.projects.abcproject.mergeRequests['1'] = { - iid: 123, - web_url: 'testing123', - }; - - vm.$nextTick(done); - }); - - it('renders edit dropdown', () => { - expect(vm.$el.querySelector('.btn')).not.toBe(null); - }); - - it('renders merge request link & IID', () => { - const link = vm.$el.querySelector('.ide-review-sub-header'); - - expect(link.querySelector('a').getAttribute('href')).toBe('testing123'); - expect(trimText(link.textContent)).toBe('Merge request (!123)'); - }); - - it('changes text to latest changes when viewer is not mrdiff', done => { - store.state.viewer = 'diff'; - - vm.$nextTick(() => { - expect(trimText(vm.$el.querySelector('.ide-review-sub-header').textContent)).toBe( - 'Latest changes', - ); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_side_bar_spec.js b/spec/javascripts/ide/components/ide_side_bar_spec.js deleted file mode 100644 index 28f127a61c0..00000000000 --- a/spec/javascripts/ide/components/ide_side_bar_spec.js +++ /dev/null @@ -1,57 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import store from '~/ide/stores'; -import ideSidebar from '~/ide/components/ide_side_bar.vue'; -import { leftSidebarViews } from '~/ide/constants'; -import { resetStore } from '../helpers'; -import { projectData } from '../mock_data'; - -describe('IdeSidebar', () => { - let vm; - - beforeEach(() => { - const Component = Vue.extend(ideSidebar); - - store.state.currentProjectId = 'abcproject'; - store.state.projects.abcproject = projectData; - - vm = createComponentWithStore(Component, store).$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders a sidebar', () => { - expect(vm.$el.querySelector('.multi-file-commit-panel-inner')).not.toBeNull(); - }); - - it('renders loading icon component', done => { - vm.$store.state.loading = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.multi-file-loading-container')).not.toBeNull(); - expect(vm.$el.querySelectorAll('.multi-file-loading-container').length).toBe(3); - - done(); - }); - }); - - describe('activityBarComponent', () => { - it('renders tree component', () => { - expect(vm.$el.querySelector('.ide-file-list')).not.toBeNull(); - }); - - it('renders commit component', done => { - vm.$store.state.currentActivityView = leftSidebarViews.commit.name; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.multi-file-commit-panel-section')).not.toBeNull(); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_spec.js b/spec/javascripts/ide/components/ide_spec.js deleted file mode 100644 index 4241b994cba..00000000000 --- a/spec/javascripts/ide/components/ide_spec.js +++ /dev/null @@ -1,125 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import store from '~/ide/stores'; -import ide from '~/ide/components/ide.vue'; -import { file, resetStore } from '../helpers'; -import { projectData } from '../mock_data'; - -function bootstrap(projData) { - const Component = Vue.extend(ide); - - store.state.currentProjectId = 'abcproject'; - store.state.currentBranchId = 'master'; - store.state.projects.abcproject = Object.assign({}, projData); - Vue.set(store.state.trees, 'abcproject/master', { - tree: [], - loading: false, - }); - - return createComponentWithStore(Component, store, { - emptyStateSvgPath: 'svg', - noChangesStateSvgPath: 'svg', - committedStateSvgPath: 'svg', - }); -} - -describe('ide component, empty repo', () => { - let vm; - - beforeEach(() => { - const emptyProjData = Object.assign({}, projectData, { empty_repo: true, branches: {} }); - vm = bootstrap(emptyProjData); - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders "New file" button in empty repo', done => { - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ide-empty-state button[title="New file"]')).not.toBeNull(); - done(); - }); - }); -}); - -describe('ide component, non-empty repo', () => { - let vm; - - beforeEach(() => { - vm = bootstrap(projectData); - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('shows error message when set', done => { - expect(vm.$el.querySelector('.gl-alert')).toBe(null); - - vm.$store.state.errorMessage = { - text: 'error', - }; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.gl-alert')).not.toBe(null); - - done(); - }); - }); - - describe('onBeforeUnload', () => { - it('returns undefined when no staged files or changed files', () => { - expect(vm.onBeforeUnload()).toBe(undefined); - }); - - it('returns warning text when their are changed files', () => { - vm.$store.state.changedFiles.push(file()); - - expect(vm.onBeforeUnload()).toBe('Are you sure you want to lose unsaved changes?'); - }); - - it('returns warning text when their are staged files', () => { - vm.$store.state.stagedFiles.push(file()); - - expect(vm.onBeforeUnload()).toBe('Are you sure you want to lose unsaved changes?'); - }); - - it('updates event object', () => { - const event = {}; - vm.$store.state.stagedFiles.push(file()); - - vm.onBeforeUnload(event); - - expect(event.returnValue).toBe('Are you sure you want to lose unsaved changes?'); - }); - }); - - describe('non-existent branch', () => { - it('does not render "New file" button for non-existent branch when repo is not empty', done => { - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ide-empty-state button[title="New file"]')).toBeNull(); - done(); - }); - }); - }); - - describe('branch with files', () => { - beforeEach(() => { - store.state.trees['abcproject/master'].tree = [file()]; - }); - - it('does not render "New file" button', done => { - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ide-empty-state button[title="New file"]')).toBeNull(); - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_status_bar_spec.js b/spec/javascripts/ide/components/ide_status_bar_spec.js deleted file mode 100644 index 3facf1c266a..00000000000 --- a/spec/javascripts/ide/components/ide_status_bar_spec.js +++ /dev/null @@ -1,129 +0,0 @@ -import Vue from 'vue'; -import _ from 'lodash'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import { TEST_HOST } from 'spec/test_constants'; -import { createStore } from '~/ide/stores'; -import IdeStatusBar from '~/ide/components/ide_status_bar.vue'; -import { rightSidebarViews } from '~/ide/constants'; -import { projectData } from '../mock_data'; - -const TEST_PROJECT_ID = 'abcproject'; -const TEST_MERGE_REQUEST_ID = '9001'; -const TEST_MERGE_REQUEST_URL = `${TEST_HOST}merge-requests/${TEST_MERGE_REQUEST_ID}`; - -describe('ideStatusBar', () => { - let store; - let vm; - - const createComponent = () => { - vm = createComponentWithStore(Vue.extend(IdeStatusBar), store).$mount(); - }; - const findMRStatus = () => vm.$el.querySelector('.js-ide-status-mr'); - - beforeEach(() => { - store = createStore(); - store.state.currentProjectId = TEST_PROJECT_ID; - store.state.projects[TEST_PROJECT_ID] = _.clone(projectData); - store.state.currentBranchId = 'master'; - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('default', () => { - beforeEach(() => { - createComponent(); - }); - - it('triggers a setInterval', () => { - expect(vm.intervalId).not.toBe(null); - }); - - it('renders the statusbar', () => { - expect(vm.$el.className).toBe('ide-status-bar'); - }); - - describe('commitAgeUpdate', () => { - beforeEach(function() { - jasmine.clock().install(); - spyOn(vm, 'commitAgeUpdate').and.callFake(() => {}); - vm.startTimer(); - }); - - afterEach(function() { - jasmine.clock().uninstall(); - }); - - it('gets called every second', () => { - expect(vm.commitAgeUpdate).not.toHaveBeenCalled(); - - jasmine.clock().tick(1100); - - expect(vm.commitAgeUpdate.calls.count()).toEqual(1); - - jasmine.clock().tick(1000); - - expect(vm.commitAgeUpdate.calls.count()).toEqual(2); - }); - }); - - describe('getCommitPath', () => { - it('returns the path to the commit details', () => { - expect(vm.getCommitPath('abc123de')).toBe('/commit/abc123de'); - }); - }); - - describe('pipeline status', () => { - it('opens right sidebar on clicking icon', done => { - spyOn(vm, 'openRightPane'); - Vue.set(vm.$store.state.pipelines, 'latestPipeline', { - details: { - status: { - text: 'success', - details_path: 'test', - icon: 'status_success', - }, - }, - commit: { - author_gravatar_url: 'www', - }, - }); - - vm.$nextTick() - .then(() => { - vm.$el.querySelector('.ide-status-pipeline button').click(); - - expect(vm.openRightPane).toHaveBeenCalledWith(rightSidebarViews.pipelines); - }) - .then(done) - .catch(done.fail); - }); - }); - - it('does not show merge request status', () => { - expect(findMRStatus()).toBe(null); - }); - }); - - describe('with merge request in store', () => { - beforeEach(() => { - store.state.projects[TEST_PROJECT_ID].mergeRequests = { - [TEST_MERGE_REQUEST_ID]: { - web_url: TEST_MERGE_REQUEST_URL, - references: { - short: `!${TEST_MERGE_REQUEST_ID}`, - }, - }, - }; - store.state.currentMergeRequestId = TEST_MERGE_REQUEST_ID; - - createComponent(); - }); - - it('shows merge request status', () => { - expect(findMRStatus().textContent.trim()).toEqual(`Merge request !${TEST_MERGE_REQUEST_ID}`); - expect(findMRStatus().querySelector('a').href).toEqual(TEST_MERGE_REQUEST_URL); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_tree_list_spec.js b/spec/javascripts/ide/components/ide_tree_list_spec.js deleted file mode 100644 index f63007c7dd2..00000000000 --- a/spec/javascripts/ide/components/ide_tree_list_spec.js +++ /dev/null @@ -1,77 +0,0 @@ -import Vue from 'vue'; -import IdeTreeList from '~/ide/components/ide_tree_list.vue'; -import store from '~/ide/stores'; -import { createComponentWithStore } from '../../helpers/vue_mount_component_helper'; -import { resetStore, file } from '../helpers'; -import { projectData } from '../mock_data'; - -describe('IDE tree list', () => { - const Component = Vue.extend(IdeTreeList); - const normalBranchTree = [file('fileName')]; - const emptyBranchTree = []; - let vm; - - const bootstrapWithTree = (tree = normalBranchTree) => { - store.state.currentProjectId = 'abcproject'; - store.state.currentBranchId = 'master'; - store.state.projects.abcproject = Object.assign({}, projectData); - Vue.set(store.state.trees, 'abcproject/master', { - tree, - loading: false, - }); - - vm = createComponentWithStore(Component, store, { - viewerType: 'edit', - }); - }; - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - describe('normal branch', () => { - beforeEach(() => { - bootstrapWithTree(); - - spyOn(vm, 'updateViewer').and.callThrough(); - - vm.$mount(); - }); - - it('updates viewer on mount', () => { - expect(vm.updateViewer).toHaveBeenCalledWith('edit'); - }); - - it('renders loading indicator', done => { - store.state.trees['abcproject/master'].loading = true; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.multi-file-loading-container')).not.toBeNull(); - expect(vm.$el.querySelectorAll('.multi-file-loading-container').length).toBe(3); - - done(); - }); - }); - - it('renders list of files', () => { - expect(vm.$el.textContent).toContain('fileName'); - }); - }); - - describe('empty-branch state', () => { - beforeEach(() => { - bootstrapWithTree(emptyBranchTree); - - spyOn(vm, 'updateViewer').and.callThrough(); - - vm.$mount(); - }); - - it('does not load files if the branch is empty', () => { - expect(vm.$el.textContent).not.toContain('fileName'); - expect(vm.$el.textContent).toContain('No files'); - }); - }); -}); diff --git a/spec/javascripts/ide/components/ide_tree_spec.js b/spec/javascripts/ide/components/ide_tree_spec.js deleted file mode 100644 index 97a0a2432f1..00000000000 --- a/spec/javascripts/ide/components/ide_tree_spec.js +++ /dev/null @@ -1,34 +0,0 @@ -import Vue from 'vue'; -import IdeTree from '~/ide/components/ide_tree.vue'; -import store from '~/ide/stores'; -import { createComponentWithStore } from '../../helpers/vue_mount_component_helper'; -import { resetStore, file } from '../helpers'; -import { projectData } from '../mock_data'; - -describe('IdeRepoTree', () => { - let vm; - - beforeEach(() => { - const IdeRepoTree = Vue.extend(IdeTree); - - store.state.currentProjectId = 'abcproject'; - store.state.currentBranchId = 'master'; - store.state.projects.abcproject = Object.assign({}, projectData); - Vue.set(store.state.trees, 'abcproject/master', { - tree: [file('fileName')], - loading: false, - }); - - vm = createComponentWithStore(IdeRepoTree, store).$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders list of files', () => { - expect(vm.$el.textContent).toContain('fileName'); - }); -}); diff --git a/spec/javascripts/ide/components/jobs/detail/description_spec.js b/spec/javascripts/ide/components/jobs/detail/description_spec.js deleted file mode 100644 index babae00d2f7..00000000000 --- a/spec/javascripts/ide/components/jobs/detail/description_spec.js +++ /dev/null @@ -1,28 +0,0 @@ -import Vue from 'vue'; -import Description from '~/ide/components/jobs/detail/description.vue'; -import mountComponent from '../../../../helpers/vue_mount_component_helper'; -import { jobs } from '../../../mock_data'; - -describe('IDE job description', () => { - const Component = Vue.extend(Description); - let vm; - - beforeEach(() => { - vm = mountComponent(Component, { - job: jobs[0], - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders job details', () => { - expect(vm.$el.textContent).toContain('#1'); - expect(vm.$el.textContent).toContain('test'); - }); - - it('renders CI icon', () => { - expect(vm.$el.querySelector('.ci-status-icon .ic-status_success_borderless')).not.toBe(null); - }); -}); diff --git a/spec/javascripts/ide/components/jobs/item_spec.js b/spec/javascripts/ide/components/jobs/item_spec.js deleted file mode 100644 index 2f97d39e98e..00000000000 --- a/spec/javascripts/ide/components/jobs/item_spec.js +++ /dev/null @@ -1,39 +0,0 @@ -import Vue from 'vue'; -import JobItem from '~/ide/components/jobs/item.vue'; -import mountComponent from '../../../helpers/vue_mount_component_helper'; -import { jobs } from '../../mock_data'; - -describe('IDE jobs item', () => { - const Component = Vue.extend(JobItem); - const job = jobs[0]; - let vm; - - beforeEach(() => { - vm = mountComponent(Component, { - job, - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders job details', () => { - expect(vm.$el.textContent).toContain(job.name); - expect(vm.$el.textContent).toContain(`#${job.id}`); - }); - - it('renders CI icon', () => { - expect(vm.$el.querySelector('.ic-status_success_borderless')).not.toBe(null); - }); - - it('does not render view logs button if not started', done => { - vm.job.started = false; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.btn')).toBe(null); - - done(); - }); - }); -}); diff --git a/spec/javascripts/ide/components/merge_requests/item_spec.js b/spec/javascripts/ide/components/merge_requests/item_spec.js deleted file mode 100644 index 155a247defb..00000000000 --- a/spec/javascripts/ide/components/merge_requests/item_spec.js +++ /dev/null @@ -1,63 +0,0 @@ -import Vue from 'vue'; -import router from '~/ide/ide_router'; -import Item from '~/ide/components/merge_requests/item.vue'; -import mountCompontent from '../../../helpers/vue_mount_component_helper'; - -describe('IDE merge request item', () => { - const Component = Vue.extend(Item); - let vm; - - beforeEach(() => { - vm = mountCompontent(Component, { - item: { - iid: 1, - projectPathWithNamespace: 'gitlab-org/gitlab-ce', - title: 'Merge request title', - }, - currentId: '1', - currentProjectId: 'gitlab-org/gitlab-ce', - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders merge requests data', () => { - expect(vm.$el.textContent).toContain('Merge request title'); - expect(vm.$el.textContent).toContain('gitlab-org/gitlab-ce!1'); - }); - - it('renders link with href', () => { - const expectedHref = router.resolve( - `/project/${vm.item.projectPathWithNamespace}/merge_requests/${vm.item.iid}`, - ).href; - - expect(vm.$el).toMatch('a'); - expect(vm.$el).toHaveAttr('href', expectedHref); - }); - - it('renders icon if ID matches currentId', () => { - expect(vm.$el.querySelector('.ic-mobile-issue-close')).not.toBe(null); - }); - - it('does not render icon if ID does not match currentId', done => { - vm.currentId = '2'; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ic-mobile-issue-close')).toBe(null); - - done(); - }); - }); - - it('does not render icon if project ID does not match', done => { - vm.currentProjectId = 'test/test'; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.ic-mobile-issue-close')).toBe(null); - - done(); - }); - }); -}); diff --git a/spec/javascripts/ide/components/nav_dropdown_button_spec.js b/spec/javascripts/ide/components/nav_dropdown_button_spec.js deleted file mode 100644 index bbaf97164ea..00000000000 --- a/spec/javascripts/ide/components/nav_dropdown_button_spec.js +++ /dev/null @@ -1,93 +0,0 @@ -import Vue from 'vue'; -import { trimText } from 'spec/helpers/text_helper'; -import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import NavDropdownButton from '~/ide/components/nav_dropdown_button.vue'; -import { createStore } from '~/ide/stores'; - -describe('NavDropdown', () => { - const TEST_BRANCH_ID = 'lorem-ipsum-dolar'; - const TEST_MR_ID = '12345'; - let store; - let vm; - - beforeEach(() => { - store = createStore(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - const createComponent = (props = {}) => { - vm = mountComponentWithStore(Vue.extend(NavDropdownButton), { props, store }); - vm.$mount(); - }; - - const findIcon = name => vm.$el.querySelector(`.ic-${name}`); - const findMRIcon = () => findIcon('merge-request'); - const findBranchIcon = () => findIcon('branch'); - - describe('normal', () => { - beforeEach(() => { - createComponent(); - }); - - it('renders empty placeholders, if state is falsey', () => { - expect(trimText(vm.$el.textContent)).toEqual('- -'); - }); - - it('renders branch name, if state has currentBranchId', done => { - vm.$store.state.currentBranchId = TEST_BRANCH_ID; - - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`); - }) - .then(done) - .catch(done.fail); - }); - - it('renders mr id, if state has currentMergeRequestId', done => { - vm.$store.state.currentMergeRequestId = TEST_MR_ID; - - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`); - }) - .then(done) - .catch(done.fail); - }); - - it('renders branch and mr, if state has both', done => { - vm.$store.state.currentBranchId = TEST_BRANCH_ID; - vm.$store.state.currentMergeRequestId = TEST_MR_ID; - - vm.$nextTick() - .then(() => { - expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`); - }) - .then(done) - .catch(done.fail); - }); - - it('shows icons', () => { - expect(findBranchIcon()).toBeTruthy(); - expect(findMRIcon()).toBeTruthy(); - }); - }); - - describe('with showMergeRequests false', () => { - beforeEach(() => { - createComponent({ showMergeRequests: false }); - }); - - it('shows single empty placeholder, if state is falsey', () => { - expect(trimText(vm.$el.textContent)).toEqual('-'); - }); - - it('shows only branch icon', () => { - expect(findBranchIcon()).toBeTruthy(); - expect(findMRIcon()).toBe(null); - }); - }); -}); diff --git a/spec/javascripts/ide/components/nav_dropdown_spec.js b/spec/javascripts/ide/components/nav_dropdown_spec.js deleted file mode 100644 index dfb4d03540f..00000000000 --- a/spec/javascripts/ide/components/nav_dropdown_spec.js +++ /dev/null @@ -1,80 +0,0 @@ -import $ from 'jquery'; -import Vue from 'vue'; -import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import store from '~/ide/stores'; -import NavDropdown from '~/ide/components/nav_dropdown.vue'; -import { PERMISSION_READ_MR } from '~/ide/constants'; - -const TEST_PROJECT_ID = 'lorem-ipsum'; - -describe('IDE NavDropdown', () => { - const Component = Vue.extend(NavDropdown); - let vm; - let $dropdown; - - beforeEach(() => { - store.state.currentProjectId = TEST_PROJECT_ID; - Vue.set(store.state.projects, TEST_PROJECT_ID, { - userPermissions: { - [PERMISSION_READ_MR]: true, - }, - }); - vm = mountComponentWithStore(Component, { store }); - $dropdown = $(vm.$el); - - // block dispatch from doing anything - spyOn(vm.$store, 'dispatch'); - }); - - afterEach(() => { - vm.$destroy(); - }); - - const findIcon = name => vm.$el.querySelector(`.ic-${name}`); - const findMRIcon = () => findIcon('merge-request'); - - it('renders nothing initially', () => { - expect(vm.$el).not.toContainElement('.ide-nav-form'); - }); - - it('renders nav form when show.bs.dropdown', done => { - $dropdown.trigger('show.bs.dropdown'); - - vm.$nextTick() - .then(() => { - expect(vm.$el).toContainElement('.ide-nav-form'); - }) - .then(done) - .catch(done.fail); - }); - - it('destroys nav form when closed', done => { - $dropdown.trigger('show.bs.dropdown'); - $dropdown.trigger('hide.bs.dropdown'); - - vm.$nextTick() - .then(() => { - expect(vm.$el).not.toContainElement('.ide-nav-form'); - }) - .then(done) - .catch(done.fail); - }); - - it('renders merge request icon', () => { - expect(findMRIcon()).not.toBeNull(); - }); - - describe('when user cannot read merge requests', () => { - beforeEach(done => { - store.state.projects[TEST_PROJECT_ID].userPermissions = {}; - - vm.$nextTick() - .then(done) - .catch(done.fail); - }); - - it('does not render merge requests', () => { - expect(findMRIcon()).toBeNull(); - }); - }); -}); diff --git a/spec/javascripts/ide/components/new_dropdown/button_spec.js b/spec/javascripts/ide/components/new_dropdown/button_spec.js deleted file mode 100644 index 6a326b5bd92..00000000000 --- a/spec/javascripts/ide/components/new_dropdown/button_spec.js +++ /dev/null @@ -1,65 +0,0 @@ -import Vue from 'vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import Button from '~/ide/components/new_dropdown/button.vue'; - -describe('IDE new entry dropdown button component', () => { - let Component; - let vm; - - beforeAll(() => { - Component = Vue.extend(Button); - }); - - beforeEach(() => { - vm = mountComponent(Component, { - label: 'Testing', - icon: 'doc-new', - }); - - spyOn(vm, '$emit'); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders button with label', () => { - expect(vm.$el.textContent).toContain('Testing'); - }); - - it('renders icon', () => { - expect(vm.$el.querySelector('.ic-doc-new')).not.toBe(null); - }); - - it('emits click event', () => { - vm.$el.click(); - - expect(vm.$emit).toHaveBeenCalledWith('click'); - }); - - it('hides label if showLabel is false', done => { - vm.showLabel = false; - - vm.$nextTick(() => { - expect(vm.$el.textContent).not.toContain('Testing'); - - done(); - }); - }); - - describe('tooltipTitle', () => { - it('returns empty string when showLabel is true', () => { - expect(vm.tooltipTitle).toBe(''); - }); - - it('returns label', done => { - vm.showLabel = false; - - vm.$nextTick(() => { - expect(vm.tooltipTitle).toBe('Testing'); - - done(); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/new_dropdown/index_spec.js b/spec/javascripts/ide/components/new_dropdown/index_spec.js deleted file mode 100644 index 03afe997fed..00000000000 --- a/spec/javascripts/ide/components/new_dropdown/index_spec.js +++ /dev/null @@ -1,84 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import store from '~/ide/stores'; -import newDropdown from '~/ide/components/new_dropdown/index.vue'; -import { resetStore } from '../../helpers'; - -describe('new dropdown component', () => { - let vm; - - beforeEach(() => { - const component = Vue.extend(newDropdown); - - vm = createComponentWithStore(component, store, { - branch: 'master', - path: '', - mouseOver: false, - type: 'tree', - }); - - vm.$store.state.currentProjectId = 'abcproject'; - vm.$store.state.path = ''; - vm.$store.state.trees['abcproject/mybranch'] = { - tree: [], - }; - - spyOn(vm, 'openNewEntryModal'); - - vm.$mount(); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders new file, upload and new directory links', () => { - const buttons = vm.$el.querySelectorAll('.dropdown-menu button'); - - expect(buttons[0].textContent.trim()).toBe('New file'); - expect(buttons[1].textContent.trim()).toBe('Upload file'); - expect(buttons[2].textContent.trim()).toBe('New directory'); - }); - - describe('createNewItem', () => { - it('sets modalType to blob when new file is clicked', () => { - vm.$el.querySelectorAll('.dropdown-menu button')[0].click(); - - expect(vm.openNewEntryModal).toHaveBeenCalledWith({ type: 'blob', path: '' }); - }); - - it('sets modalType to tree when new directory is clicked', () => { - vm.$el.querySelectorAll('.dropdown-menu button')[2].click(); - - expect(vm.openNewEntryModal).toHaveBeenCalledWith({ type: 'tree', path: '' }); - }); - }); - - describe('isOpen', () => { - it('scrolls dropdown into view', done => { - spyOn(vm.$refs.dropdownMenu, 'scrollIntoView'); - - vm.isOpen = true; - - setTimeout(() => { - expect(vm.$refs.dropdownMenu.scrollIntoView).toHaveBeenCalledWith({ - block: 'nearest', - }); - - done(); - }); - }); - }); - - describe('delete entry', () => { - it('calls delete action', () => { - spyOn(vm, 'deleteEntry'); - - vm.$el.querySelectorAll('.dropdown-menu button')[4].click(); - - expect(vm.deleteEntry).toHaveBeenCalledWith(''); - }); - }); -}); diff --git a/spec/javascripts/ide/components/new_dropdown/modal_spec.js b/spec/javascripts/ide/components/new_dropdown/modal_spec.js deleted file mode 100644 index 0ea767e087d..00000000000 --- a/spec/javascripts/ide/components/new_dropdown/modal_spec.js +++ /dev/null @@ -1,150 +0,0 @@ -import Vue from 'vue'; -import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper'; -import { createStore } from '~/ide/stores'; -import modal from '~/ide/components/new_dropdown/modal.vue'; - -describe('new file modal component', () => { - const Component = Vue.extend(modal); - let vm; - - afterEach(() => { - vm.$destroy(); - }); - - ['tree', 'blob'].forEach(type => { - describe(type, () => { - beforeEach(() => { - const store = createStore(); - store.state.entryModal = { - type, - path: '', - entry: { - path: '', - }, - }; - - vm = createComponentWithStore(Component, store).$mount(); - - vm.name = 'testing'; - }); - - it(`sets modal title as ${type}`, () => { - const title = type === 'tree' ? 'directory' : 'file'; - - expect(vm.$el.querySelector('.modal-title').textContent.trim()).toBe(`Create new ${title}`); - }); - - it(`sets button label as ${type}`, () => { - const title = type === 'tree' ? 'directory' : 'file'; - - expect(vm.$el.querySelector('.btn-success').textContent.trim()).toBe(`Create ${title}`); - }); - - it(`sets form label as ${type}`, () => { - expect(vm.$el.querySelector('.label-bold').textContent.trim()).toBe('Name'); - }); - - it(`${type === 'tree' ? 'does not show' : 'shows'} file templates`, () => { - const templateFilesEl = vm.$el.querySelector('.file-templates'); - if (type === 'tree') { - expect(templateFilesEl).toBeNull(); - } else { - expect(templateFilesEl instanceof Element).toBeTruthy(); - } - }); - }); - }); - - describe('rename entry', () => { - beforeEach(() => { - const store = createStore(); - store.state.entryModal = { - type: 'rename', - path: '', - entry: { - name: 'test', - type: 'blob', - path: 'test-path', - }, - }; - - vm = createComponentWithStore(Component, store).$mount(); - }); - - ['tree', 'blob'].forEach(type => { - it(`renders title and button for renaming ${type}`, done => { - const text = type === 'tree' ? 'folder' : 'file'; - - vm.$store.state.entryModal.entry.type = type; - - vm.$nextTick(() => { - expect(vm.$el.querySelector('.modal-title').textContent.trim()).toBe(`Rename ${text}`); - expect(vm.$el.querySelector('.btn-success').textContent.trim()).toBe(`Rename ${text}`); - - done(); - }); - }); - }); - - describe('entryName', () => { - it('returns entries name', () => { - expect(vm.entryName).toBe('test-path'); - }); - - it('updated name', () => { - vm.name = 'index.js'; - - expect(vm.entryName).toBe('index.js'); - }); - - it('removes leading/trailing spaces when found in the new name', () => { - vm.entryName = ' index.js '; - - expect(vm.entryName).toBe('index.js'); - }); - - it('does not remove internal spaces in the file name', () => { - vm.entryName = ' In Praise of Idleness.txt '; - - expect(vm.entryName).toBe('In Praise of Idleness.txt'); - }); - }); - }); - - describe('submitForm', () => { - it('throws an error when target entry exists', () => { - const store = createStore(); - store.state.entryModal = { - type: 'rename', - path: 'test-path/test', - entry: { - name: 'test', - type: 'blob', - path: 'test-path/test', - }, - }; - store.state.entries = { - 'test-path/test': { - name: 'test', - deleted: false, - }, - }; - - vm = createComponentWithStore(Component, store).$mount(); - const flashSpy = spyOnDependency(modal, 'flash'); - - expect(flashSpy).not.toHaveBeenCalled(); - - vm.submitForm(); - - expect(flashSpy).toHaveBeenCalledWith( - 'The name "test-path/test" is already taken in this directory.', - 'alert', - jasmine.anything(), - null, - false, - true, - ); - }); - }); -}); diff --git a/spec/javascripts/ide/components/new_dropdown/upload_spec.js b/spec/javascripts/ide/components/new_dropdown/upload_spec.js deleted file mode 100644 index 66ddf6c0ee6..00000000000 --- a/spec/javascripts/ide/components/new_dropdown/upload_spec.js +++ /dev/null @@ -1,112 +0,0 @@ -import Vue from 'vue'; -import createComponent from 'spec/helpers/vue_mount_component_helper'; -import upload from '~/ide/components/new_dropdown/upload.vue'; - -describe('new dropdown upload', () => { - let vm; - - beforeEach(() => { - const Component = Vue.extend(upload); - - vm = createComponent(Component, { - path: '', - }); - - vm.entryName = 'testing'; - - spyOn(vm, '$emit').and.callThrough(); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('openFile', () => { - it('calls for each file', () => { - const files = ['test', 'test2', 'test3']; - - spyOn(vm, 'readFile'); - spyOnProperty(vm.$refs.fileUpload, 'files').and.returnValue(files); - - vm.openFile(); - - expect(vm.readFile.calls.count()).toBe(3); - - files.forEach((file, i) => { - expect(vm.readFile.calls.argsFor(i)).toEqual([file]); - }); - }); - }); - - describe('readFile', () => { - beforeEach(() => { - spyOn(FileReader.prototype, 'readAsDataURL'); - }); - - it('calls readAsDataURL for all files', () => { - const file = { - type: 'images/png', - }; - - vm.readFile(file); - - expect(FileReader.prototype.readAsDataURL).toHaveBeenCalledWith(file); - }); - }); - - describe('createFile', () => { - const textTarget = { - result: 'base64,cGxhaW4gdGV4dA==', - }; - const binaryTarget = { - result: 'base64,w4I=', - }; - const textFile = new File(['plain text'], 'textFile'); - - const binaryFile = { - name: 'binaryFile', - type: 'image/png', - }; - - beforeEach(() => { - spyOn(FileReader.prototype, 'readAsText').and.callThrough(); - }); - - it('calls readAsText and creates file in plain text (without encoding) if the file content is plain text', done => { - const waitForCreate = new Promise(resolve => vm.$on('create', resolve)); - - vm.createFile(textTarget, textFile); - - expect(FileReader.prototype.readAsText).toHaveBeenCalledWith(textFile); - - waitForCreate - .then(() => { - expect(vm.$emit).toHaveBeenCalledWith('create', { - name: textFile.name, - type: 'blob', - content: 'plain text', - base64: false, - binary: false, - rawPath: '', - }); - }) - .then(done) - .catch(done.fail); - }); - - it('splits content on base64 if binary', () => { - vm.createFile(binaryTarget, binaryFile); - - expect(FileReader.prototype.readAsText).not.toHaveBeenCalledWith(textFile); - - expect(vm.$emit).toHaveBeenCalledWith('create', { - name: binaryFile.name, - type: 'blob', - content: binaryTarget.result.split('base64,')[1], - base64: true, - binary: true, - rawPath: binaryTarget.result, - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/repo_editor_spec.js b/spec/javascripts/ide/components/repo_editor_spec.js index ef0299f0d56..8db29011da7 100644 --- a/spec/javascripts/ide/components/repo_editor_spec.js +++ b/spec/javascripts/ide/components/repo_editor_spec.js @@ -26,7 +26,23 @@ describe('RepoEditor', () => { f.active = true; f.tempFile = true; + vm.$store.state.openFiles.push(f); + vm.$store.state.projects = { + 'gitlab-org/gitlab': { + branches: { + master: { + name: 'master', + commit: { + id: 'abcdefgh', + }, + }, + }, + }, + }; + vm.$store.state.currentProjectId = 'gitlab-org/gitlab'; + vm.$store.state.currentBranchId = 'master'; + Vue.set(vm.$store.state.entries, f.path, f); spyOn(vm, 'getFileData').and.returnValue(Promise.resolve()); @@ -46,11 +62,6 @@ describe('RepoEditor', () => { }); const findEditor = () => vm.$el.querySelector('.multi-file-editor-holder'); - const changeRightPanelCollapsed = () => { - const { state } = vm.$store; - - state.rightPanelCollapsed = !state.rightPanelCollapsed; - }; it('sets renderWhitespace to `all`', () => { vm.$store.state.renderWhitespaceInCode = true; @@ -303,17 +314,6 @@ describe('RepoEditor', () => { spyOn(vm.editor, 'updateDiffView'); }); - it('calls updateDimensions when rightPanelCollapsed is changed', done => { - changeRightPanelCollapsed(); - - vm.$nextTick(() => { - expect(vm.editor.updateDimensions).toHaveBeenCalled(); - expect(vm.editor.updateDiffView).toHaveBeenCalled(); - - done(); - }); - }); - it('calls updateDimensions when panelResizing is false', done => { vm.$store.state.panelResizing = true; @@ -391,17 +391,6 @@ describe('RepoEditor', () => { expect(findEditor()).toHaveCss({ display: 'none' }); }); - it('should not update dimensions', done => { - changeRightPanelCollapsed(); - - vm.$nextTick() - .then(() => { - expect(vm.editor.updateDimensions).not.toHaveBeenCalled(); - }) - .then(done) - .catch(done.fail); - }); - describe('when file view mode changes to editor', () => { beforeEach(done => { vm.file.viewMode = FILE_VIEW_MODE_EDITOR; diff --git a/spec/javascripts/ide/components/repo_tab_spec.js b/spec/javascripts/ide/components/repo_tab_spec.js deleted file mode 100644 index 3b52f279bf2..00000000000 --- a/spec/javascripts/ide/components/repo_tab_spec.js +++ /dev/null @@ -1,185 +0,0 @@ -import Vue from 'vue'; -import store from '~/ide/stores'; -import repoTab from '~/ide/components/repo_tab.vue'; -import router from '~/ide/ide_router'; -import { file, resetStore } from '../helpers'; - -describe('RepoTab', () => { - let vm; - - function createComponent(propsData) { - const RepoTab = Vue.extend(repoTab); - - return new RepoTab({ - store, - propsData, - }).$mount(); - } - - beforeEach(() => { - spyOn(router, 'push'); - }); - - afterEach(() => { - vm.$destroy(); - - resetStore(vm.$store); - }); - - it('renders a close link and a name link', () => { - vm = createComponent({ - tab: file(), - }); - vm.$store.state.openFiles.push(vm.tab); - const close = vm.$el.querySelector('.multi-file-tab-close'); - const name = vm.$el.querySelector(`[title="${vm.tab.url}"]`); - - expect(close.innerHTML).toContain('#close'); - expect(name.textContent.trim()).toEqual(vm.tab.name); - }); - - it('does not call openPendingTab when tab is active', done => { - vm = createComponent({ - tab: { - ...file(), - pending: true, - active: true, - }, - }); - - spyOn(vm, 'openPendingTab'); - - vm.$el.click(); - - vm.$nextTick(() => { - expect(vm.openPendingTab).not.toHaveBeenCalled(); - - done(); - }); - }); - - it('fires clickFile when the link is clicked', () => { - vm = createComponent({ - tab: file(), - }); - - spyOn(vm, 'clickFile'); - - vm.$el.click(); - - expect(vm.clickFile).toHaveBeenCalledWith(vm.tab); - }); - - it('calls closeFile when clicking close button', () => { - vm = createComponent({ - tab: file(), - }); - - spyOn(vm, 'closeFile'); - - vm.$el.querySelector('.multi-file-tab-close').click(); - - expect(vm.closeFile).toHaveBeenCalledWith(vm.tab); - }); - - it('changes icon on hover', done => { - const tab = file(); - tab.changed = true; - vm = createComponent({ - tab, - }); - - vm.$el.dispatchEvent(new Event('mouseover')); - - Vue.nextTick() - .then(() => { - expect(vm.$el.querySelector('.file-modified')).toBeNull(); - - vm.$el.dispatchEvent(new Event('mouseout')); - }) - .then(Vue.nextTick) - .then(() => { - expect(vm.$el.querySelector('.file-modified')).not.toBeNull(); - - done(); - }) - .catch(done.fail); - }); - - describe('locked file', () => { - let f; - - beforeEach(() => { - f = file('locked file'); - f.file_lock = { - user: { - name: 'testuser', - updated_at: new Date(), - }, - }; - - vm = createComponent({ - tab: f, - }); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders lock icon', () => { - expect(vm.$el.querySelector('.file-status-icon')).not.toBeNull(); - }); - - it('renders a tooltip', () => { - expect(vm.$el.querySelector('span:nth-child(2)').dataset.originalTitle).toContain( - 'Locked by testuser', - ); - }); - }); - - describe('methods', () => { - describe('closeTab', () => { - it('closes tab if file has changed', done => { - const tab = file(); - tab.changed = true; - tab.opened = true; - vm = createComponent({ - tab, - }); - vm.$store.state.openFiles.push(tab); - vm.$store.state.changedFiles.push(tab); - vm.$store.state.entries[tab.path] = tab; - vm.$store.dispatch('setFileActive', tab.path); - - vm.$el.querySelector('.multi-file-tab-close').click(); - - vm.$nextTick(() => { - expect(tab.opened).toBeFalsy(); - expect(vm.$store.state.changedFiles.length).toBe(1); - - done(); - }); - }); - - it('closes tab when clicking close btn', done => { - const tab = file('lose'); - tab.opened = true; - vm = createComponent({ - tab, - }); - vm.$store.state.openFiles.push(tab); - vm.$store.state.entries[tab.path] = tab; - vm.$store.dispatch('setFileActive', tab.path); - - vm.$el.querySelector('.multi-file-tab-close').click(); - - vm.$nextTick(() => { - expect(tab.opened).toBeFalsy(); - - done(); - }); - }); - }); - }); -}); diff --git a/spec/javascripts/ide/components/repo_tabs_spec.js b/spec/javascripts/ide/components/repo_tabs_spec.js deleted file mode 100644 index 583f71e6121..00000000000 --- a/spec/javascripts/ide/components/repo_tabs_spec.js +++ /dev/null @@ -1,35 +0,0 @@ -import Vue from 'vue'; -import repoTabs from '~/ide/components/repo_tabs.vue'; -import createComponent from '../../helpers/vue_mount_component_helper'; -import { file } from '../helpers'; - -describe('RepoTabs', () => { - const openedFiles = [file('open1'), file('open2')]; - const RepoTabs = Vue.extend(repoTabs); - let vm; - - afterEach(() => { - vm.$destroy(); - }); - - it('renders a list of tabs', done => { - vm = createComponent(RepoTabs, { - files: openedFiles, - viewer: 'editor', - hasChanges: false, - activeFile: file('activeFile'), - hasMergeRequest: false, - }); - openedFiles[0].active = true; - - vm.$nextTick(() => { - const tabs = [...vm.$el.querySelectorAll('.multi-file-tab')]; - - expect(tabs.length).toEqual(2); - expect(tabs[0].parentNode.classList.contains('active')).toEqual(true); - expect(tabs[1].parentNode.classList.contains('active')).toEqual(false); - - done(); - }); - }); -}); diff --git a/spec/javascripts/ide/components/shared/tokened_input_spec.js b/spec/javascripts/ide/components/shared/tokened_input_spec.js deleted file mode 100644 index 885fd976655..00000000000 --- a/spec/javascripts/ide/components/shared/tokened_input_spec.js +++ /dev/null @@ -1,133 +0,0 @@ -import Vue from 'vue'; -import mountComponent from 'spec/helpers/vue_mount_component_helper'; -import TokenedInput from '~/ide/components/shared/tokened_input.vue'; - -const TEST_PLACEHOLDER = 'Searching in test'; -const TEST_TOKENS = [ - { label: 'lorem', id: 1 }, - { label: 'ipsum', id: 2 }, - { label: 'dolar', id: 3 }, -]; -const TEST_VALUE = 'lorem'; - -function getTokenElements(vm) { - return Array.from(vm.$el.querySelectorAll('.filtered-search-token button')); -} - -function createBackspaceEvent() { - const e = new Event('keyup'); - e.keyCode = 8; - e.which = e.keyCode; - e.altKey = false; - e.ctrlKey = true; - e.shiftKey = false; - e.metaKey = false; - return e; -} - -describe('IDE shared/TokenedInput', () => { - const Component = Vue.extend(TokenedInput); - let vm; - - beforeEach(() => { - vm = mountComponent(Component, { - tokens: TEST_TOKENS, - placeholder: TEST_PLACEHOLDER, - value: TEST_VALUE, - }); - - spyOn(vm, '$emit'); - }); - - afterEach(() => { - vm.$destroy(); - }); - - it('renders tokens', () => { - const renderedTokens = getTokenElements(vm).map(x => x.textContent.trim()); - - expect(renderedTokens).toEqual(TEST_TOKENS.map(x => x.label)); - }); - - it('renders input', () => { - expect(vm.$refs.input).toBeTruthy(); - expect(vm.$refs.input).toHaveValue(TEST_VALUE); - }); - - it('renders placeholder, when tokens are empty', done => { - vm.tokens = []; - - vm.$nextTick() - .then(() => { - expect(vm.$refs.input).toHaveAttr('placeholder', TEST_PLACEHOLDER); - }) - .then(done) - .catch(done.fail); - }); - - it('triggers "removeToken" on token click', () => { - getTokenElements(vm)[0].click(); - - expect(vm.$emit).toHaveBeenCalledWith('removeToken', TEST_TOKENS[0]); - }); - - it('when input triggers backspace event, it calls "onBackspace"', () => { - spyOn(vm, 'onBackspace'); - - vm.$refs.input.dispatchEvent(createBackspaceEvent()); - vm.$refs.input.dispatchEvent(createBackspaceEvent()); - - expect(vm.onBackspace).toHaveBeenCalledTimes(2); - }); - - it('triggers "removeToken" on backspaces when value is empty', () => { - vm.value = ''; - - vm.onBackspace(); - - expect(vm.$emit).not.toHaveBeenCalled(); - expect(vm.backspaceCount).toEqual(1); - - vm.onBackspace(); - - expect(vm.$emit).toHaveBeenCalledWith('removeToken', TEST_TOKENS[TEST_TOKENS.length - 1]); - expect(vm.backspaceCount).toEqual(0); - }); - - it('does not trigger "removeToken" on backspaces when value is not empty', () => { - vm.onBackspace(); - vm.onBackspace(); - - expect(vm.backspaceCount).toEqual(0); - expect(vm.$emit).not.toHaveBeenCalled(); - }); - - it('does not trigger "removeToken" on backspaces when tokens are empty', () => { - vm.tokens = []; - - vm.onBackspace(); - vm.onBackspace(); - - expect(vm.backspaceCount).toEqual(0); - expect(vm.$emit).not.toHaveBeenCalled(); - }); - - it('triggers "focus" on input focus', () => { - vm.$refs.input.dispatchEvent(new Event('focus')); - - expect(vm.$emit).toHaveBeenCalledWith('focus'); - }); - - it('triggers "blur" on input blur', () => { - vm.$refs.input.dispatchEvent(new Event('blur')); - - expect(vm.$emit).toHaveBeenCalledWith('blur'); - }); - - it('triggers "input" with value on input change', () => { - vm.$refs.input.value = 'something-else'; - vm.$refs.input.dispatchEvent(new Event('input')); - - expect(vm.$emit).toHaveBeenCalledWith('input', 'something-else'); - }); -}); |