From 682360490629376e2ec07d737c7d7dbfdaaeeab7 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 20 Dec 2019 18:07:53 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- spec/frontend/ide/stores/actions/file_spec.js | 52 +++---- spec/frontend/ide/stores/mutations/file_spec.js | 174 +++++++++++++++++++----- 2 files changed, 172 insertions(+), 54 deletions(-) (limited to 'spec/frontend/ide') 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', () => { -- cgit v1.2.3