Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/javascripts/diffs/store/actions_spec.js')
-rw-r--r--spec/javascripts/diffs/store/actions_spec.js1369
1 files changed, 0 insertions, 1369 deletions
diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js
deleted file mode 100644
index 7363a213847..00000000000
--- a/spec/javascripts/diffs/store/actions_spec.js
+++ /dev/null
@@ -1,1369 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import Cookies from 'js-cookie';
-import mockDiffFile from 'spec/diffs/mock_data/diff_file';
-import {
- DIFF_VIEW_COOKIE_NAME,
- INLINE_DIFF_VIEW_TYPE,
- PARALLEL_DIFF_VIEW_TYPE,
- DIFFS_PER_PAGE,
-} from '~/diffs/constants';
-import actions, {
- setBaseConfig,
- fetchDiffFiles,
- fetchDiffFilesBatch,
- fetchDiffFilesMeta,
- fetchCoverageFiles,
- assignDiscussionsToDiff,
- removeDiscussionsFromDiff,
- startRenderDiffsQueue,
- setInlineDiffViewType,
- setParallelDiffViewType,
- showCommentForm,
- cancelCommentForm,
- loadMoreLines,
- scrollToLineIfNeededInline,
- scrollToLineIfNeededParallel,
- loadCollapsedDiff,
- expandAllFiles,
- toggleFileDiscussions,
- saveDiffDiscussion,
- setHighlightedRow,
- toggleTreeOpen,
- scrollToFile,
- toggleShowTreeList,
- renderFileForDiscussionId,
- setRenderTreeList,
- setShowWhitespace,
- setRenderIt,
- requestFullDiff,
- receiveFullDiffSucess,
- receiveFullDiffError,
- fetchFullDiff,
- toggleFullDiff,
- setFileCollapsed,
- setExpandedDiffLines,
- setSuggestPopoverDismissed,
-} from '~/diffs/store/actions';
-import eventHub from '~/notes/event_hub';
-import * as types from '~/diffs/store/mutation_types';
-import axios from '~/lib/utils/axios_utils';
-import testAction from '../../helpers/vuex_action_helper';
-
-describe('DiffsStoreActions', () => {
- const originalMethods = {
- requestAnimationFrame: global.requestAnimationFrame,
- requestIdleCallback: global.requestIdleCallback,
- };
-
- beforeEach(() => {
- ['requestAnimationFrame', 'requestIdleCallback'].forEach(method => {
- global[method] = cb => {
- cb();
- };
- });
- });
-
- afterEach(() => {
- ['requestAnimationFrame', 'requestIdleCallback'].forEach(method => {
- global[method] = originalMethods[method];
- });
- });
-
- describe('setBaseConfig', () => {
- it('should set given endpoint and project path', done => {
- const endpoint = '/diffs/set/endpoint';
- const endpointMetadata = '/diffs/set/endpoint/metadata';
- const endpointBatch = '/diffs/set/endpoint/batch';
- const endpointCoverage = '/diffs/set/coverage_reports';
- const projectPath = '/root/project';
- const dismissEndpoint = '/-/user_callouts';
- const showSuggestPopover = false;
- const useSingleDiffStyle = false;
-
- testAction(
- setBaseConfig,
- {
- endpoint,
- endpointBatch,
- endpointMetadata,
- endpointCoverage,
- projectPath,
- dismissEndpoint,
- showSuggestPopover,
- useSingleDiffStyle,
- },
- {
- endpoint: '',
- endpointBatch: '',
- endpointMetadata: '',
- endpointCoverage: '',
- projectPath: '',
- dismissEndpoint: '',
- showSuggestPopover: true,
- useSingleDiffStyle: true,
- },
- [
- {
- type: types.SET_BASE_CONFIG,
- payload: {
- endpoint,
- endpointMetadata,
- endpointBatch,
- endpointCoverage,
- projectPath,
- dismissEndpoint,
- showSuggestPopover,
- useSingleDiffStyle,
- },
- },
- ],
- [],
- done,
- );
- });
- });
-
- describe('fetchDiffFiles', () => {
- it('should fetch diff files', done => {
- const endpoint = '/fetch/diff/files?view=inline&w=1';
- const mock = new MockAdapter(axios);
- const res = { diff_files: 1, merge_request_diffs: [] };
- mock.onGet(endpoint).reply(200, res);
-
- testAction(
- fetchDiffFiles,
- {},
- { endpoint, diffFiles: [], showWhitespace: false, diffViewType: 'inline' },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- { type: types.SET_MERGE_REQUEST_DIFFS, payload: res.merge_request_diffs },
- { type: types.SET_DIFF_DATA, payload: res },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
-
- fetchDiffFiles({ state: { endpoint }, commit: () => null })
- .then(data => {
- expect(data).toEqual(res);
- done();
- })
- .catch(done.fail);
- });
- });
-
- describe('fetchDiffFilesBatch', () => {
- it('should fetch batch diff files', done => {
- const endpointBatch = '/fetch/diffs_batch';
- const mock = new MockAdapter(axios);
- const res1 = { diff_files: [], pagination: { next_page: 2 } };
- const res2 = { diff_files: [], pagination: {} };
- mock
- .onGet(endpointBatch, {
- params: { page: 1, per_page: DIFFS_PER_PAGE, w: '1', view: 'inline' },
- })
- .reply(200, res1)
- .onGet(endpointBatch, {
- params: { page: 2, per_page: DIFFS_PER_PAGE, w: '1', view: 'inline' },
- })
- .reply(200, res2);
-
- testAction(
- fetchDiffFilesBatch,
- {},
- { endpointBatch, useSingleDiffStyle: true, diffViewType: 'inline' },
- [
- { type: types.SET_BATCH_LOADING, payload: true },
- { type: types.SET_RETRIEVING_BATCHES, payload: true },
- { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res1.diff_files } },
- { type: types.SET_BATCH_LOADING, payload: false },
- { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: [] } },
- { type: types.SET_BATCH_LOADING, payload: false },
- { type: types.SET_RETRIEVING_BATCHES, payload: false },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
- });
- });
-
- describe('fetchDiffFilesMeta', () => {
- it('should fetch diff meta information', done => {
- const endpointMetadata = '/fetch/diffs_meta?view=inline';
- const mock = new MockAdapter(axios);
- const data = { diff_files: [] };
- const res = { data };
- mock.onGet(endpointMetadata).reply(200, res);
-
- testAction(
- fetchDiffFilesMeta,
- {},
- { endpointMetadata },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- { type: types.SET_MERGE_REQUEST_DIFFS, payload: [] },
- { type: types.SET_DIFF_DATA, payload: { data } },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
- });
- });
-
- describe('when the single diff view feature flag is off', () => {
- describe('fetchDiffFiles', () => {
- it('should fetch diff files', done => {
- const endpoint = '/fetch/diff/files?w=1';
- const mock = new MockAdapter(axios);
- const res = { diff_files: 1, merge_request_diffs: [] };
- mock.onGet(endpoint).reply(200, res);
-
- testAction(
- fetchDiffFiles,
- {},
- {
- endpoint,
- diffFiles: [],
- showWhitespace: false,
- diffViewType: 'inline',
- useSingleDiffStyle: false,
- },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- { type: types.SET_MERGE_REQUEST_DIFFS, payload: res.merge_request_diffs },
- { type: types.SET_DIFF_DATA, payload: res },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
-
- fetchDiffFiles({ state: { endpoint }, commit: () => null })
- .then(data => {
- expect(data).toEqual(res);
- done();
- })
- .catch(done.fail);
- });
- });
-
- describe('fetchDiffFilesBatch', () => {
- it('should fetch batch diff files', done => {
- const endpointBatch = '/fetch/diffs_batch';
- const mock = new MockAdapter(axios);
- const res1 = { diff_files: [], pagination: { next_page: 2 } };
- const res2 = { diff_files: [], pagination: {} };
- mock
- .onGet(endpointBatch, { params: { page: 1, per_page: DIFFS_PER_PAGE, w: '1' } })
- .reply(200, res1)
- .onGet(endpointBatch, { params: { page: 2, per_page: DIFFS_PER_PAGE, w: '1' } })
- .reply(200, res2);
-
- testAction(
- fetchDiffFilesBatch,
- {},
- { endpointBatch, useSingleDiffStyle: false },
- [
- { type: types.SET_BATCH_LOADING, payload: true },
- { type: types.SET_RETRIEVING_BATCHES, payload: true },
- { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: res1.diff_files } },
- { type: types.SET_BATCH_LOADING, payload: false },
- { type: types.SET_DIFF_DATA_BATCH, payload: { diff_files: [] } },
- { type: types.SET_BATCH_LOADING, payload: false },
- { type: types.SET_RETRIEVING_BATCHES, payload: false },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
- });
- });
-
- describe('fetchDiffFilesMeta', () => {
- it('should fetch diff meta information', done => {
- const endpointMetadata = '/fetch/diffs_meta?';
- const mock = new MockAdapter(axios);
- const data = { diff_files: [] };
- const res = { data };
- mock.onGet(endpointMetadata).reply(200, res);
-
- testAction(
- fetchDiffFilesMeta,
- {},
- { endpointMetadata, useSingleDiffStyle: false },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- { type: types.SET_MERGE_REQUEST_DIFFS, payload: [] },
- { type: types.SET_DIFF_DATA, payload: { data } },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
- });
- });
- });
-
- describe('fetchCoverageFiles', () => {
- let mock;
- const endpointCoverage = '/fetch';
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => mock.restore());
-
- it('should commit SET_COVERAGE_DATA with received response', done => {
- const data = { files: { 'app.js': { '1': 0, '2': 1 } } };
-
- mock.onGet(endpointCoverage).reply(200, { data });
-
- testAction(
- fetchCoverageFiles,
- {},
- { endpointCoverage },
- [{ type: types.SET_COVERAGE_DATA, payload: { data } }],
- [],
- done,
- );
- });
-
- it('should show flash on API error', done => {
- const flashSpy = spyOnDependency(actions, 'createFlash');
-
- mock.onGet(endpointCoverage).reply(400);
-
- testAction(fetchCoverageFiles, {}, { endpointCoverage }, [], [], () => {
- expect(flashSpy).toHaveBeenCalledTimes(1);
- expect(flashSpy).toHaveBeenCalledWith(jasmine.stringMatching('Something went wrong'));
- done();
- });
- });
- });
-
- describe('setHighlightedRow', () => {
- it('should mark currently selected diff and set lineHash and fileHash of highlightedRow', () => {
- testAction(setHighlightedRow, 'ABC_123', {}, [
- { type: types.SET_HIGHLIGHTED_ROW, payload: 'ABC_123' },
- { type: types.UPDATE_CURRENT_DIFF_FILE_ID, payload: 'ABC' },
- ]);
- });
- });
-
- describe('assignDiscussionsToDiff', () => {
- it('should merge discussions into diffs', done => {
- window.location.hash = 'ABC_123';
-
- const state = {
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1_1',
- discussions: [],
- },
- right: {
- line_code: 'ABC_1_1',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1_1',
- discussions: [],
- old_line: 5,
- new_line: null,
- },
- ],
- diff_refs: {
- base_sha: 'abc',
- head_sha: 'def',
- start_sha: 'ghi',
- },
- new_path: 'file1',
- old_path: 'file2',
- },
- ],
- };
-
- const diffPosition = {
- base_sha: 'abc',
- head_sha: 'def',
- start_sha: 'ghi',
- new_line: null,
- new_path: 'file1',
- old_line: 5,
- old_path: 'file2',
- };
-
- const singleDiscussion = {
- line_code: 'ABC_1_1',
- diff_discussion: {},
- diff_file: {
- file_hash: 'ABC',
- },
- file_hash: 'ABC',
- resolvable: true,
- position: diffPosition,
- original_position: diffPosition,
- };
-
- const discussions = [singleDiscussion];
-
- testAction(
- assignDiscussionsToDiff,
- discussions,
- state,
- [
- {
- type: types.SET_LINE_DISCUSSIONS_FOR_FILE,
- payload: {
- discussion: singleDiscussion,
- diffPositionByLineCode: {
- ABC_1_1: {
- base_sha: 'abc',
- head_sha: 'def',
- start_sha: 'ghi',
- new_line: null,
- new_path: 'file1',
- old_line: 5,
- old_path: 'file2',
- line_code: 'ABC_1_1',
- position_type: 'text',
- },
- },
- hash: 'ABC_123',
- },
- },
- ],
- [],
- done,
- );
- });
- });
-
- describe('removeDiscussionsFromDiff', () => {
- it('should remove discussions from diffs', done => {
- const state = {
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1_1',
- discussions: [
- {
- id: 1,
- },
- ],
- },
- right: {
- line_code: 'ABC_1_1',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1_1',
- discussions: [],
- },
- ],
- },
- ],
- };
- const singleDiscussion = {
- id: '1',
- file_hash: 'ABC',
- line_code: 'ABC_1_1',
- };
-
- testAction(
- removeDiscussionsFromDiff,
- singleDiscussion,
- state,
- [
- {
- type: types.REMOVE_LINE_DISCUSSIONS_FOR_FILE,
- payload: {
- id: '1',
- fileHash: 'ABC',
- lineCode: 'ABC_1_1',
- },
- },
- ],
- [],
- done,
- );
- });
- });
-
- describe('startRenderDiffsQueue', () => {
- it('should set all files to RENDER_FILE', () => {
- const state = {
- diffFiles: [
- {
- id: 1,
- renderIt: false,
- viewer: {
- collapsed: false,
- },
- },
- {
- id: 2,
- renderIt: false,
- viewer: {
- collapsed: false,
- },
- },
- ],
- };
-
- const pseudoCommit = (commitType, file) => {
- expect(commitType).toBe(types.RENDER_FILE);
- Object.assign(file, {
- renderIt: true,
- });
- };
-
- startRenderDiffsQueue({ state, commit: pseudoCommit });
-
- expect(state.diffFiles[0].renderIt).toBe(true);
- expect(state.diffFiles[1].renderIt).toBe(true);
- });
- });
-
- describe('setInlineDiffViewType', () => {
- it('should set diff view type to inline and also set the cookie properly', done => {
- testAction(
- setInlineDiffViewType,
- null,
- {},
- [{ type: types.SET_DIFF_VIEW_TYPE, payload: INLINE_DIFF_VIEW_TYPE }],
- [],
- () => {
- setTimeout(() => {
- expect(Cookies.get('diff_view')).toEqual(INLINE_DIFF_VIEW_TYPE);
- done();
- }, 0);
- },
- );
- });
- });
-
- describe('setParallelDiffViewType', () => {
- it('should set diff view type to parallel and also set the cookie properly', done => {
- testAction(
- setParallelDiffViewType,
- null,
- {},
- [{ type: types.SET_DIFF_VIEW_TYPE, payload: PARALLEL_DIFF_VIEW_TYPE }],
- [],
- () => {
- setTimeout(() => {
- expect(Cookies.get(DIFF_VIEW_COOKIE_NAME)).toEqual(PARALLEL_DIFF_VIEW_TYPE);
- done();
- }, 0);
- },
- );
- });
- });
-
- describe('showCommentForm', () => {
- it('should call mutation to show comment form', done => {
- const payload = { lineCode: 'lineCode', fileHash: 'hash' };
-
- testAction(
- showCommentForm,
- payload,
- {},
- [{ type: types.TOGGLE_LINE_HAS_FORM, payload: { ...payload, hasForm: true } }],
- [],
- done,
- );
- });
- });
-
- describe('cancelCommentForm', () => {
- it('should call mutation to cancel comment form', done => {
- const payload = { lineCode: 'lineCode', fileHash: 'hash' };
-
- testAction(
- cancelCommentForm,
- payload,
- {},
- [{ type: types.TOGGLE_LINE_HAS_FORM, payload: { ...payload, hasForm: false } }],
- [],
- done,
- );
- });
- });
-
- describe('loadMoreLines', () => {
- it('should call mutation to show comment form', done => {
- const endpoint = '/diffs/load/more/lines';
- const params = { since: 6, to: 26 };
- const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
- const fileHash = 'ff9200';
- const isExpandDown = false;
- const nextLineNumbers = {};
- const options = { endpoint, params, lineNumbers, fileHash, isExpandDown, nextLineNumbers };
- const mock = new MockAdapter(axios);
- const contextLines = { contextLines: [{ lineCode: 6 }] };
- mock.onGet(endpoint).reply(200, contextLines);
-
- testAction(
- loadMoreLines,
- options,
- {},
- [
- {
- type: types.ADD_CONTEXT_LINES,
- payload: { lineNumbers, contextLines, params, fileHash, isExpandDown, nextLineNumbers },
- },
- ],
- [],
- () => {
- mock.restore();
- done();
- },
- );
- });
- });
-
- describe('loadCollapsedDiff', () => {
- const state = { showWhitespace: true };
- it('should fetch data and call mutation with response and the give parameter', done => {
- const file = { hash: 123, load_collapsed_diff_url: '/load/collapsed/diff/url' };
- const data = { hash: 123, parallelDiffLines: [{ lineCode: 1 }] };
- const mock = new MockAdapter(axios);
- const commit = jasmine.createSpy('commit');
- mock.onGet(file.loadCollapsedDiffUrl).reply(200, data);
-
- loadCollapsedDiff({ commit, getters: { commitId: null }, state }, file)
- .then(() => {
- expect(commit).toHaveBeenCalledWith(types.ADD_COLLAPSED_DIFFS, { file, data });
-
- mock.restore();
- done();
- })
- .catch(done.fail);
- });
-
- it('should fetch data without commit ID', () => {
- const file = { load_collapsed_diff_url: '/load/collapsed/diff/url' };
- const getters = {
- commitId: null,
- };
-
- spyOn(axios, 'get').and.returnValue(Promise.resolve({ data: {} }));
-
- loadCollapsedDiff({ commit() {}, getters, state }, file);
-
- expect(axios.get).toHaveBeenCalledWith(file.load_collapsed_diff_url, {
- params: { commit_id: null, w: '0' },
- });
- });
-
- it('should fetch data with commit ID', () => {
- const file = { load_collapsed_diff_url: '/load/collapsed/diff/url' };
- const getters = {
- commitId: '123',
- };
-
- spyOn(axios, 'get').and.returnValue(Promise.resolve({ data: {} }));
-
- loadCollapsedDiff({ commit() {}, getters, state }, file);
-
- expect(axios.get).toHaveBeenCalledWith(file.load_collapsed_diff_url, {
- params: { commit_id: '123', w: '0' },
- });
- });
- });
-
- describe('expandAllFiles', () => {
- it('should change the collapsed prop from the diffFiles', done => {
- testAction(
- expandAllFiles,
- null,
- {},
- [
- {
- type: types.EXPAND_ALL_FILES,
- },
- ],
- [],
- done,
- );
- });
- });
-
- describe('toggleFileDiscussions', () => {
- it('should dispatch collapseDiscussion when all discussions are expanded', () => {
- const getters = {
- getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ id: 1 }]),
- diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(true),
- diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(false),
- };
-
- const dispatch = jasmine.createSpy('dispatch');
-
- toggleFileDiscussions({ getters, dispatch });
-
- expect(dispatch).toHaveBeenCalledWith(
- 'collapseDiscussion',
- { discussionId: 1 },
- { root: true },
- );
- });
-
- it('should dispatch expandDiscussion when all discussions are collapsed', () => {
- const getters = {
- getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ id: 1 }]),
- diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(false),
- diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(true),
- };
-
- const dispatch = jasmine.createSpy();
-
- toggleFileDiscussions({ getters, dispatch });
-
- expect(dispatch).toHaveBeenCalledWith(
- 'expandDiscussion',
- { discussionId: 1 },
- { root: true },
- );
- });
-
- it('should dispatch expandDiscussion when some discussions are collapsed and others are expanded for the collapsed discussion', () => {
- const getters = {
- getDiffFileDiscussions: jasmine.createSpy().and.returnValue([{ expanded: false, id: 1 }]),
- diffHasAllExpandedDiscussions: jasmine.createSpy().and.returnValue(false),
- diffHasAllCollapsedDiscussions: jasmine.createSpy().and.returnValue(false),
- };
-
- const dispatch = jasmine.createSpy();
-
- toggleFileDiscussions({ getters, dispatch });
-
- expect(dispatch).toHaveBeenCalledWith(
- 'expandDiscussion',
- { discussionId: 1 },
- { root: true },
- );
- });
- });
-
- describe('scrollToLineIfNeededInline', () => {
- const lineMock = {
- line_code: 'ABC_123',
- };
-
- it('should not call handleLocationHash when there is not hash', () => {
- window.location.hash = '';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededInline({}, lineMock);
-
- expect(handleLocationHashSpy).not.toHaveBeenCalled();
- });
-
- it('should not call handleLocationHash when the hash does not match any line', () => {
- window.location.hash = 'XYZ_456';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededInline({}, lineMock);
-
- expect(handleLocationHashSpy).not.toHaveBeenCalled();
- });
-
- it('should call handleLocationHash only when the hash matches a line', () => {
- window.location.hash = 'ABC_123';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededInline(
- {},
- {
- lineCode: 'ABC_456',
- },
- );
- scrollToLineIfNeededInline({}, lineMock);
- scrollToLineIfNeededInline(
- {},
- {
- lineCode: 'XYZ_456',
- },
- );
-
- expect(handleLocationHashSpy).toHaveBeenCalled();
- expect(handleLocationHashSpy).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('scrollToLineIfNeededParallel', () => {
- const lineMock = {
- left: null,
- right: {
- line_code: 'ABC_123',
- },
- };
-
- it('should not call handleLocationHash when there is not hash', () => {
- window.location.hash = '';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededParallel({}, lineMock);
-
- expect(handleLocationHashSpy).not.toHaveBeenCalled();
- });
-
- it('should not call handleLocationHash when the hash does not match any line', () => {
- window.location.hash = 'XYZ_456';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededParallel({}, lineMock);
-
- expect(handleLocationHashSpy).not.toHaveBeenCalled();
- });
-
- it('should call handleLocationHash only when the hash matches a line', () => {
- window.location.hash = 'ABC_123';
-
- const handleLocationHashSpy = spyOnDependency(actions, 'handleLocationHash').and.stub();
-
- scrollToLineIfNeededParallel(
- {},
- {
- left: null,
- right: {
- lineCode: 'ABC_456',
- },
- },
- );
- scrollToLineIfNeededParallel({}, lineMock);
- scrollToLineIfNeededParallel(
- {},
- {
- left: null,
- right: {
- lineCode: 'XYZ_456',
- },
- },
- );
-
- expect(handleLocationHashSpy).toHaveBeenCalled();
- expect(handleLocationHashSpy).toHaveBeenCalledTimes(1);
- });
- });
-
- describe('saveDiffDiscussion', () => {
- it('dispatches actions', done => {
- const commitId = 'something';
- const formData = {
- diffFile: { ...mockDiffFile },
- noteableData: {},
- };
- const note = {};
- const state = {
- commit: {
- id: commitId,
- },
- };
- const dispatch = jasmine.createSpy('dispatch').and.callFake(name => {
- switch (name) {
- case 'saveNote':
- return Promise.resolve({
- discussion: 'test',
- });
- case 'updateDiscussion':
- return Promise.resolve('discussion');
- default:
- return Promise.resolve({});
- }
- });
-
- saveDiffDiscussion({ state, dispatch }, { note, formData })
- .then(() => {
- const { calls } = dispatch;
-
- expect(calls.count()).toBe(5);
- expect(calls.argsFor(0)).toEqual(['saveNote', jasmine.any(Object), { root: true }]);
-
- const postData = calls.argsFor(0)[1];
-
- expect(postData.data.note.commit_id).toBe(commitId);
-
- expect(calls.argsFor(1)).toEqual(['updateDiscussion', 'test', { root: true }]);
- expect(calls.argsFor(2)).toEqual(['assignDiscussionsToDiff', ['discussion']]);
- })
- .then(done)
- .catch(done.fail);
- });
- });
-
- describe('toggleTreeOpen', () => {
- it('commits TOGGLE_FOLDER_OPEN', done => {
- testAction(
- toggleTreeOpen,
- 'path',
- {},
- [{ type: types.TOGGLE_FOLDER_OPEN, payload: 'path' }],
- [],
- done,
- );
- });
- });
-
- describe('scrollToFile', () => {
- let commit;
-
- beforeEach(() => {
- commit = jasmine.createSpy();
- jasmine.clock().install();
- });
-
- afterEach(() => {
- jasmine.clock().uninstall();
- });
-
- it('updates location hash', () => {
- const state = {
- treeEntries: {
- path: {
- fileHash: 'test',
- },
- },
- };
-
- scrollToFile({ state, commit }, 'path');
-
- expect(document.location.hash).toBe('#test');
- });
-
- it('commits UPDATE_CURRENT_DIFF_FILE_ID', () => {
- const state = {
- treeEntries: {
- path: {
- fileHash: 'test',
- },
- },
- };
-
- scrollToFile({ state, commit }, 'path');
-
- expect(commit).toHaveBeenCalledWith(types.UPDATE_CURRENT_DIFF_FILE_ID, 'test');
- });
- });
-
- describe('toggleShowTreeList', () => {
- it('commits toggle', done => {
- testAction(toggleShowTreeList, null, {}, [{ type: types.TOGGLE_SHOW_TREE_LIST }], [], done);
- });
-
- it('updates localStorage', () => {
- spyOn(localStorage, 'setItem');
-
- toggleShowTreeList({ commit() {}, state: { showTreeList: true } });
-
- expect(localStorage.setItem).toHaveBeenCalledWith('mr_tree_show', true);
- });
-
- it('does not update localStorage', () => {
- spyOn(localStorage, 'setItem');
-
- toggleShowTreeList({ commit() {}, state: { showTreeList: true } }, false);
-
- expect(localStorage.setItem).not.toHaveBeenCalled();
- });
- });
-
- describe('renderFileForDiscussionId', () => {
- const rootState = {
- notes: {
- discussions: [
- {
- id: '123',
- diff_file: {
- file_hash: 'HASH',
- },
- },
- {
- id: '456',
- diff_file: {
- file_hash: 'HASH',
- },
- },
- ],
- },
- };
- let commit;
- let $emit;
- let scrollToElement;
- const state = ({ collapsed, renderIt }) => ({
- diffFiles: [
- {
- file_hash: 'HASH',
- viewer: {
- collapsed,
- },
- renderIt,
- },
- ],
- });
-
- beforeEach(() => {
- commit = jasmine.createSpy('commit');
- scrollToElement = spyOnDependency(actions, 'scrollToElement').and.stub();
- $emit = spyOn(eventHub, '$emit');
- });
-
- it('renders and expands file for the given discussion id', () => {
- const localState = state({ collapsed: true, renderIt: false });
-
- renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
-
- expect(commit).toHaveBeenCalledWith('RENDER_FILE', localState.diffFiles[0]);
- expect($emit).toHaveBeenCalledTimes(1);
- expect(scrollToElement).toHaveBeenCalledTimes(1);
- });
-
- it('jumps to discussion on already rendered and expanded file', () => {
- const localState = state({ collapsed: false, renderIt: true });
-
- renderFileForDiscussionId({ rootState, state: localState, commit }, '123');
-
- expect(commit).not.toHaveBeenCalled();
- expect($emit).toHaveBeenCalledTimes(1);
- expect(scrollToElement).not.toHaveBeenCalled();
- });
- });
-
- describe('setRenderTreeList', () => {
- it('commits SET_RENDER_TREE_LIST', done => {
- testAction(
- setRenderTreeList,
- true,
- {},
- [{ type: types.SET_RENDER_TREE_LIST, payload: true }],
- [],
- done,
- );
- });
-
- it('sets localStorage', () => {
- spyOn(localStorage, 'setItem').and.stub();
-
- setRenderTreeList({ commit() {} }, true);
-
- expect(localStorage.setItem).toHaveBeenCalledWith('mr_diff_tree_list', true);
- });
- });
-
- describe('setShowWhitespace', () => {
- beforeEach(() => {
- spyOn(eventHub, '$emit').and.stub();
- });
-
- it('commits SET_SHOW_WHITESPACE', done => {
- testAction(
- setShowWhitespace,
- { showWhitespace: true },
- {},
- [{ type: types.SET_SHOW_WHITESPACE, payload: true }],
- [],
- done,
- );
- });
-
- it('sets localStorage', () => {
- spyOn(localStorage, 'setItem').and.stub();
-
- setShowWhitespace({ commit() {} }, { showWhitespace: true });
-
- expect(localStorage.setItem).toHaveBeenCalledWith('mr_show_whitespace', true);
- });
-
- it('calls history pushState', () => {
- spyOn(localStorage, 'setItem').and.stub();
- spyOn(window.history, 'pushState').and.stub();
-
- setShowWhitespace({ commit() {} }, { showWhitespace: true, pushState: true });
-
- expect(window.history.pushState).toHaveBeenCalled();
- });
-
- it('calls history pushState with merged params', () => {
- const originalPushState = window.history;
-
- originalPushState.pushState({}, '', '?test=1');
-
- spyOn(localStorage, 'setItem').and.stub();
- spyOn(window.history, 'pushState').and.stub();
-
- setShowWhitespace({ commit() {} }, { showWhitespace: true, pushState: true });
-
- expect(window.history.pushState.calls.mostRecent().args[2]).toMatch(/(.*)\?test=1&w=0/);
-
- originalPushState.pushState({}, '', '?');
- });
-
- it('emits eventHub event', () => {
- spyOn(localStorage, 'setItem').and.stub();
- spyOn(window.history, 'pushState').and.stub();
-
- setShowWhitespace({ commit() {} }, { showWhitespace: true, pushState: true });
-
- expect(eventHub.$emit).toHaveBeenCalledWith('refetchDiffData');
- });
- });
-
- describe('setRenderIt', () => {
- it('commits RENDER_FILE', done => {
- testAction(setRenderIt, 'file', {}, [{ type: types.RENDER_FILE, payload: 'file' }], [], done);
- });
- });
-
- describe('requestFullDiff', () => {
- it('commits REQUEST_FULL_DIFF', done => {
- testAction(
- requestFullDiff,
- 'file',
- {},
- [{ type: types.REQUEST_FULL_DIFF, payload: 'file' }],
- [],
- done,
- );
- });
- });
-
- describe('receiveFullDiffSucess', () => {
- it('commits REQUEST_FULL_DIFF', done => {
- testAction(
- receiveFullDiffSucess,
- { filePath: 'test' },
- {},
- [{ type: types.RECEIVE_FULL_DIFF_SUCCESS, payload: { filePath: 'test' } }],
- [],
- done,
- );
- });
- });
-
- describe('receiveFullDiffError', () => {
- it('commits REQUEST_FULL_DIFF', done => {
- testAction(
- receiveFullDiffError,
- 'file',
- {},
- [{ type: types.RECEIVE_FULL_DIFF_ERROR, payload: 'file' }],
- [],
- done,
- );
- });
- });
-
- describe('fetchFullDiff', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('success', () => {
- beforeEach(() => {
- mock.onGet(`${gl.TEST_HOST}/context`).replyOnce(200, ['test']);
- });
-
- it('dispatches receiveFullDiffSucess', done => {
- const file = {
- context_lines_path: `${gl.TEST_HOST}/context`,
- file_path: 'test',
- file_hash: 'test',
- };
- testAction(
- fetchFullDiff,
- file,
- null,
- [],
- [
- { type: 'receiveFullDiffSucess', payload: { filePath: 'test' } },
- { type: 'setExpandedDiffLines', payload: { file, data: ['test'] } },
- ],
- done,
- );
- });
- });
-
- describe('error', () => {
- beforeEach(() => {
- mock.onGet(`${gl.TEST_HOST}/context`).replyOnce(500);
- });
-
- it('dispatches receiveFullDiffError', done => {
- testAction(
- fetchFullDiff,
- { context_lines_path: `${gl.TEST_HOST}/context`, file_path: 'test', file_hash: 'test' },
- null,
- [],
- [{ type: 'receiveFullDiffError', payload: 'test' }],
- done,
- );
- });
- });
- });
-
- describe('toggleFullDiff', () => {
- let state;
-
- beforeEach(() => {
- state = {
- diffFiles: [{ file_path: 'test', isShowingFullFile: false }],
- };
- });
-
- it('dispatches fetchFullDiff when file is not expanded', done => {
- testAction(
- toggleFullDiff,
- 'test',
- state,
- [],
- [
- { type: 'requestFullDiff', payload: 'test' },
- { type: 'fetchFullDiff', payload: state.diffFiles[0] },
- ],
- done,
- );
- });
- });
-
- describe('setFileCollapsed', () => {
- it('commits SET_FILE_COLLAPSED', done => {
- testAction(
- setFileCollapsed,
- { filePath: 'test', collapsed: true },
- null,
- [{ type: types.SET_FILE_COLLAPSED, payload: { filePath: 'test', collapsed: true } }],
- [],
- done,
- );
- });
- });
-
- describe('setExpandedDiffLines', () => {
- beforeEach(() => {
- spyOnDependency(actions, 'idleCallback').and.callFake(cb => {
- cb({ timeRemaining: () => 50 });
- });
- });
-
- it('commits SET_CURRENT_VIEW_DIFF_FILE_LINES when lines less than MAX_RENDERING_DIFF_LINES', done => {
- spyOnDependency(actions, 'convertExpandLines').and.callFake(() => ['test']);
-
- testAction(
- setExpandedDiffLines,
- { file: { file_path: 'path' }, data: [] },
- { diffViewType: 'inline' },
- [
- {
- type: 'SET_HIDDEN_VIEW_DIFF_FILE_LINES',
- payload: { filePath: 'path', lines: ['test'] },
- },
- {
- type: 'SET_CURRENT_VIEW_DIFF_FILE_LINES',
- payload: { filePath: 'path', lines: ['test'] },
- },
- ],
- [],
- done,
- );
- });
-
- it('commits ADD_CURRENT_VIEW_DIFF_FILE_LINES when lines more than MAX_RENDERING_DIFF_LINES', done => {
- const lines = new Array(501).fill().map((_, i) => `line-${i}`);
- spyOnDependency(actions, 'convertExpandLines').and.callFake(() => lines);
-
- testAction(
- setExpandedDiffLines,
- { file: { file_path: 'path' }, data: [] },
- { diffViewType: 'inline' },
- [
- {
- type: 'SET_HIDDEN_VIEW_DIFF_FILE_LINES',
- payload: { filePath: 'path', lines },
- },
- {
- type: 'SET_CURRENT_VIEW_DIFF_FILE_LINES',
- payload: { filePath: 'path', lines: lines.slice(0, 200) },
- },
- { type: 'TOGGLE_DIFF_FILE_RENDERING_MORE', payload: 'path' },
- ...new Array(301).fill().map((_, i) => ({
- type: 'ADD_CURRENT_VIEW_DIFF_FILE_LINES',
- payload: { filePath: 'path', line: `line-${i + 200}` },
- })),
- { type: 'TOGGLE_DIFF_FILE_RENDERING_MORE', payload: 'path' },
- ],
- [],
- done,
- );
- });
- });
-
- describe('setSuggestPopoverDismissed', () => {
- it('commits SET_SHOW_SUGGEST_POPOVER', done => {
- const state = { dismissEndpoint: `${gl.TEST_HOST}/-/user_callouts` };
- const mock = new MockAdapter(axios);
- mock.onPost(state.dismissEndpoint).reply(200, {});
-
- spyOn(axios, 'post').and.callThrough();
-
- testAction(
- setSuggestPopoverDismissed,
- null,
- state,
- [{ type: types.SET_SHOW_SUGGEST_POPOVER }],
- [],
- () => {
- expect(axios.post).toHaveBeenCalledWith(state.dismissEndpoint, {
- feature_name: 'suggest_popover_dismissed',
- });
-
- mock.restore();
- done();
- },
- );
- });
- });
-});