diff options
author | Winnie Hellmann <winnie@gitlab.com> | 2019-05-13 20:34:23 +0200 |
---|---|---|
committer | Winnie Hellmann <winnie@gitlab.com> | 2019-05-14 10:36:50 +0200 |
commit | 9f3203475c8c2825df23364cac5cdece746a5d4f (patch) | |
tree | 69de7742695becbd66a7bac402eca292529e787a | |
parent | 40733611c64238c039654166f733ce0f8e59544e (diff) | |
download | gitlab-ce-9f3203475c8c2825df23364cac5cdece746a5d4f.tar.gz |
Delete some tests
14 files changed, 0 insertions, 1978 deletions
diff --git a/spec/javascripts/diffs/components/app_spec.js b/spec/javascripts/diffs/components/app_spec.js deleted file mode 100644 index 1aabf3c2132..00000000000 --- a/spec/javascripts/diffs/components/app_spec.js +++ /dev/null @@ -1,483 +0,0 @@ -import Vuex from 'vuex'; -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import { GlLoadingIcon } from '@gitlab/ui'; -import { TEST_HOST } from 'spec/test_constants'; -import App from '~/diffs/components/app.vue'; -import NoChanges from '~/diffs/components/no_changes.vue'; -import DiffFile from '~/diffs/components/diff_file.vue'; -import Mousetrap from 'mousetrap'; -import CompareVersions from '~/diffs/components/compare_versions.vue'; -import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue'; -import CommitWidget from '~/diffs/components/commit_widget.vue'; -import TreeList from '~/diffs/components/tree_list.vue'; -import createDiffsStore from '../create_diffs_store'; -import diffsMockData from '../mock_data/merge_request_diffs'; - -const mergeRequestDiff = { version_index: 1 }; - -describe('diffs/components/app', () => { - const oldMrTabs = window.mrTabs; - let store; - let wrapper; - - function createComponent(props = {}, extendStore = () => {}) { - const localVue = createLocalVue(); - - localVue.use(Vuex); - - store = createDiffsStore(); - store.state.diffs.isLoading = false; - - extendStore(store); - - wrapper = shallowMount(localVue.extend(App), { - localVue, - propsData: { - endpoint: `${TEST_HOST}/diff/endpoint`, - projectPath: 'namespace/project', - currentUser: {}, - changesEmptyStateIllustration: '', - ...props, - }, - store, - }); - } - - beforeEach(() => { - // setup globals (needed for component to mount :/) - window.mrTabs = jasmine.createSpyObj('mrTabs', ['resetViewContainer']); - window.mrTabs.expandViewContainer = jasmine.createSpy(); - }); - - afterEach(() => { - // reset globals - window.mrTabs = oldMrTabs; - - // reset component - wrapper.destroy(); - }); - - it('adds container-limiting classes when showFileTree is false with inline diffs', () => { - createComponent({}, ({ state }) => { - state.diffs.showTreeList = false; - state.diffs.isParallelView = false; - }); - - expect(wrapper.contains('.container-limited.limit-container-width')).toBe(true); - }); - - it('does not add container-limiting classes when showFileTree is false with inline diffs', () => { - createComponent({}, ({ state }) => { - state.diffs.showTreeList = true; - state.diffs.isParallelView = false; - }); - - expect(wrapper.contains('.container-limited.limit-container-width')).toBe(false); - }); - - it('does not add container-limiting classes when isFluidLayout', () => { - createComponent({ isFluidLayout: true }, ({ state }) => { - state.diffs.isParallelView = false; - }); - - expect(wrapper.contains('.container-limited.limit-container-width')).toBe(false); - }); - - it('displays loading icon on loading', () => { - createComponent({}, ({ state }) => { - state.diffs.isLoading = true; - }); - - expect(wrapper.contains(GlLoadingIcon)).toBe(true); - }); - - it('displays diffs container when not loading', () => { - createComponent(); - - expect(wrapper.contains(GlLoadingIcon)).toBe(false); - expect(wrapper.contains('#diffs')).toBe(true); - }); - - it('does not show commit info', () => { - createComponent(); - - expect(wrapper.contains('.blob-commit-info')).toBe(false); - }); - - describe('row highlighting', () => { - beforeEach(() => { - window.location.hash = 'ABC_123'; - }); - - it('sets highlighted row if hash exists in location object', done => { - createComponent({ - shouldShow: true, - }); - - // Component uses $nextTick so we wait until that has finished - setTimeout(() => { - expect(store.state.diffs.highlightedRow).toBe('ABC_123'); - - done(); - }); - }); - - it('marks current diff file based on currently highlighted row', done => { - createComponent({ - shouldShow: true, - }); - - // Component uses $nextTick so we wait until that has finished - setTimeout(() => { - expect(store.state.diffs.currentDiffFileId).toBe('ABC'); - - done(); - }); - }); - }); - - describe('resizable', () => { - afterEach(() => { - localStorage.removeItem('mr_tree_list_width'); - }); - - it('sets initial width when no localStorage has been set', () => { - createComponent(); - - expect(wrapper.vm.treeWidth).toEqual(320); - }); - - it('sets initial width to localStorage size', () => { - localStorage.setItem('mr_tree_list_width', '200'); - - createComponent(); - - expect(wrapper.vm.treeWidth).toEqual(200); - }); - - it('sets width of tree list', () => { - createComponent(); - - expect(wrapper.find('.js-diff-tree-list').element.style.width).toEqual('320px'); - }); - }); - - it('marks current diff file based on currently highlighted row', done => { - createComponent({ - shouldShow: true, - }); - - // Component uses $nextTick so we wait until that has finished - setTimeout(() => { - expect(store.state.diffs.currentDiffFileId).toBe('ABC'); - - done(); - }); - }); - - describe('empty state', () => { - it('renders empty state when no diff files exist', () => { - createComponent(); - - expect(wrapper.contains(NoChanges)).toBe(true); - }); - - it('does not render empty state when diff files exist', () => { - createComponent({}, ({ state }) => { - state.diffs.diffFiles.push({ - id: 1, - }); - }); - - expect(wrapper.contains(NoChanges)).toBe(false); - expect(wrapper.findAll(DiffFile).length).toBe(1); - }); - - it('does not render empty state when versions match', () => { - createComponent({}, ({ state }) => { - state.diffs.startVersion = mergeRequestDiff; - state.diffs.mergeRequestDiff = mergeRequestDiff; - }); - - expect(wrapper.contains(NoChanges)).toBe(false); - }); - }); - - describe('keyboard shortcut navigation', () => { - const mappings = { - '[': -1, - k: -1, - ']': +1, - j: +1, - }; - let spy; - - describe('visible app', () => { - beforeEach(() => { - spy = jasmine.createSpy('spy'); - - createComponent({ - shouldShow: true, - }); - wrapper.setMethods({ - jumpToFile: spy, - }); - }); - - it('calls `jumpToFile()` with correct parameter whenever pre-defined key is pressed', done => { - wrapper.vm - .$nextTick() - .then(() => { - Object.keys(mappings).forEach(function(key) { - Mousetrap.trigger(key); - - expect(spy.calls.mostRecent().args).toEqual([mappings[key]]); - }); - - expect(spy.calls.count()).toEqual(Object.keys(mappings).length); - }) - .then(done) - .catch(done.fail); - }); - - it('does not call `jumpToFile()` when unknown key is pressed', done => { - wrapper.vm - .$nextTick() - .then(() => { - Mousetrap.trigger('d'); - - expect(spy).not.toHaveBeenCalled(); - }) - .then(done) - .catch(done.fail); - }); - }); - - describe('hideen app', () => { - beforeEach(() => { - spy = jasmine.createSpy('spy'); - - createComponent({ - shouldShow: false, - }); - wrapper.setMethods({ - jumpToFile: spy, - }); - }); - - it('stops calling `jumpToFile()` when application is hidden', done => { - wrapper.vm - .$nextTick() - .then(() => { - Object.keys(mappings).forEach(function(key) { - Mousetrap.trigger(key); - - expect(spy).not.toHaveBeenCalled(); - }); - }) - .then(done) - .catch(done.fail); - }); - }); - }); - - describe('jumpToFile', () => { - let spy; - - beforeEach(() => { - spy = jasmine.createSpy(); - - createComponent({}, () => { - store.state.diffs.diffFiles = [ - { file_hash: '111', file_path: '111.js' }, - { file_hash: '222', file_path: '222.js' }, - { file_hash: '333', file_path: '333.js' }, - ]; - }); - - wrapper.setMethods({ - scrollToFile: spy, - }); - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('jumps to next and previous files in the list', done => { - wrapper.vm - .$nextTick() - .then(() => { - wrapper.vm.jumpToFile(+1); - - expect(spy.calls.mostRecent().args).toEqual(['222.js']); - store.state.diffs.currentDiffFileId = '222'; - wrapper.vm.jumpToFile(+1); - - expect(spy.calls.mostRecent().args).toEqual(['333.js']); - store.state.diffs.currentDiffFileId = '333'; - wrapper.vm.jumpToFile(-1); - - expect(spy.calls.mostRecent().args).toEqual(['222.js']); - }) - .then(done) - .catch(done.fail); - }); - - it('does not jump to previous file from the first one', done => { - wrapper.vm - .$nextTick() - .then(() => { - store.state.diffs.currentDiffFileId = '333'; - - expect(wrapper.vm.currentDiffIndex).toEqual(2); - - wrapper.vm.jumpToFile(+1); - - expect(wrapper.vm.currentDiffIndex).toEqual(2); - expect(spy).not.toHaveBeenCalled(); - }) - .then(done) - .catch(done.fail); - }); - - it('does not jump to next file from the last one', done => { - wrapper.vm - .$nextTick() - .then(() => { - expect(wrapper.vm.currentDiffIndex).toEqual(0); - - wrapper.vm.jumpToFile(-1); - - expect(wrapper.vm.currentDiffIndex).toEqual(0); - expect(spy).not.toHaveBeenCalled(); - }) - .then(done) - .catch(done.fail); - }); - }); - - describe('diffs', () => { - it('should render compare versions component', () => { - createComponent({}, ({ state }) => { - state.diffs.mergeRequestDiffs = diffsMockData; - state.diffs.targetBranchName = 'target-branch'; - state.diffs.mergeRequestDiff = mergeRequestDiff; - }); - - expect(wrapper.contains(CompareVersions)).toBe(true); - expect(wrapper.find(CompareVersions).props()).toEqual( - jasmine.objectContaining({ - targetBranch: { - branchName: 'target-branch', - versionIndex: -1, - path: '', - }, - mergeRequestDiffs: diffsMockData, - mergeRequestDiff, - }), - ); - }); - - it('should render hidden files warning if render overflow warning is present', () => { - createComponent({}, ({ state }) => { - state.diffs.renderOverflowWarning = true; - state.diffs.realSize = '5'; - state.diffs.plainDiffPath = 'plain diff path'; - state.diffs.emailPatchPath = 'email patch path'; - state.diffs.size = 1; - }); - - expect(wrapper.contains(HiddenFilesWarning)).toBe(true); - expect(wrapper.find(HiddenFilesWarning).props()).toEqual( - jasmine.objectContaining({ - total: '5', - plainDiffPath: 'plain diff path', - emailPatchPath: 'email patch path', - visible: 1, - }), - ); - }); - - it('should display commit widget if store has a commit', () => { - createComponent({}, () => { - store.state.diffs.commit = { - author: 'John Doe', - }; - }); - - expect(wrapper.contains(CommitWidget)).toBe(true); - }); - - it('should display diff file if there are diff files', () => { - createComponent({}, ({ state }) => { - state.diffs.diffFiles.push({ sha: '123' }); - }); - - expect(wrapper.contains(DiffFile)).toBe(true); - }); - - it('should render tree list', () => { - createComponent(); - - expect(wrapper.find(TreeList).exists()).toBe(true); - }); - }); - - describe('hideTreeListIfJustOneFile', () => { - let toggleShowTreeList; - - beforeEach(() => { - toggleShowTreeList = jasmine.createSpy('toggleShowTreeList'); - }); - - afterEach(() => { - localStorage.removeItem('mr_tree_show'); - }); - - it('calls toggleShowTreeList when only 1 file', () => { - createComponent({}, ({ state }) => { - state.diffs.diffFiles.push({ sha: '123' }); - }); - - wrapper.setMethods({ - toggleShowTreeList, - }); - - wrapper.vm.hideTreeListIfJustOneFile(); - - expect(toggleShowTreeList).toHaveBeenCalledWith(false); - }); - - it('does not call toggleShowTreeList when more than 1 file', () => { - createComponent({}, ({ state }) => { - state.diffs.diffFiles.push({ sha: '123' }); - state.diffs.diffFiles.push({ sha: '124' }); - }); - - wrapper.setMethods({ - toggleShowTreeList, - }); - - wrapper.vm.hideTreeListIfJustOneFile(); - - expect(toggleShowTreeList).not.toHaveBeenCalled(); - }); - - it('does not call toggleShowTreeList when localStorage is set', () => { - localStorage.setItem('mr_tree_show', 'true'); - - createComponent({}, ({ state }) => { - state.diffs.diffFiles.push({ sha: '123' }); - }); - - wrapper.setMethods({ - toggleShowTreeList, - }); - - wrapper.vm.hideTreeListIfJustOneFile(); - - expect(toggleShowTreeList).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/spec/javascripts/diffs/components/settings_dropdown_spec.js b/spec/javascripts/diffs/components/settings_dropdown_spec.js deleted file mode 100644 index 5031846cff0..00000000000 --- a/spec/javascripts/diffs/components/settings_dropdown_spec.js +++ /dev/null @@ -1,167 +0,0 @@ -import { mount, createLocalVue } from '@vue/test-utils'; -import Vuex from 'vuex'; -import diffModule from '~/diffs/store/modules'; -import SettingsDropdown from '~/diffs/components/settings_dropdown.vue'; -import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants'; - -describe('Diff settiings dropdown component', () => { - let vm; - let actions; - - function createComponent(extendStore = () => {}) { - const localVue = createLocalVue(); - - localVue.use(Vuex); - - const store = new Vuex.Store({ - modules: { - diffs: { - namespaced: true, - actions, - state: diffModule().state, - getters: diffModule().getters, - }, - }, - }); - - extendStore(store); - - vm = mount(SettingsDropdown, { - localVue, - store, - }); - } - - beforeEach(() => { - actions = { - setInlineDiffViewType: jasmine.createSpy('setInlineDiffViewType'), - setParallelDiffViewType: jasmine.createSpy('setParallelDiffViewType'), - setRenderTreeList: jasmine.createSpy('setRenderTreeList'), - setShowWhitespace: jasmine.createSpy('setShowWhitespace'), - }; - }); - - afterEach(() => { - vm.destroy(); - }); - - describe('tree view buttons', () => { - it('list view button dispatches setRenderTreeList with false', () => { - createComponent(); - - vm.find('.js-list-view').trigger('click'); - - expect(actions.setRenderTreeList).toHaveBeenCalledWith(jasmine.anything(), false, undefined); - }); - - it('tree view button dispatches setRenderTreeList with true', () => { - createComponent(); - - vm.find('.js-tree-view').trigger('click'); - - expect(actions.setRenderTreeList).toHaveBeenCalledWith(jasmine.anything(), true, undefined); - }); - - it('sets list button as active when renderTreeList is false', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - renderTreeList: false, - }); - }); - - expect(vm.find('.js-list-view').classes('active')).toBe(true); - expect(vm.find('.js-tree-view').classes('active')).toBe(false); - }); - - it('sets tree button as active when renderTreeList is true', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - renderTreeList: true, - }); - }); - - expect(vm.find('.js-list-view').classes('active')).toBe(false); - expect(vm.find('.js-tree-view').classes('active')).toBe(true); - }); - }); - - describe('compare changes', () => { - it('sets inline button as active', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - diffViewType: INLINE_DIFF_VIEW_TYPE, - }); - }); - - expect(vm.find('.js-inline-diff-button').classes('active')).toBe(true); - expect(vm.find('.js-parallel-diff-button').classes('active')).toBe(false); - }); - - it('sets parallel button as active', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - diffViewType: PARALLEL_DIFF_VIEW_TYPE, - }); - }); - - expect(vm.find('.js-inline-diff-button').classes('active')).toBe(false); - expect(vm.find('.js-parallel-diff-button').classes('active')).toBe(true); - }); - - it('calls setInlineDiffViewType when clicking inline button', () => { - createComponent(); - - vm.find('.js-inline-diff-button').trigger('click'); - - expect(actions.setInlineDiffViewType).toHaveBeenCalled(); - }); - - it('calls setParallelDiffViewType when clicking parallel button', () => { - createComponent(); - - vm.find('.js-parallel-diff-button').trigger('click'); - - expect(actions.setParallelDiffViewType).toHaveBeenCalled(); - }); - }); - - describe('whitespace toggle', () => { - it('does not set as checked when showWhitespace is false', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - showWhitespace: false, - }); - }); - - expect(vm.find('#show-whitespace').element.checked).toBe(false); - }); - - it('sets as checked when showWhitespace is true', () => { - createComponent(store => { - Object.assign(store.state.diffs, { - showWhitespace: true, - }); - }); - - expect(vm.find('#show-whitespace').element.checked).toBe(true); - }); - - it('calls setShowWhitespace on change', () => { - createComponent(); - - const checkbox = vm.find('#show-whitespace'); - - checkbox.element.checked = true; - checkbox.trigger('change'); - - expect(actions.setShowWhitespace).toHaveBeenCalledWith( - jasmine.anything(), - { - showWhitespace: true, - pushState: true, - }, - undefined, - ); - }); - }); -}); diff --git a/spec/javascripts/environments/confirm_rollback_modal_spec.js b/spec/javascripts/environments/confirm_rollback_modal_spec.js deleted file mode 100644 index 05715bce38f..00000000000 --- a/spec/javascripts/environments/confirm_rollback_modal_spec.js +++ /dev/null @@ -1,70 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { GlModal } from '@gitlab/ui'; -import ConfirmRollbackModal from '~/environments/components/confirm_rollback_modal.vue'; -import eventHub from '~/environments/event_hub'; - -describe('Confirm Rollback Modal Component', () => { - let environment; - - beforeEach(() => { - environment = { - name: 'test', - last_deployment: { - commit: { - short_id: 'abc0123', - }, - }, - modalId: 'test', - }; - }); - - it('should show "Rollback" when isLastDeployment is false', () => { - const component = shallowMount(ConfirmRollbackModal, { - propsData: { - environment: { - ...environment, - isLastDeployment: false, - }, - }, - }); - const modal = component.find(GlModal); - - expect(modal.attributes('title')).toContain('Rollback'); - expect(modal.attributes('title')).toContain('test'); - expect(modal.attributes('ok-title')).toBe('Rollback'); - expect(modal.text()).toContain('commit abc0123'); - expect(modal.text()).toContain('Are you sure you want to continue?'); - }); - - it('should show "Re-deploy" when isLastDeployment is true', () => { - const component = shallowMount(ConfirmRollbackModal, { - propsData: { - environment: { - ...environment, - isLastDeployment: true, - }, - }, - }); - const modal = component.find(GlModal); - - expect(modal.attributes('title')).toContain('Re-deploy'); - expect(modal.attributes('title')).toContain('test'); - expect(modal.attributes('ok-title')).toBe('Re-deploy'); - expect(modal.text()).toContain('commit abc0123'); - expect(modal.text()).toContain('Are you sure you want to continue?'); - }); - - it('should emit the "rollback" event when "ok" is clicked', () => { - environment = { ...environment, isLastDeployment: true }; - const component = shallowMount(ConfirmRollbackModal, { - propsData: { - environment, - }, - }); - const eventHubSpy = spyOn(eventHub, '$emit'); - const modal = component.find(GlModal); - modal.vm.$emit('ok'); - - expect(eventHubSpy).toHaveBeenCalledWith('rollbackEnvironment', environment); - }); -}); diff --git a/spec/javascripts/environments/environment_rollback_spec.js b/spec/javascripts/environments/environment_rollback_spec.js deleted file mode 100644 index 8c47f6a12c0..00000000000 --- a/spec/javascripts/environments/environment_rollback_spec.js +++ /dev/null @@ -1,61 +0,0 @@ -import Vue from 'vue'; -import { shallowMount } from '@vue/test-utils'; -import { GlButton } from '@gitlab/ui'; -import eventHub from '~/environments/event_hub'; -import rollbackComp from '~/environments/components/environment_rollback.vue'; - -describe('Rollback Component', () => { - const retryUrl = 'https://gitlab.com/retry'; - let RollbackComponent; - - beforeEach(() => { - RollbackComponent = Vue.extend(rollbackComp); - }); - - it('Should render Re-deploy label when isLastDeployment is true', () => { - const component = new RollbackComponent({ - el: document.querySelector('.test-dom-element'), - propsData: { - retryUrl, - isLastDeployment: true, - environment: {}, - }, - }).$mount(); - - expect(component.$el).toHaveSpriteIcon('repeat'); - }); - - it('Should render Rollback label when isLastDeployment is false', () => { - const component = new RollbackComponent({ - el: document.querySelector('.test-dom-element'), - propsData: { - retryUrl, - isLastDeployment: false, - environment: {}, - }, - }).$mount(); - - expect(component.$el).toHaveSpriteIcon('redo'); - }); - - it('should emit a "rollback" event on button click', () => { - const eventHubSpy = spyOn(eventHub, '$emit'); - const component = shallowMount(RollbackComponent, { - propsData: { - retryUrl, - environment: { - name: 'test', - }, - }, - }); - const button = component.find(GlButton); - - button.vm.$emit('click'); - - expect(eventHubSpy).toHaveBeenCalledWith('requestRollbackEnvironment', { - retryUrl, - isLastDeployment: true, - name: 'test', - }); - }); -}); diff --git a/spec/javascripts/error_tracking_settings/components/app_spec.js b/spec/javascripts/error_tracking_settings/components/app_spec.js deleted file mode 100644 index 2e52a45fd34..00000000000 --- a/spec/javascripts/error_tracking_settings/components/app_spec.js +++ /dev/null @@ -1,63 +0,0 @@ -import Vuex from 'vuex'; -import { createLocalVue, shallowMount } from '@vue/test-utils'; -import ErrorTrackingSettings from '~/error_tracking_settings/components/app.vue'; -import ErrorTrackingForm from '~/error_tracking_settings/components/error_tracking_form.vue'; -import ProjectDropdown from '~/error_tracking_settings/components/project_dropdown.vue'; -import createStore from '~/error_tracking_settings/store'; -import { TEST_HOST } from 'spec/test_constants'; - -const localVue = createLocalVue(); -localVue.use(Vuex); - -describe('error tracking settings app', () => { - let store; - let wrapper; - - function mountComponent() { - wrapper = shallowMount(ErrorTrackingSettings, { - localVue, - store, // Override the imported store - propsData: { - initialEnabled: 'true', - initialApiHost: TEST_HOST, - initialToken: 'someToken', - initialProject: null, - listProjectsEndpoint: TEST_HOST, - operationsSettingsEndpoint: TEST_HOST, - }, - }); - } - - beforeEach(() => { - store = createStore(); - - mountComponent(); - }); - - afterEach(() => { - if (wrapper) { - wrapper.destroy(); - } - }); - - describe('section', () => { - it('renders the form and dropdown', () => { - expect(wrapper.find(ErrorTrackingForm).exists()).toBeTruthy(); - expect(wrapper.find(ProjectDropdown).exists()).toBeTruthy(); - }); - - it('renders the Save Changes button', () => { - expect(wrapper.find('.js-error-tracking-button').exists()).toBeTruthy(); - }); - - it('enables the button by default', () => { - expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeFalsy(); - }); - - it('disables the button when saving', () => { - store.state.settingsLoading = true; - - expect(wrapper.find('.js-error-tracking-button').attributes('disabled')).toBeTruthy(); - }); - }); -}); diff --git a/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js b/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js deleted file mode 100644 index 23e57c4bbf1..00000000000 --- a/spec/javascripts/error_tracking_settings/components/error_tracking_form_spec.js +++ /dev/null @@ -1,91 +0,0 @@ -import Vuex from 'vuex'; -import { createLocalVue, shallowMount } from '@vue/test-utils'; -import { GlButton, GlFormInput } from '@gitlab/ui'; -import ErrorTrackingForm from '~/error_tracking_settings/components/error_tracking_form.vue'; -import { defaultProps } from '../mock'; - -const localVue = createLocalVue(); -localVue.use(Vuex); - -describe('error tracking settings form', () => { - let wrapper; - - function mountComponent() { - wrapper = shallowMount(ErrorTrackingForm, { - localVue, - propsData: defaultProps, - }); - } - - beforeEach(() => { - mountComponent(); - }); - - afterEach(() => { - if (wrapper) { - wrapper.destroy(); - } - }); - - describe('an empty form', () => { - it('is rendered', () => { - expect(wrapper.findAll(GlFormInput).length).toBe(2); - expect(wrapper.find(GlFormInput).attributes('id')).toBe('error-tracking-api-host'); - expect( - wrapper - .findAll(GlFormInput) - .at(1) - .attributes('id'), - ).toBe('error-tracking-token'); - - expect(wrapper.findAll(GlButton).exists()).toBe(true); - }); - - it('is rendered with labels and placeholders', () => { - const pageText = wrapper.text(); - - expect(pageText).toContain('Find your hostname in your Sentry account settings page'); - expect(pageText).toContain( - "After adding your Auth Token, use the 'Connect' button to load projects", - ); - - expect(pageText).not.toContain('Connection has failed. Re-check Auth Token and try again'); - expect( - wrapper - .findAll(GlFormInput) - .at(0) - .attributes('placeholder'), - ).toContain('https://mysentryserver.com'); - }); - }); - - describe('after a successful connection', () => { - beforeEach(() => { - wrapper.setProps({ connectSuccessful: true }); - }); - - it('shows the success checkmark', () => { - expect(wrapper.find('.js-error-tracking-connect-success').isVisible()).toBe(true); - }); - - it('does not show an error', () => { - expect(wrapper.text()).not.toContain( - 'Connection has failed. Re-check Auth Token and try again', - ); - }); - }); - - describe('after an unsuccessful connection', () => { - beforeEach(() => { - wrapper.setProps({ connectError: true }); - }); - - it('does not show the check mark', () => { - expect(wrapper.find('.js-error-tracking-connect-success').isVisible()).toBe(false); - }); - - it('shows an error', () => { - expect(wrapper.text()).toContain('Connection has failed. Re-check Auth Token and try again'); - }); - }); -}); diff --git a/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js b/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js deleted file mode 100644 index 8e5dbe28452..00000000000 --- a/spec/javascripts/error_tracking_settings/components/project_dropdown_spec.js +++ /dev/null @@ -1,109 +0,0 @@ -import _ from 'underscore'; -import Vuex from 'vuex'; -import { createLocalVue, shallowMount } from '@vue/test-utils'; -import { GlDropdown, GlDropdownItem } from '@gitlab/ui'; -import ProjectDropdown from '~/error_tracking_settings/components/project_dropdown.vue'; -import { defaultProps, projectList, staleProject } from '../mock'; - -const localVue = createLocalVue(); -localVue.use(Vuex); - -describe('error tracking settings project dropdown', () => { - let wrapper; - - function mountComponent() { - wrapper = shallowMount(ProjectDropdown, { - localVue, - propsData: { - ..._.pick( - defaultProps, - 'dropdownLabel', - 'invalidProjectLabel', - 'projects', - 'projectSelectionLabel', - 'selectedProject', - 'token', - ), - hasProjects: false, - isProjectInvalid: false, - }, - }); - } - - beforeEach(() => { - mountComponent(); - }); - - afterEach(() => { - if (wrapper) { - wrapper.destroy(); - } - }); - - describe('empty project list', () => { - it('renders the dropdown', () => { - expect(wrapper.find('#project-dropdown').exists()).toBeTruthy(); - expect(wrapper.find(GlDropdown).exists()).toBeTruthy(); - }); - - it('shows helper text', () => { - expect(wrapper.find('.js-project-dropdown-label').exists()).toBeTruthy(); - expect(wrapper.find('.js-project-dropdown-label').text()).toContain( - 'To enable project selection', - ); - }); - - it('does not show an error', () => { - expect(wrapper.find('.js-project-dropdown-error').exists()).toBeFalsy(); - }); - - it('does not contain any dropdown items', () => { - expect(wrapper.find(GlDropdownItem).exists()).toBeFalsy(); - expect(wrapper.find(GlDropdown).props('text')).toBe('No projects available'); - }); - }); - - describe('populated project list', () => { - beforeEach(() => { - wrapper.setProps({ projects: _.clone(projectList), hasProjects: true }); - }); - - it('renders the dropdown', () => { - expect(wrapper.find('#project-dropdown').exists()).toBeTruthy(); - expect(wrapper.find(GlDropdown).exists()).toBeTruthy(); - }); - - it('contains a number of dropdown items', () => { - expect(wrapper.find(GlDropdownItem).exists()).toBeTruthy(); - expect(wrapper.findAll(GlDropdownItem).length).toBe(2); - }); - }); - - describe('selected project', () => { - const selectedProject = _.clone(projectList[0]); - - beforeEach(() => { - wrapper.setProps({ projects: _.clone(projectList), selectedProject, hasProjects: true }); - }); - - it('does not show helper text', () => { - expect(wrapper.find('.js-project-dropdown-label').exists()).toBeFalsy(); - expect(wrapper.find('.js-project-dropdown-error').exists()).toBeFalsy(); - }); - }); - - describe('invalid project selected', () => { - beforeEach(() => { - wrapper.setProps({ - projects: _.clone(projectList), - selectedProject: staleProject, - isProjectInvalid: true, - }); - }); - - it('displays a error', () => { - expect(wrapper.find('.js-project-dropdown-label').exists()).toBeFalsy(); - expect(wrapper.find('.js-project-dropdown-error').exists()).toBeTruthy(); - }); - }); -}); diff --git a/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js b/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js deleted file mode 100644 index f00bc2eeb6d..00000000000 --- a/spec/javascripts/frequent_items/components/frequent_items_list_item_spec.js +++ /dev/null @@ -1,95 +0,0 @@ -import Vue from 'vue'; -import frequentItemsListItemComponent from '~/frequent_items/components/frequent_items_list_item.vue'; -import { shallowMount } from '@vue/test-utils'; -import { trimText } from 'spec/helpers/vue_component_helper'; -import { mockProject } from '../mock_data'; // can also use 'mockGroup', but not useful to test here - -const createComponent = () => { - const Component = Vue.extend(frequentItemsListItemComponent); - - return shallowMount(Component, { - propsData: { - itemId: mockProject.id, - itemName: mockProject.name, - namespace: mockProject.namespace, - webUrl: mockProject.webUrl, - avatarUrl: mockProject.avatarUrl, - }, - }); -}; - -describe('FrequentItemsListItemComponent', () => { - let wrapper; - let vm; - - beforeEach(() => { - wrapper = createComponent(); - - ({ vm } = wrapper); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('computed', () => { - describe('hasAvatar', () => { - it('should return `true` or `false` if whether avatar is present or not', () => { - wrapper.setProps({ avatarUrl: 'path/to/avatar.png' }); - - expect(vm.hasAvatar).toBe(true); - - wrapper.setProps({ avatarUrl: null }); - - expect(vm.hasAvatar).toBe(false); - }); - }); - - describe('highlightedItemName', () => { - it('should enclose part of project name in <b> & </b> which matches with `matcher` prop', () => { - wrapper.setProps({ matcher: 'lab' }); - - expect(wrapper.find('.js-frequent-items-item-title').html()).toContain( - '<b>L</b><b>a</b><b>b</b>', - ); - }); - - it('should return project name as it is if `matcher` is not available', () => { - wrapper.setProps({ matcher: null }); - - expect(trimText(wrapper.find('.js-frequent-items-item-title').text())).toBe( - mockProject.name, - ); - }); - }); - - describe('truncatedNamespace', () => { - it('should truncate project name from namespace string', () => { - wrapper.setProps({ namespace: 'platform / nokia-3310' }); - - expect(trimText(wrapper.find('.js-frequent-items-item-namespace').text())).toBe('platform'); - }); - - it('should truncate namespace string from the middle if it includes more than two groups in path', () => { - wrapper.setProps({ - namespace: 'platform / hardware / broadcom / Wifi Group / Mobile Chipset / nokia-3310', - }); - - expect(trimText(wrapper.find('.js-frequent-items-item-namespace').text())).toBe( - 'platform / ... / Mobile Chipset', - ); - }); - }); - }); - - describe('template', () => { - it('should render component element', () => { - expect(wrapper.classes()).toContain('frequent-items-list-item-container'); - expect(wrapper.findAll('a').length).toBe(1); - expect(wrapper.findAll('.frequent-items-item-avatar-container').length).toBe(1); - expect(wrapper.findAll('.frequent-items-item-metadata-container').length).toBe(1); - expect(wrapper.findAll('.frequent-items-item-title').length).toBe(1); - expect(wrapper.findAll('.frequent-items-item-namespace').length).toBe(1); - }); - }); -}); diff --git a/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js b/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js deleted file mode 100644 index ddbbc5c2d29..00000000000 --- a/spec/javascripts/frequent_items/components/frequent_items_search_input_spec.js +++ /dev/null @@ -1,81 +0,0 @@ -import Vue from 'vue'; -import searchComponent from '~/frequent_items/components/frequent_items_search_input.vue'; -import eventHub from '~/frequent_items/event_hub'; -import { shallowMount } from '@vue/test-utils'; - -const createComponent = (namespace = 'projects') => { - const Component = Vue.extend(searchComponent); - - return shallowMount(Component, { propsData: { namespace } }); -}; - -describe('FrequentItemsSearchInputComponent', () => { - let wrapper; - let vm; - - beforeEach(() => { - wrapper = createComponent(); - - ({ vm } = wrapper); - }); - - afterEach(() => { - vm.$destroy(); - }); - - describe('methods', () => { - describe('setFocus', () => { - it('should set focus to search input', () => { - spyOn(vm.$refs.search, 'focus'); - - vm.setFocus(); - - expect(vm.$refs.search.focus).toHaveBeenCalled(); - }); - }); - }); - - describe('mounted', () => { - it('should listen `dropdownOpen` event', done => { - spyOn(eventHub, '$on'); - const vmX = createComponent().vm; - - Vue.nextTick(() => { - expect(eventHub.$on).toHaveBeenCalledWith( - `${vmX.namespace}-dropdownOpen`, - jasmine.any(Function), - ); - done(); - }); - }); - }); - - describe('beforeDestroy', () => { - it('should unbind event listeners on eventHub', done => { - const vmX = createComponent().vm; - spyOn(eventHub, '$off'); - - vmX.$mount(); - vmX.$destroy(); - - Vue.nextTick(() => { - expect(eventHub.$off).toHaveBeenCalledWith( - `${vmX.namespace}-dropdownOpen`, - jasmine.any(Function), - ); - done(); - }); - }); - }); - - describe('template', () => { - it('should render component element', () => { - expect(wrapper.classes()).toContain('search-input-container'); - expect(wrapper.contains('input.form-control')).toBe(true); - expect(wrapper.contains('.search-icon')).toBe(true); - expect(wrapper.find('input.form-control').attributes('placeholder')).toBe( - 'Search your projects', - ); - }); - }); -}); diff --git a/spec/javascripts/helpers/vue_test_utils_helper_spec.js b/spec/javascripts/helpers/vue_test_utils_helper_spec.js deleted file mode 100644 index 41714066da5..00000000000 --- a/spec/javascripts/helpers/vue_test_utils_helper_spec.js +++ /dev/null @@ -1,48 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { shallowWrapperContainsSlotText } from './vue_test_utils_helper'; - -describe('Vue test utils helpers', () => { - describe('shallowWrapperContainsSlotText', () => { - const mockText = 'text'; - const mockSlot = `<div>${mockText}</div>`; - let mockComponent; - - beforeEach(() => { - mockComponent = shallowMount( - { - render(h) { - h(`<div>mockedComponent</div>`); - }, - }, - { - slots: { - default: mockText, - namedSlot: mockSlot, - }, - }, - ); - }); - - it('finds text within shallowWrapper default slot', () => { - expect(shallowWrapperContainsSlotText(mockComponent, 'default', mockText)).toBe(true); - }); - - it('finds text within shallowWrapper named slot', () => { - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', mockText)).toBe(true); - }); - - it('returns false when text is not present', () => { - const searchText = 'absent'; - - expect(shallowWrapperContainsSlotText(mockComponent, 'default', searchText)).toBe(false); - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', searchText)).toBe(false); - }); - - it('searches with case-sensitivity', () => { - const searchText = mockText.toUpperCase(); - - expect(shallowWrapperContainsSlotText(mockComponent, 'default', searchText)).toBe(false); - expect(shallowWrapperContainsSlotText(mockComponent, 'namedSlot', searchText)).toBe(false); - }); - }); -}); diff --git a/spec/javascripts/monitoring/charts/area_spec.js b/spec/javascripts/monitoring/charts/area_spec.js deleted file mode 100644 index 41a6c04efb9..00000000000 --- a/spec/javascripts/monitoring/charts/area_spec.js +++ /dev/null @@ -1,231 +0,0 @@ -import { shallowMount } from '@vue/test-utils'; -import { GlAreaChart, GlChartSeriesLabel } from '@gitlab/ui/dist/charts'; -import { shallowWrapperContainsSlotText } from 'spec/helpers/vue_test_utils_helper'; -import Area from '~/monitoring/components/charts/area.vue'; -import MonitoringStore from '~/monitoring/stores/monitoring_store'; -import MonitoringMock, { deploymentData } from '../mock_data'; - -describe('Area component', () => { - const mockWidgets = 'mockWidgets'; - const mockSvgPathContent = 'mockSvgPathContent'; - let mockGraphData; - let areaChart; - let spriteSpy; - - beforeEach(() => { - const store = new MonitoringStore(); - store.storeMetrics(MonitoringMock.data); - store.storeDeploymentData(deploymentData); - - [mockGraphData] = store.groups[0].metrics; - - areaChart = shallowMount(Area, { - propsData: { - graphData: mockGraphData, - containerWidth: 0, - deploymentData: store.deploymentData, - }, - slots: { - default: mockWidgets, - }, - }); - - spriteSpy = spyOnDependency(Area, 'getSvgIconPathContent').and.callFake( - () => new Promise(resolve => resolve(mockSvgPathContent)), - ); - }); - - afterEach(() => { - areaChart.destroy(); - }); - - it('renders chart title', () => { - expect(areaChart.find({ ref: 'graphTitle' }).text()).toBe(mockGraphData.title); - }); - - it('contains graph widgets from slot', () => { - expect(areaChart.find({ ref: 'graphWidgets' }).text()).toBe(mockWidgets); - }); - - describe('wrapped components', () => { - describe('GitLab UI area chart', () => { - let glAreaChart; - - beforeEach(() => { - glAreaChart = areaChart.find(GlAreaChart); - }); - - it('is a Vue instance', () => { - expect(glAreaChart.isVueInstance()).toBe(true); - }); - - it('receives data properties needed for proper chart render', () => { - const props = glAreaChart.props(); - - expect(props.data).toBe(areaChart.vm.chartData); - expect(props.option).toBe(areaChart.vm.chartOptions); - expect(props.formatTooltipText).toBe(areaChart.vm.formatTooltipText); - expect(props.thresholds).toBe(areaChart.vm.thresholds); - }); - - it('recieves a tooltip title', () => { - const mockTitle = 'mockTitle'; - areaChart.vm.tooltip.title = mockTitle; - - expect(shallowWrapperContainsSlotText(glAreaChart, 'tooltipTitle', mockTitle)).toBe(true); - }); - - describe('when tooltip is showing deployment data', () => { - beforeEach(() => { - areaChart.vm.tooltip.isDeployment = true; - }); - - it('uses deployment title', () => { - expect(shallowWrapperContainsSlotText(glAreaChart, 'tooltipTitle', 'Deployed')).toBe( - true, - ); - }); - - it('renders commit sha in tooltip content', () => { - const mockSha = 'mockSha'; - areaChart.vm.tooltip.sha = mockSha; - - expect(shallowWrapperContainsSlotText(glAreaChart, 'tooltipContent', mockSha)).toBe(true); - }); - }); - }); - }); - - describe('methods', () => { - describe('formatTooltipText', () => { - const mockDate = deploymentData[0].created_at; - const generateSeriesData = type => ({ - seriesData: [ - { - seriesName: areaChart.vm.chartData[0].name, - componentSubType: type, - value: [mockDate, 5.55555], - seriesIndex: 0, - }, - ], - value: mockDate, - }); - - describe('when series is of line type', () => { - beforeEach(() => { - areaChart.vm.formatTooltipText(generateSeriesData('line')); - }); - - it('formats tooltip title', () => { - expect(areaChart.vm.tooltip.title).toBe('31 May 2017, 9:23PM'); - }); - - it('formats tooltip content', () => { - const name = 'Core Usage'; - const value = '5.556'; - const seriesLabel = areaChart.find(GlChartSeriesLabel); - - expect(seriesLabel.vm.color).toBe(''); - expect(shallowWrapperContainsSlotText(seriesLabel, 'default', name)).toBe(true); - expect(areaChart.vm.tooltip.content).toEqual([{ name, value, color: undefined }]); - expect( - shallowWrapperContainsSlotText(areaChart.find(GlAreaChart), 'tooltipContent', value), - ).toBe(true); - }); - }); - - describe('when series is of scatter type', () => { - beforeEach(() => { - areaChart.vm.formatTooltipText(generateSeriesData('scatter')); - }); - - it('formats tooltip title', () => { - expect(areaChart.vm.tooltip.title).toBe('31 May 2017, 9:23PM'); - }); - - it('formats tooltip sha', () => { - expect(areaChart.vm.tooltip.sha).toBe('f5bcd1d9'); - }); - }); - }); - - describe('setSvg', () => { - const mockSvgName = 'mockSvgName'; - - beforeEach(() => { - areaChart.vm.setSvg(mockSvgName); - }); - - it('gets svg path content', () => { - expect(spriteSpy).toHaveBeenCalledWith(mockSvgName); - }); - - it('sets svg path content', done => { - areaChart.vm.$nextTick(() => { - expect(areaChart.vm.svgs[mockSvgName]).toBe(`path://${mockSvgPathContent}`); - done(); - }); - }); - }); - - describe('onResize', () => { - const mockWidth = 233; - - beforeEach(() => { - spyOn(Element.prototype, 'getBoundingClientRect').and.callFake(() => ({ - width: mockWidth, - })); - areaChart.vm.onResize(); - }); - - it('sets area chart width', () => { - expect(areaChart.vm.width).toBe(mockWidth); - }); - }); - }); - - describe('computed', () => { - describe('chartData', () => { - let chartData; - const seriesData = () => chartData[0]; - - beforeEach(() => { - ({ chartData } = areaChart.vm); - }); - - it('utilizes all data points', () => { - expect(chartData.length).toBe(1); - expect(seriesData().data.length).toBe(297); - }); - - it('creates valid data', () => { - const { data } = seriesData(); - - expect( - data.filter(([time, value]) => new Date(time).getTime() > 0 && typeof value === 'number') - .length, - ).toBe(data.length); - }); - - it('formats line width correctly', () => { - expect(chartData[0].lineStyle.width).toBe(2); - }); - }); - - describe('scatterSeries', () => { - it('utilizes deployment data', () => { - expect(areaChart.vm.scatterSeries.data).toEqual([ - ['2017-05-31T21:23:37.881Z', 0], - ['2017-05-30T20:08:04.629Z', 0], - ['2017-05-30T17:42:38.409Z', 0], - ]); - }); - }); - - describe('yAxisLabel', () => { - it('constructs a label for the chart y-axis', () => { - expect(areaChart.vm.yAxisLabel).toBe('CPU'); - }); - }); - }); -}); diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js deleted file mode 100644 index efa864e7d00..00000000000 --- a/spec/javascripts/notes/components/noteable_discussion_spec.js +++ /dev/null @@ -1,269 +0,0 @@ -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import createStore from '~/notes/stores'; -import noteableDiscussion from '~/notes/components/noteable_discussion.vue'; -import ReplyPlaceholder from '~/notes/components/discussion_reply_placeholder.vue'; -import ResolveWithIssueButton from '~/notes/components/discussion_resolve_with_issue_button.vue'; -import NoteForm from '~/notes/components/note_form.vue'; -import '~/behaviors/markdown/render_gfm'; -import { noteableDataMock, discussionMock, notesDataMock } from '../mock_data'; -import mockDiffFile from '../../diffs/mock_data/diff_file'; - -const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json'; - -describe('noteable_discussion component', () => { - let store; - let wrapper; - - preloadFixtures(discussionWithTwoUnresolvedNotes); - - beforeEach(() => { - window.mrTabs = {}; - store = createStore(); - store.dispatch('setNoteableData', noteableDataMock); - store.dispatch('setNotesData', notesDataMock); - - const localVue = createLocalVue(); - wrapper = shallowMount(noteableDiscussion, { - store, - propsData: { discussion: discussionMock }, - localVue, - sync: false, - }); - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('should render user avatar', () => { - expect(wrapper.find('.user-avatar-link').exists()).toBe(true); - }); - - it('should not render discussion header for non diff discussions', () => { - expect(wrapper.find('.discussion-header').exists()).toBe(false); - }); - - it('should render discussion header', done => { - const discussion = { ...discussionMock }; - discussion.diff_file = mockDiffFile; - discussion.diff_discussion = true; - - wrapper.setProps({ discussion }); - - wrapper.vm - .$nextTick() - .then(() => { - expect(wrapper.find('.discussion-header').exists()).toBe(true); - }) - .then(done) - .catch(done.fail); - }); - - describe('actions', () => { - it('should toggle reply form', done => { - const replyPlaceholder = wrapper.find(ReplyPlaceholder); - - wrapper.vm - .$nextTick() - .then(() => { - expect(wrapper.vm.isReplying).toEqual(false); - - replyPlaceholder.vm.$emit('onClick'); - }) - .then(() => wrapper.vm.$nextTick()) - .then(() => { - expect(wrapper.vm.isReplying).toEqual(true); - - const noteForm = wrapper.find(NoteForm); - - expect(noteForm.exists()).toBe(true); - - const noteFormProps = noteForm.props(); - - expect(noteFormProps.discussion).toBe(discussionMock); - expect(noteFormProps.isEditing).toBe(false); - expect(noteFormProps.line).toBe(null); - expect(noteFormProps.saveButtonTitle).toBe('Comment'); - expect(noteFormProps.autosaveKey).toBe(`Note/Issue/${discussionMock.id}/Reply`); - }) - .then(done) - .catch(done.fail); - }); - - it('does not render jump to discussion button', () => { - expect( - wrapper.find('*[data-original-title="Jump to next unresolved discussion"]').exists(), - ).toBe(false); - }); - }); - - describe('methods', () => { - describe('jumpToNextDiscussion', () => { - it('expands next unresolved discussion', done => { - const discussion2 = getJSONFixture(discussionWithTwoUnresolvedNotes)[0]; - discussion2.resolved = false; - discussion2.active = true; - discussion2.id = 'next'; // prepare this for being identified as next one (to be jumped to) - store.dispatch('setInitialNotes', [discussionMock, discussion2]); - window.mrTabs.currentAction = 'show'; - - wrapper.vm - .$nextTick() - .then(() => { - spyOn(wrapper.vm, 'expandDiscussion').and.stub(); - - const nextDiscussionId = discussion2.id; - - setFixtures(` - <div class="discussion" data-discussion-id="${nextDiscussionId}"></div> - `); - - wrapper.vm.jumpToNextDiscussion(); - - expect(wrapper.vm.expandDiscussion).toHaveBeenCalledWith({ - discussionId: nextDiscussionId, - }); - }) - .then(done) - .catch(done.fail); - }); - }); - }); - - describe('action text', () => { - const commitId = 'razupaltuff'; - const truncatedCommitId = commitId.substr(0, 8); - let commitElement; - - beforeEach(done => { - store.state.diffs = { - projectPath: 'something', - }; - - wrapper.setProps({ - discussion: { - ...discussionMock, - for_commit: true, - commit_id: commitId, - diff_discussion: true, - diff_file: { - ...mockDiffFile, - }, - }, - renderDiffFile: true, - }); - - wrapper.vm - .$nextTick() - .then(() => { - commitElement = wrapper.find('.commit-sha'); - }) - .then(done) - .catch(done.fail); - }); - - describe('for commit discussions', () => { - it('should display a monospace started a discussion on commit', () => { - expect(wrapper.text()).toContain(`started a discussion on commit ${truncatedCommitId}`); - expect(commitElement.exists()).toBe(true); - expect(commitElement.text()).toContain(truncatedCommitId); - }); - }); - - describe('for diff discussion with a commit id', () => { - it('should display started discussion on commit header', done => { - wrapper.vm.discussion.for_commit = false; - - wrapper.vm.$nextTick(() => { - expect(wrapper.text()).toContain(`started a discussion on commit ${truncatedCommitId}`); - - expect(commitElement).not.toBe(null); - - done(); - }); - }); - - it('should display outdated change on commit header', done => { - wrapper.vm.discussion.for_commit = false; - wrapper.vm.discussion.active = false; - - wrapper.vm.$nextTick(() => { - expect(wrapper.text()).toContain( - `started a discussion on an outdated change in commit ${truncatedCommitId}`, - ); - - expect(commitElement).not.toBe(null); - - done(); - }); - }); - }); - - describe('for diff discussions without a commit id', () => { - it('should show started a discussion on the diff text', done => { - Object.assign(wrapper.vm.discussion, { - for_commit: false, - commit_id: null, - }); - - wrapper.vm.$nextTick(() => { - expect(wrapper.text()).toContain('started a discussion on the diff'); - - done(); - }); - }); - - it('should show discussion on older version text', done => { - Object.assign(wrapper.vm.discussion, { - for_commit: false, - commit_id: null, - active: false, - }); - - wrapper.vm.$nextTick(() => { - expect(wrapper.text()).toContain('started a discussion on an old version of the diff'); - - done(); - }); - }); - }); - }); - - describe('for resolved discussion', () => { - beforeEach(() => { - const discussion = getJSONFixture(discussionWithTwoUnresolvedNotes)[0]; - wrapper.setProps({ discussion }); - }); - - it('does not display a button to resolve with issue', () => { - const button = wrapper.find(ResolveWithIssueButton); - - expect(button.exists()).toBe(false); - }); - }); - - describe('for unresolved discussion', () => { - beforeEach(done => { - const discussion = { - ...getJSONFixture(discussionWithTwoUnresolvedNotes)[0], - expanded: true, - }; - discussion.notes = discussion.notes.map(note => ({ - ...note, - resolved: false, - })); - - wrapper.setProps({ discussion }); - wrapper.vm - .$nextTick() - .then(done) - .catch(done.fail); - }); - - it('displays a button to resolve with issue', () => { - const button = wrapper.find(ResolveWithIssueButton); - - expect(button.exists()).toBe(true); - }); - }); -}); diff --git a/spec/javascripts/pipelines/pipeline_triggerer_spec.js b/spec/javascripts/pipelines/pipeline_triggerer_spec.js deleted file mode 100644 index 8cf290f2663..00000000000 --- a/spec/javascripts/pipelines/pipeline_triggerer_spec.js +++ /dev/null @@ -1,54 +0,0 @@ -import { mount } from '@vue/test-utils'; -import pipelineTriggerer from '~/pipelines/components/pipeline_triggerer.vue'; - -describe('Pipelines Triggerer', () => { - let wrapper; - - const mockData = { - pipeline: { - user: { - name: 'foo', - avatar_url: '/avatar', - path: '/path', - }, - }, - }; - - const createComponent = () => { - wrapper = mount(pipelineTriggerer, { - propsData: mockData, - }); - }; - - beforeEach(() => { - createComponent(); - }); - - afterEach(() => { - wrapper.destroy(); - }); - - it('should render a table cell', () => { - expect(wrapper.contains('.table-section')).toBe(true); - }); - - it('should render triggerer information when triggerer is provided', () => { - const link = wrapper.find('.js-pipeline-url-user'); - - expect(link.attributes('href')).toEqual(mockData.pipeline.user.path); - expect(link.find('.js-user-avatar-image-toolip').text()).toEqual(mockData.pipeline.user.name); - expect(link.find('img.avatar').attributes('src')).toEqual( - `${mockData.pipeline.user.avatar_url}?width=26`, - ); - }); - - it('should render "API" when no triggerer is provided', () => { - wrapper.setProps({ - pipeline: { - user: null, - }, - }); - - expect(wrapper.find('.js-pipeline-url-api').text()).toEqual('API'); - }); -}); diff --git a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_list_spec.js b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_list_spec.js deleted file mode 100644 index 96bc3b0cc17..00000000000 --- a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_list_spec.js +++ /dev/null @@ -1,156 +0,0 @@ -import { shallowMount, createLocalVue } from '@vue/test-utils'; -import { GlButton } from '@gitlab/ui'; -import { TEST_HOST } from 'spec/test_constants'; -import UserAvatarList from '~/vue_shared/components/user_avatar/user_avatar_list.vue'; -import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue'; - -const TEST_IMAGE_SIZE = 7; -const TEST_BREAKPOINT = 5; -const TEST_EMPTY_MESSAGE = 'Lorem ipsum empty'; -const DEFAULT_EMPTY_MESSAGE = 'None'; - -const createUser = id => ({ - id, - name: 'Lorem', - web_url: `${TEST_HOST}/${id}`, - avatar_url: `${TEST_HOST}/${id}/avatar`, -}); -const createList = n => - Array(n) - .fill(1) - .map((x, id) => createUser(id)); - -const localVue = createLocalVue(); - -describe('UserAvatarList', () => { - let props; - let wrapper; - - const factory = (options = {}) => { - const propsData = { - ...props, - ...options.propsData, - }; - - wrapper = shallowMount(localVue.extend(UserAvatarList), { - ...options, - localVue, - propsData, - }); - }; - - const clickButton = () => { - const button = wrapper.find(GlButton); - button.vm.$emit('click'); - }; - - beforeEach(() => { - props = { imgSize: TEST_IMAGE_SIZE }; - }); - - afterEach(() => { - wrapper.destroy(); - }); - - describe('empty text', () => { - it('shows when items are empty', () => { - factory({ propsData: { items: [] } }); - - expect(wrapper.text()).toContain(DEFAULT_EMPTY_MESSAGE); - }); - - it('does not show when items are not empty', () => { - factory({ propsData: { items: createList(1) } }); - - expect(wrapper.text()).not.toContain(DEFAULT_EMPTY_MESSAGE); - }); - - it('can be set in props', () => { - factory({ propsData: { items: [], emptyText: TEST_EMPTY_MESSAGE } }); - - expect(wrapper.text()).toContain(TEST_EMPTY_MESSAGE); - }); - }); - - describe('with no breakpoint', () => { - beforeEach(() => { - props.breakpoint = 0; - }); - - it('renders avatars', () => { - const items = createList(20); - factory({ propsData: { items } }); - - const links = wrapper.findAll(UserAvatarLink); - const linkProps = links.wrappers.map(x => x.props()); - - expect(linkProps).toEqual( - items.map(x => - jasmine.objectContaining({ - linkHref: x.web_url, - imgSrc: x.avatar_url, - imgAlt: x.name, - tooltipText: x.name, - imgSize: TEST_IMAGE_SIZE, - }), - ), - ); - }); - }); - - describe('with breakpoint and length equal to breakpoint', () => { - beforeEach(() => { - props.breakpoint = TEST_BREAKPOINT; - props.items = createList(TEST_BREAKPOINT); - }); - - it('renders all avatars if length is <= breakpoint', () => { - factory(); - - const links = wrapper.findAll(UserAvatarLink); - - expect(links.length).toEqual(props.items.length); - }); - - it('does not show button', () => { - factory(); - - expect(wrapper.find(GlButton).exists()).toBe(false); - }); - }); - - describe('with breakpoint and length greater than breakpoint', () => { - beforeEach(() => { - props.breakpoint = TEST_BREAKPOINT; - props.items = createList(TEST_BREAKPOINT + 1); - }); - - it('renders avatars up to breakpoint', () => { - factory(); - - const links = wrapper.findAll(UserAvatarLink); - - expect(links.length).toEqual(TEST_BREAKPOINT); - }); - - describe('with expand clicked', () => { - beforeEach(() => { - factory(); - clickButton(); - }); - - it('renders all avatars', () => { - const links = wrapper.findAll(UserAvatarLink); - - expect(links.length).toEqual(props.items.length); - }); - - it('with collapse clicked, it renders avatars up to breakpoint', () => { - clickButton(); - const links = wrapper.findAll(UserAvatarLink); - - expect(links.length).toEqual(TEST_BREAKPOINT); - }); - }); - }); -}); |