diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-20 18:07:53 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-20 18:07:53 +0000 |
commit | 682360490629376e2ec07d737c7d7dbfdaaeeab7 (patch) | |
tree | 7abe62a4d200738ac086ac0c0bd633ce0bc03f00 /spec | |
parent | 2f26f81ce3e3f97ddc5ce5e2e103925d7d0d170f (diff) | |
download | gitlab-ce-682360490629376e2ec07d737c7d7dbfdaaeeab7.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
32 files changed, 321 insertions, 181 deletions
diff --git a/spec/frontend/__mocks__/@gitlab/ui.js b/spec/frontend/__mocks__/@gitlab/ui.js new file mode 100644 index 00000000000..ef97cb11424 --- /dev/null +++ b/spec/frontend/__mocks__/@gitlab/ui.js @@ -0,0 +1,19 @@ +export * from '@gitlab/ui'; + +/** + * The @gitlab/ui tooltip directive requires awkward and distracting set up in tests + * for components that use it (e.g., `attachToDocument: true` and `sync: true` passed + * to the `mount` helper from `vue-test-utils`). + * + * This mock decouples those tests from the implementation, removing the need to set + * them up specially just for these tooltips. + */ +export const GlTooltipDirective = { + bind() {}, +}; + +export const GlTooltip = { + render(h) { + return h('div', this.$attrs, this.$slots.default); + }, +}; diff --git a/spec/frontend/boards/issue_card_spec.js b/spec/frontend/boards/issue_card_spec.js index c7ab477c0af..4a0a3497620 100644 --- a/spec/frontend/boards/issue_card_spec.js +++ b/spec/frontend/boards/issue_card_spec.js @@ -267,17 +267,13 @@ describe('Issue card component', () => { }); it('renders label', () => { - const nodes = wrapper - .findAll('.badge') - .wrappers.map(label => label.attributes('data-original-title')); + const nodes = wrapper.findAll('.badge').wrappers.map(label => label.attributes('title')); expect(nodes.includes(label1.description)).toBe(true); }); it('sets label description as title', () => { - expect(wrapper.find('.badge').attributes('data-original-title')).toContain( - label1.description, - ); + expect(wrapper.find('.badge').attributes('title')).toContain(label1.description); }); it('sets background color of button', () => { diff --git a/spec/frontend/diffs/components/compare_versions_spec.js b/spec/frontend/diffs/components/compare_versions_spec.js index 9900fcdb6e1..dcce6f1fa7a 100644 --- a/spec/frontend/diffs/components/compare_versions_spec.js +++ b/spec/frontend/diffs/components/compare_versions_spec.js @@ -49,7 +49,7 @@ describe('CompareVersions', () => { const treeListBtn = wrapper.find('.js-toggle-tree-list'); expect(treeListBtn.exists()).toBe(true); - expect(treeListBtn.attributes('data-original-title')).toBe('Hide file browser'); + expect(treeListBtn.attributes('title')).toBe('Hide file browser'); expect(treeListBtn.findAll(Icon).length).not.toBe(0); expect(treeListBtn.find(Icon).props('name')).toBe('collapse-left'); }); diff --git a/spec/frontend/diffs/components/diff_file_header_spec.js b/spec/frontend/diffs/components/diff_file_header_spec.js index 48fd6dd6f58..f2d07d3d4b2 100644 --- a/spec/frontend/diffs/components/diff_file_header_spec.js +++ b/spec/frontend/diffs/components/diff_file_header_spec.js @@ -329,7 +329,7 @@ describe('DiffFileHeader component', () => { addMergeRequestButtons: true, }); expect(findViewFileButton().attributes('href')).toBe(viewPath); - expect(findViewFileButton().attributes('data-original-title')).toEqual( + expect(findViewFileButton().attributes('title')).toEqual( `View file @ ${diffFile.content_sha.substr(0, 8)}`, ); }); diff --git a/spec/frontend/environments/environment_monitoring_spec.js b/spec/frontend/environments/environment_monitoring_spec.js index 8e67f799dc0..22241d5120b 100644 --- a/spec/frontend/environments/environment_monitoring_spec.js +++ b/spec/frontend/environments/environment_monitoring_spec.js @@ -33,7 +33,7 @@ describe('Monitoring Component', () => { it('should render a link to environment monitoring page', () => { expect(wrapper.attributes('href')).toEqual(monitoringUrl); expect(findIconsByName('chart').length).toBe(1); - expect(wrapper.attributes('data-original-title')).toBe('Monitoring'); + expect(wrapper.attributes('title')).toBe('Monitoring'); expect(wrapper.attributes('aria-label')).toBe('Monitoring'); }); }); diff --git a/spec/frontend/environments/environment_stop_spec.js b/spec/frontend/environments/environment_stop_spec.js index ab714728311..be029d48a56 100644 --- a/spec/frontend/environments/environment_stop_spec.js +++ b/spec/frontend/environments/environment_stop_spec.js @@ -29,7 +29,7 @@ describe('Stop Component', () => { it('should render a button to stop the environment', () => { expect(findButton().exists()).toBe(true); - expect(wrapper.attributes('data-original-title')).toEqual('Stop environment'); + expect(wrapper.attributes('title')).toEqual('Stop environment'); }); it('emits requestStopEnvironment in the event hub when button is clicked', () => { diff --git a/spec/frontend/environments/environment_terminal_button_spec.js b/spec/frontend/environments/environment_terminal_button_spec.js index 9aa2b82736c..058940c0e98 100644 --- a/spec/frontend/environments/environment_terminal_button_spec.js +++ b/spec/frontend/environments/environment_terminal_button_spec.js @@ -25,7 +25,7 @@ describe('Stop Component', () => { it('should render a link to open a web terminal with the provided path', () => { expect(wrapper.is('a')).toBe(true); - expect(wrapper.attributes('data-original-title')).toBe('Terminal'); + expect(wrapper.attributes('title')).toBe('Terminal'); expect(wrapper.attributes('aria-label')).toBe('Terminal'); expect(wrapper.attributes('href')).toBe(terminalPath); }); diff --git a/spec/frontend/ide/stores/actions/file_spec.js b/spec/frontend/ide/stores/actions/file_spec.js index 283ea266821..e9a657ffbfc 100644 --- a/spec/frontend/ide/stores/actions/file_spec.js +++ b/spec/frontend/ide/stores/actions/file_spec.js @@ -1,20 +1,20 @@ import Vue from 'vue'; import MockAdapter from 'axios-mock-adapter'; import axios from '~/lib/utils/axios_utils'; -import store from '~/ide/stores'; +import { createStore } from '~/ide/stores'; import * as actions from '~/ide/stores/actions/file'; import * as types from '~/ide/stores/mutation_types'; import service from '~/ide/services'; import router from '~/ide/ide_router'; import eventHub from '~/ide/eventhub'; -import { file, resetStore } from '../../helpers'; -import testAction from '../../../helpers/vuex_action_helper'; +import { file } from '../../helpers'; const RELATIVE_URL_ROOT = '/gitlab'; describe('IDE store file actions', () => { let mock; let originalGon; + let store; beforeEach(() => { mock = new MockAdapter(axios); @@ -24,12 +24,15 @@ describe('IDE store file actions', () => { relative_url_root: RELATIVE_URL_ROOT, }; + store = createStore(); + + jest.spyOn(store, 'commit'); + jest.spyOn(store, 'dispatch'); jest.spyOn(router, 'push').mockImplementation(() => {}); }); afterEach(() => { mock.restore(); - resetStore(store); window.gon = originalGon; }); @@ -663,30 +666,33 @@ describe('IDE store file actions', () => { }); describe('stageChange', () => { - it('calls STAGE_CHANGE with file path', done => { - testAction( - actions.stageChange, - 'path', - store.state, - [ - { type: types.STAGE_CHANGE, payload: 'path' }, - { type: types.SET_LAST_COMMIT_MSG, payload: '' }, - ], - [], - done, + it('calls STAGE_CHANGE with file path', () => { + const f = { ...file('path'), content: 'old' }; + + store.state.entries[f.path] = f; + + actions.stageChange(store, 'path'); + + expect(store.commit).toHaveBeenCalledWith( + types.STAGE_CHANGE, + expect.objectContaining({ path: 'path' }), ); + expect(store.commit).toHaveBeenCalledWith(types.SET_LAST_COMMIT_MSG, ''); }); }); describe('unstageChange', () => { - it('calls UNSTAGE_CHANGE with file path', done => { - testAction( - actions.unstageChange, - 'path', - store.state, - [{ type: types.UNSTAGE_CHANGE, payload: 'path' }], - [], - done, + it('calls UNSTAGE_CHANGE with file path', () => { + const f = { ...file('path'), content: 'old' }; + + store.state.entries[f.path] = f; + store.state.stagedFiles.push({ f, content: 'new' }); + + actions.unstageChange(store, 'path'); + + expect(store.commit).toHaveBeenCalledWith( + types.UNSTAGE_CHANGE, + expect.objectContaining({ path: 'path' }), ); }); }); diff --git a/spec/frontend/ide/stores/mutations/file_spec.js b/spec/frontend/ide/stores/mutations/file_spec.js index 91506c1b46c..8cb386d27e5 100644 --- a/spec/frontend/ide/stores/mutations/file_spec.js +++ b/spec/frontend/ide/stores/mutations/file_spec.js @@ -1,14 +1,16 @@ import mutations from '~/ide/stores/mutations/file'; -import state from '~/ide/stores/state'; +import { createStore } from '~/ide/stores'; import { FILE_VIEW_MODE_PREVIEW } from '~/ide/constants'; import { file } from '../../helpers'; describe('IDE store file mutations', () => { let localState; + let localStore; let localFile; beforeEach(() => { - localState = state(); + localStore = createStore(); + localState = localStore.state; localFile = { ...file(), type: 'blob' }; localState.entries[localFile.path] = localFile; @@ -333,44 +335,154 @@ describe('IDE store file mutations', () => { }); }); - describe('STAGE_CHANGE', () => { - beforeEach(() => { - mutations.STAGE_CHANGE(localState, localFile.path); - }); + describe.each` + mutationName | mutation | addedTo | removedFrom | staged | changedFilesCount | stagedFilesCount + ${'STAGE_CHANGE'} | ${mutations.STAGE_CHANGE} | ${'stagedFiles'} | ${'changedFiles'} | ${true} | ${0} | ${1} + ${'UNSTAGE_CHANGE'} | ${mutations.UNSTAGE_CHANGE} | ${'changedFiles'} | ${'stagedFiles'} | ${false} | ${1} | ${0} + `( + '$mutationName', + ({ mutation, changedFilesCount, removedFrom, addedTo, staged, stagedFilesCount }) => { + let unstagedFile; + let stagedFile; + + beforeEach(() => { + unstagedFile = { + ...file('file'), + type: 'blob', + raw: 'original content', + content: 'changed content', + }; + + stagedFile = { + ...unstagedFile, + content: 'staged content', + staged: true, + }; + + localState.changedFiles.push(unstagedFile); + localState.stagedFiles.push(stagedFile); + localState.entries[unstagedFile.path] = unstagedFile; + }); - it('adds file into stagedFiles array', () => { - expect(localState.stagedFiles.length).toBe(1); - expect(localState.stagedFiles[0]).toEqual(localFile); - }); + it('removes all changes of a file if staged and unstaged change contents are equal', () => { + unstagedFile.content = 'original content'; - it('updates stagedFile if it is already staged', () => { - localFile.raw = 'testing 123'; + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); - mutations.STAGE_CHANGE(localState, localFile.path); + expect(localState.entries.file).toEqual( + expect.objectContaining({ + content: 'original content', + staged: false, + changed: false, + }), + ); - expect(localState.stagedFiles.length).toBe(1); - expect(localState.stagedFiles[0].raw).toEqual('testing 123'); - }); - }); + expect(localState.stagedFiles.length).toBe(0); + expect(localState.changedFiles.length).toBe(0); + }); - describe('UNSTAGE_CHANGE', () => { - let f; + it('removes all changes of a file if a file is deleted and a new file with same content is added', () => { + stagedFile.deleted = true; + unstagedFile.tempFile = true; + unstagedFile.content = 'original content'; - beforeEach(() => { - f = { ...file(), type: 'blob', staged: true }; + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); - localState.stagedFiles.push(f); - localState.changedFiles.push(f); - localState.entries[f.path] = f; - }); + expect(localState.stagedFiles.length).toBe(0); + expect(localState.changedFiles.length).toBe(0); - it('removes from stagedFiles array', () => { - mutations.UNSTAGE_CHANGE(localState, f.path); + expect(localState.entries.file).toEqual( + expect.objectContaining({ + content: 'original content', + deleted: false, + tempFile: false, + }), + ); + }); - expect(localState.stagedFiles.length).toBe(0); - expect(localState.changedFiles.length).toBe(1); - }); - }); + it('merges deleted and added file into a changed file if the contents differ', () => { + stagedFile.deleted = true; + unstagedFile.tempFile = true; + unstagedFile.content = 'hello'; + + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); + + expect(localState.stagedFiles.length).toBe(stagedFilesCount); + expect(localState.changedFiles.length).toBe(changedFilesCount); + + expect(unstagedFile).toEqual( + expect.objectContaining({ + content: 'hello', + staged, + deleted: false, + tempFile: false, + changed: true, + }), + ); + }); + + it('does not remove file from stagedFiles and changedFiles if the file was renamed, even if the contents are equal', () => { + unstagedFile.content = 'original content'; + unstagedFile.prevPath = 'old_file'; + + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); + + expect(localState.entries.file).toEqual( + expect.objectContaining({ + content: 'original content', + staged, + changed: false, + prevPath: 'old_file', + }), + ); + + expect(localState.stagedFiles.length).toBe(stagedFilesCount); + expect(localState.changedFiles.length).toBe(changedFilesCount); + }); + + it(`removes file from ${removedFrom} array and adds it into ${addedTo} array`, () => { + localState.stagedFiles.length = 0; + + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); + + expect(localState.stagedFiles.length).toBe(stagedFilesCount); + expect(localState.changedFiles.length).toBe(changedFilesCount); + + const f = localState.stagedFiles[0] || localState.changedFiles[0]; + expect(f).toEqual(unstagedFile); + }); + + it(`updates file in ${addedTo} array if it is was already present in it`, () => { + unstagedFile.raw = 'testing 123'; + + mutation(localState, { + path: unstagedFile.path, + diffInfo: localStore.getters.getDiffInfo(unstagedFile.path), + }); + + expect(localState.stagedFiles.length).toBe(stagedFilesCount); + expect(localState.changedFiles.length).toBe(changedFilesCount); + + const f = localState.stagedFiles[0] || localState.changedFiles[0]; + expect(f.raw).toEqual('testing 123'); + }); + }, + ); describe('TOGGLE_FILE_CHANGED', () => { it('updates file changed status', () => { diff --git a/spec/frontend/issuable_suggestions/components/item_spec.js b/spec/frontend/issuable_suggestions/components/item_spec.js index 10fba238506..eeea8960658 100644 --- a/spec/frontend/issuable_suggestions/components/item_spec.js +++ b/spec/frontend/issuable_suggestions/components/item_spec.js @@ -135,7 +135,7 @@ describe('Issuable suggestions suggestion component', () => { const icon = vm.find(Icon); expect(icon.props('name')).toBe('eye-slash'); - expect(icon.attributes('data-original-title')).toBe('Confidential'); + expect(icon.attributes('title')).toBe('Confidential'); }); }); }); diff --git a/spec/frontend/issuables_list/components/issuable_spec.js b/spec/frontend/issuables_list/components/issuable_spec.js index b6851a0e24c..b4d0bd47d65 100644 --- a/spec/frontend/issuables_list/components/issuable_spec.js +++ b/spec/frontend/issuables_list/components/issuable_spec.js @@ -70,7 +70,7 @@ describe('Issuable component', () => { const findTaskStatus = () => wrapper.find('.task-status'); const findOpenedAgoContainer = () => wrapper.find({ ref: 'openedAgoByContainer' }); const findMilestone = () => wrapper.find('.js-milestone'); - const findMilestoneTooltip = () => findMilestone().attributes('data-original-title'); + const findMilestoneTooltip = () => findMilestone().attributes('title'); const findDueDate = () => wrapper.find('.js-due-date'); const findLabelContainer = () => wrapper.find('.js-labels'); const findLabelLinks = () => findLabelContainer().findAll(GlLink); @@ -240,7 +240,7 @@ describe('Issuable component', () => { const labels = findLabelLinks().wrappers.map(label => ({ href: label.attributes('href'), text: label.text(), - tooltip: label.find('span').attributes('data-original-title'), + tooltip: label.find('span').attributes('title'), })); const expected = testLabels.map(label => ({ diff --git a/spec/frontend/notes/components/__snapshots__/discussion_jump_to_next_button_spec.js.snap b/spec/frontend/notes/components/__snapshots__/discussion_jump_to_next_button_spec.js.snap index b29d093130a..1e466f266ed 100644 --- a/spec/frontend/notes/components/__snapshots__/discussion_jump_to_next_button_spec.js.snap +++ b/spec/frontend/notes/components/__snapshots__/discussion_jump_to_next_button_spec.js.snap @@ -7,8 +7,7 @@ exports[`JumpToNextDiscussionButton matches the snapshot 1`] = ` > <button class="btn btn-default discussion-next-btn" - data-original-title="Jump to next unresolved discussion" - title="" + title="Jump to next unresolved discussion" > <icon-stub name="comment-next" diff --git a/spec/frontend/pipelines/graph/action_component_spec.js b/spec/frontend/pipelines/graph/action_component_spec.js index a8fddd5fff2..a7e504af231 100644 --- a/spec/frontend/pipelines/graph/action_component_spec.js +++ b/spec/frontend/pipelines/graph/action_component_spec.js @@ -30,7 +30,7 @@ describe('pipeline graph action component', () => { }); it('should render the provided title as a bootstrap tooltip', () => { - expect(wrapper.attributes('data-original-title')).toBe('bar'); + expect(wrapper.attributes('title')).toBe('bar'); }); it('should update bootstrap tooltip when title changes', done => { @@ -39,7 +39,7 @@ describe('pipeline graph action component', () => { wrapper.vm .$nextTick() .then(() => { - expect(wrapper.attributes('data-original-title')).toBe('changed'); + expect(wrapper.attributes('title')).toBe('changed'); }) .then(done) .catch(done.fail); diff --git a/spec/frontend/pipelines/graph/job_item_spec.js b/spec/frontend/pipelines/graph/job_item_spec.js index c79af95b3f3..22e1881ead4 100644 --- a/spec/frontend/pipelines/graph/job_item_spec.js +++ b/spec/frontend/pipelines/graph/job_item_spec.js @@ -43,9 +43,7 @@ describe('pipeline graph job item', () => { expect(link.attributes('href')).toBe(mockJob.status.details_path); - expect(link.attributes('data-original-title')).toEqual( - `${mockJob.name} - ${mockJob.status.label}`, - ); + expect(link.attributes('title')).toEqual(`${mockJob.name} - ${mockJob.status.label}`); expect(wrapper.find('.js-status-icon-success')).toBeDefined(); @@ -110,9 +108,7 @@ describe('pipeline graph job item', () => { }, }); - expect(wrapper.find('.js-job-component-tooltip').attributes('data-original-title')).toBe( - 'test', - ); + expect(wrapper.find('.js-job-component-tooltip').attributes('title')).toBe('test'); }); it('should not render status label when it is provided', () => { @@ -128,7 +124,7 @@ describe('pipeline graph job item', () => { }, }); - expect(wrapper.find('.js-job-component-tooltip').attributes('data-original-title')).toEqual( + expect(wrapper.find('.js-job-component-tooltip').attributes('title')).toEqual( 'test - success', ); }); @@ -140,7 +136,7 @@ describe('pipeline graph job item', () => { job: delayedJobFixture, }); - expect(wrapper.find('.js-pipeline-graph-job-link').attributes('data-original-title')).toEqual( + expect(wrapper.find('.js-pipeline-graph-job-link').attributes('title')).toEqual( `delayed job - delayed manual action (${wrapper.vm.remainingTime})`, ); }); diff --git a/spec/frontend/pipelines/graph/linked_pipeline_spec.js b/spec/frontend/pipelines/graph/linked_pipeline_spec.js index c355d653203..b5fb1a94ebd 100644 --- a/spec/frontend/pipelines/graph/linked_pipeline_spec.js +++ b/spec/frontend/pipelines/graph/linked_pipeline_spec.js @@ -65,7 +65,7 @@ describe('Linked pipeline', () => { it('should render the tooltip text as the title attribute', () => { const tooltipRef = wrapper.find('.js-linked-pipeline-content'); - const titleAttr = tooltipRef.attributes('data-original-title'); + const titleAttr = tooltipRef.attributes('title'); expect(titleAttr).toContain(mockPipeline.project.name); expect(titleAttr).toContain(mockPipeline.details.status.label); diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js index 3c0c35e1f0f..0bb5ff159c5 100644 --- a/spec/frontend/pipelines/pipeline_url_spec.js +++ b/spec/frontend/pipelines/pipeline_url_spec.js @@ -105,8 +105,6 @@ describe('Pipeline Url Component', () => { }); expect(wrapper.find('.js-pipeline-url-failure').text()).toContain('error'); - expect(wrapper.find('.js-pipeline-url-failure').attributes('data-original-title')).toContain( - 'some reason', - ); + expect(wrapper.find('.js-pipeline-url-failure').attributes('title')).toContain('some reason'); }); }); diff --git a/spec/frontend/registry/list/components/__snapshots__/project_empty_state_spec.js.snap b/spec/frontend/registry/list/components/__snapshots__/project_empty_state_spec.js.snap index 3084462f5ae..d11a9bdeb51 100644 --- a/spec/frontend/registry/list/components/__snapshots__/project_empty_state_spec.js.snap +++ b/spec/frontend/registry/list/components/__snapshots__/project_empty_state_spec.js.snap @@ -86,8 +86,7 @@ exports[`Registry Project Empty state to match the default snapshot 1`] = ` <button class="btn input-group-text btn-secondary btn-default" data-clipboard-text="docker login host" - data-original-title="Copy login command" - title="" + title="Copy login command" type="button" > <svg @@ -125,8 +124,7 @@ exports[`Registry Project Empty state to match the default snapshot 1`] = ` <button class="btn input-group-text btn-secondary btn-default" data-clipboard-text="docker build -t url ." - data-original-title="Copy build command" - title="" + title="Copy build command" type="button" > <svg @@ -156,8 +154,7 @@ exports[`Registry Project Empty state to match the default snapshot 1`] = ` <button class="btn input-group-text btn-secondary btn-default" data-clipboard-text="docker push url" - data-original-title="Copy push command" - title="" + title="Copy push command" type="button" > <svg diff --git a/spec/frontend/releases/list/components/evidence_block_spec.js b/spec/frontend/releases/list/components/evidence_block_spec.js index e8a3eace216..959711983b8 100644 --- a/spec/frontend/releases/list/components/evidence_block_spec.js +++ b/spec/frontend/releases/list/components/evidence_block_spec.js @@ -39,7 +39,7 @@ describe('Evidence Block', () => { }); it('renders the correct hover text for the download', () => { - expect(wrapper.find(GlLink).attributes('data-original-title')).toBe('Download evidence JSON'); + expect(wrapper.find(GlLink).attributes('title')).toBe('Download evidence JSON'); }); it('renders the correct file link for download', () => { @@ -63,9 +63,7 @@ describe('Evidence Block', () => { }); it('renders the correct hover text', () => { - expect(wrapper.find(ClipboardButton).attributes('data-original-title')).toBe( - 'Copy commit SHA', - ); + expect(wrapper.find(ClipboardButton).attributes('title')).toBe('Copy commit SHA'); }); it('copies the sha', () => { diff --git a/spec/frontend/releases/list/components/release_block_milestone_info_spec.js b/spec/frontend/releases/list/components/release_block_milestone_info_spec.js index 7179ab3d3cc..a52bd8a34b2 100644 --- a/spec/frontend/releases/list/components/release_block_milestone_info_spec.js +++ b/spec/frontend/releases/list/components/release_block_milestone_info_spec.js @@ -61,7 +61,7 @@ describe('Release block milestone info', () => { expect(milestoneLink.text()).toBe(m.title); expect(milestoneLink.attributes('href')).toBe(m.web_url); - expect(milestoneLink.attributes('data-original-title')).toBe(m.description); + expect(milestoneLink.attributes('title')).toBe(m.description); }); }); diff --git a/spec/frontend/releases/list/components/release_block_spec.js b/spec/frontend/releases/list/components/release_block_spec.js index 38c5e4fc0a2..89691a83414 100644 --- a/spec/frontend/releases/list/components/release_block_spec.js +++ b/spec/frontend/releases/list/components/release_block_spec.js @@ -271,7 +271,7 @@ describe('Release block', () => { expect(milestoneLink.attributes('href')).toBe(milestone.web_url); - expect(milestoneLink.attributes('data-original-title')).toBe(milestone.description); + expect(milestoneLink.attributes('title')).toBe(milestone.description); }); }); diff --git a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap index 706c26403c0..60215b70d36 100644 --- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap +++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap @@ -67,9 +67,8 @@ exports[`Repository last commit component renders commit widget 1`] = ` > <gllink-stub class="js-commit-pipeline" - data-original-title="Commit: failed" href="https://test.com/pipeline" - title="" + title="Commit: failed" > <ciicon-stub aria-label="Commit: failed" @@ -174,9 +173,8 @@ exports[`Repository last commit component renders the signature HTML as returned > <gllink-stub class="js-commit-pipeline" - data-original-title="Commit: failed" href="https://test.com/pipeline" - title="" + title="Commit: failed" > <ciicon-stub aria-label="Commit: failed" diff --git a/spec/frontend/sidebar/assignees_spec.js b/spec/frontend/sidebar/assignees_spec.js index 14b6da10991..4cc91c7ca6e 100644 --- a/spec/frontend/sidebar/assignees_spec.js +++ b/spec/frontend/sidebar/assignees_spec.js @@ -178,7 +178,7 @@ describe('Assignee component', () => { const userItems = wrapper.findAll('.user-list .user-item a'); expect(userItems.length).toBe(3); - expect(userItems.at(0).attributes('data-original-title')).toBe(users[2].name); + expect(userItems.at(0).attributes('title')).toBe(users[2].name); }); it('passes the sorted assignees to the collapsed-assignee-list', () => { diff --git a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js index 9b2e2e38366..5f2b00eaa23 100644 --- a/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js +++ b/spec/frontend/sidebar/components/assignees/assignee_avatar_link_spec.js @@ -33,7 +33,7 @@ describe('AssigneeAvatarLink component', () => { wrapper.destroy(); }); - const findTooltipText = () => wrapper.attributes('data-original-title'); + const findTooltipText = () => wrapper.attributes('title'); it('has the root url present in the assigneeUrl method', () => { createComponent(); diff --git a/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js b/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js index 6aa7b166804..4479b180b65 100644 --- a/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js +++ b/spec/frontend/sidebar/components/assignees/collapsed_assignee_list_spec.js @@ -25,7 +25,7 @@ describe('CollapsedAssigneeList component', () => { const findNoUsersIcon = () => wrapper.find('i[aria-label=None]'); const findAvatarCounter = () => wrapper.find('.avatar-counter'); const findAssignees = () => wrapper.findAll(CollapsedAssignee); - const getTooltipTitle = () => wrapper.attributes('data-original-title'); + const getTooltipTitle = () => wrapper.attributes('title'); afterEach(() => { wrapper.destroy(); diff --git a/spec/frontend/vue_shared/components/changed_file_icon_spec.js b/spec/frontend/vue_shared/components/changed_file_icon_spec.js index 2fabbe3d0f6..381d5dd289f 100644 --- a/spec/frontend/vue_shared/components/changed_file_icon_spec.js +++ b/spec/frontend/vue_shared/components/changed_file_icon_spec.js @@ -30,7 +30,7 @@ describe('Changed file icon', () => { const findIcon = () => wrapper.find(Icon); const findIconName = () => findIcon().props('name'); const findIconClasses = () => findIcon().classes(); - const findTooltipText = () => wrapper.attributes('data-original-title'); + const findTooltipText = () => wrapper.attributes('title'); it('with isCentered true, adds center class', () => { factory({ @@ -89,7 +89,7 @@ describe('Changed file icon', () => { }); it('does not have tooltip text', () => { - expect(findTooltipText()).toBe(''); + expect(findTooltipText()).toBeFalsy(); }); }); diff --git a/spec/frontend/vue_shared/components/clipboard_button_spec.js b/spec/frontend/vue_shared/components/clipboard_button_spec.js index 4fb6924daba..df66b90c26e 100644 --- a/spec/frontend/vue_shared/components/clipboard_button_spec.js +++ b/spec/frontend/vue_shared/components/clipboard_button_spec.js @@ -35,7 +35,7 @@ describe('clipboard button', () => { }); it('should have a tooltip with default values', () => { - expect(wrapper.attributes('data-original-title')).toBe('Copy this value'); + expect(wrapper.attributes('title')).toBe('Copy this value'); }); it('should render provided classname', () => { diff --git a/spec/frontend/vue_shared/components/commit_spec.js b/spec/frontend/vue_shared/components/commit_spec.js index 67262eec0a5..34f3a54fce2 100644 --- a/spec/frontend/vue_shared/components/commit_spec.js +++ b/spec/frontend/vue_shared/components/commit_spec.js @@ -160,7 +160,7 @@ describe('Commit component', () => { expect(refEl.attributes('href')).toBe(props.commitRef.ref_url); - expect(refEl.attributes('data-original-title')).toBe(props.commitRef.name); + expect(refEl.attributes('title')).toBe(props.commitRef.name); expect(wrapper.find('icon-stub[name="branch"]').exists()).toBe(true); }); @@ -193,7 +193,7 @@ describe('Commit component', () => { expect(refEl.attributes('href')).toBe(props.mergeRequestRef.path); - expect(refEl.attributes('data-original-title')).toBe(props.mergeRequestRef.title); + expect(refEl.attributes('title')).toBe(props.mergeRequestRef.title); expect(wrapper.find('icon-stub[name="git-merge"]').exists()).toBe(true); }); diff --git a/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js b/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js index dcae2f12833..5271227d3cd 100644 --- a/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js +++ b/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js @@ -66,7 +66,7 @@ describe('IssueAssigneesComponent', () => { expect(findOverflowCounter().exists()).toBe(true); expect(findOverflowCounter().text()).toEqual(expectedHidden.toString()); - expect(findOverflowCounter().attributes('data-original-title')).toEqual( + expect(findOverflowCounter().attributes('title')).toEqual( `${hiddenCount} more assignees`, ); }); diff --git a/spec/frontend/vue_shared/components/time_ago_tooltip_spec.js b/spec/frontend/vue_shared/components/time_ago_tooltip_spec.js index f1f231c1a29..ebba0cc4ad4 100644 --- a/spec/frontend/vue_shared/components/time_ago_tooltip_spec.js +++ b/spec/frontend/vue_shared/components/time_ago_tooltip_spec.js @@ -25,7 +25,7 @@ describe('Time ago with tooltip component', () => { }); const timeago = getTimeago(); - expect(vm.attributes('data-original-title')).toEqual(formatDate(timestamp)); + expect(vm.attributes('title')).toEqual(formatDate(timestamp)); expect(vm.text()).toEqual(timeago.format(timestamp)); }); diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_spec.js index e76b2ca2d65..03bb88d1486 100644 --- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_spec.js +++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_image_spec.js @@ -100,7 +100,7 @@ describe('User Avatar Image Component', () => { it('does not render tooltip data attributes for on avatar image', () => { const avatarImg = wrapper.find('img'); - expect(avatarImg.attributes('data-original-title')).toBeFalsy(); + expect(avatarImg.attributes('title')).toBeFalsy(); expect(avatarImg.attributes('data-placement')).not.toBeDefined(); expect(avatarImg.attributes('data-container')).not.toBeDefined(); }); diff --git a/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js b/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js index 7f5df02d51d..16993cc21c9 100644 --- a/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js +++ b/spec/frontend/vue_shared/components/user_avatar/user_avatar_link_spec.js @@ -99,9 +99,9 @@ describe('User Avatar Link Component', () => { }); it('should render text tooltip for <span>', () => { - expect( - wrapper.find('.js-user-avatar-link-username').attributes('data-original-title'), - ).toEqual(defaultProps.tooltipText); + expect(wrapper.find('.js-user-avatar-link-username').attributes('title')).toEqual( + defaultProps.tooltipText, + ); }); it('should render text tooltip placement for <span>', () => { diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js index cb03204d337..a9fc3bf65a6 100644 --- a/spec/javascripts/ide/stores/actions_spec.js +++ b/spec/javascripts/ide/stores/actions_spec.js @@ -18,19 +18,19 @@ import axios from '~/lib/utils/axios_utils'; import { createStore } from '~/ide/stores'; import * as types from '~/ide/stores/mutation_types'; import router from '~/ide/ide_router'; -import { resetStore, file } from '../helpers'; +import { file } from '../helpers'; import testAction from '../../helpers/vuex_action_helper'; import eventHub from '~/ide/eventhub'; -const store = createStore(); - describe('Multi-file store actions', () => { + let store; + beforeEach(() => { - spyOn(router, 'push'); - }); + store = createStore(); - afterEach(() => { - resetStore(store); + spyOn(store, 'commit').and.callThrough(); + spyOn(store, 'dispatch').and.callThrough(); + spyOn(router, 'push'); }); describe('redirectToUrl', () => { @@ -390,58 +390,82 @@ describe('Multi-file store actions', () => { }); }); - describe('stageAllChanges', () => { - it('adds all files from changedFiles to stagedFiles', done => { - const openFile = { ...file(), path: 'test' }; + describe('stage/unstageAllChanges', () => { + let file1; + let file2; - store.state.openFiles.push(openFile); - store.state.stagedFiles.push(openFile); - store.state.changedFiles.push(openFile, file('new')); + beforeEach(() => { + file1 = { ...file('test'), content: 'changed test', raw: 'test' }; + file2 = { ...file('test2'), content: 'changed test2', raw: 'test2' }; - testAction( - stageAllChanges, - null, - store.state, - [ - { type: types.SET_LAST_COMMIT_MSG, payload: '' }, - { type: types.STAGE_CHANGE, payload: store.state.changedFiles[0].path }, - { type: types.STAGE_CHANGE, payload: store.state.changedFiles[1].path }, - ], - [ - { - type: 'openPendingTab', - payload: { file: openFile, keyPrefix: 'staged' }, - }, - ], - done, - ); + store.state.openFiles = [file1]; + store.state.changedFiles = [file1]; + store.state.stagedFiles = [{ ...file2, content: 'staged test' }]; + + store.state.entries = { + [file1.path]: { ...file1 }, + [file2.path]: { ...file2 }, + }; }); - }); - describe('unstageAllChanges', () => { - it('removes all files from stagedFiles after unstaging', done => { - const openFile = { ...file(), path: 'test' }; + describe('stageAllChanges', () => { + it('adds all files from changedFiles to stagedFiles', () => { + stageAllChanges(store); - store.state.openFiles.push(openFile); - store.state.changedFiles.push(openFile); - store.state.stagedFiles.push(openFile, file('new')); + expect(store.commit.calls.allArgs()).toEqual([ + [types.SET_LAST_COMMIT_MSG, ''], + [types.STAGE_CHANGE, jasmine.objectContaining({ path: file1.path })], + ]); + }); - testAction( - unstageAllChanges, - null, - store.state, - [ - { type: types.UNSTAGE_CHANGE, payload: store.state.stagedFiles[0].path }, - { type: types.UNSTAGE_CHANGE, payload: store.state.stagedFiles[1].path }, - ], - [ - { - type: 'openPendingTab', - payload: { file: openFile, keyPrefix: 'unstaged' }, - }, - ], - done, - ); + it('opens pending tab if a change exists in that file', () => { + stageAllChanges(store); + + expect(store.dispatch.calls.allArgs()).toEqual([ + [ + 'openPendingTab', + { file: { ...file1, staged: true, changed: true }, keyPrefix: 'staged' }, + ], + ]); + }); + + it('does not open pending tab if no change exists in that file', () => { + store.state.entries[file1.path].content = 'test'; + store.state.stagedFiles = [file1]; + store.state.changedFiles = [store.state.entries[file1.path]]; + + stageAllChanges(store); + + expect(store.dispatch).not.toHaveBeenCalled(); + }); + }); + + describe('unstageAllChanges', () => { + it('removes all files from stagedFiles after unstaging', () => { + unstageAllChanges(store); + + expect(store.commit.calls.allArgs()).toEqual([ + [types.UNSTAGE_CHANGE, jasmine.objectContaining({ path: file2.path })], + ]); + }); + + it('opens pending tab if a change exists in that file', () => { + unstageAllChanges(store); + + expect(store.dispatch.calls.allArgs()).toEqual([ + ['openPendingTab', { file: file1, keyPrefix: 'unstaged' }], + ]); + }); + + it('does not open pending tab if no change exists in that file', () => { + store.state.entries[file1.path].content = 'test'; + store.state.stagedFiles = [file1]; + store.state.changedFiles = [store.state.entries[file1.path]]; + + unstageAllChanges(store); + + expect(store.dispatch).not.toHaveBeenCalled(); + }); }); }); @@ -752,10 +776,6 @@ describe('Multi-file store actions', () => { }); }); - afterEach(() => { - resetStore(store); - }); - it('by default renames an entry and adds to changed', done => { testAction( renameEntry, @@ -966,18 +986,19 @@ describe('Multi-file store actions', () => { describe('error', () => { let dispatch; - const callParams = [ - { - commit() {}, - state: store.state, - }, - { - projectId: 'abc/def', - branchId: 'master-testing', - }, - ]; + let callParams; beforeEach(() => { + callParams = [ + { + commit() {}, + state: store.state, + }, + { + projectId: 'abc/def', + branchId: 'master-testing', + }, + ]; dispatch = jasmine.createSpy('dispatchSpy'); document.body.innerHTML += '<div class="flash-container"></div>'; }); |