summaryrefslogtreecommitdiff
path: root/spec/javascripts
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-20 15:09:17 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-20 15:09:17 +0000
commit194b499aa8e26df26ff70a1e1ce0396587bd5243 (patch)
treec873ac9c3096faf4a5da43d6670107461da2a7d7 /spec/javascripts
parent43b4b3e2d2ddebc0a89b94a8251c162ec5719780 (diff)
downloadgitlab-ce-194b499aa8e26df26ff70a1e1ce0396587bd5243.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/javascripts')
-rw-r--r--spec/javascripts/diffs/components/commit_widget_spec.js24
-rw-r--r--spec/javascripts/diffs/components/diff_discussions_spec.js102
-rw-r--r--spec/javascripts/diffs/components/diff_expansion_cell_spec.js229
-rw-r--r--spec/javascripts/diffs/components/diff_file_spec.js259
-rw-r--r--spec/javascripts/diffs/components/diff_line_note_form_spec.js114
-rw-r--r--spec/javascripts/diffs/components/file_row_stats_spec.js33
-rw-r--r--spec/javascripts/diffs/components/image_diff_overlay_spec.js146
-rw-r--r--spec/javascripts/diffs/components/inline_diff_expansion_row_spec.js31
-rw-r--r--spec/javascripts/diffs/components/inline_diff_table_row_spec.js103
-rw-r--r--spec/javascripts/diffs/components/inline_diff_view_spec.js54
-rw-r--r--spec/javascripts/diffs/components/parallel_diff_expansion_row_spec.js31
-rw-r--r--spec/javascripts/diffs/components/parallel_diff_table_row_spec.js147
-rw-r--r--spec/javascripts/diffs/components/parallel_diff_view_spec.js33
-rw-r--r--spec/javascripts/diffs/create_diffs_store.js4
-rw-r--r--spec/javascripts/diffs/mock_data/diff_discussions.js537
-rw-r--r--spec/javascripts/diffs/mock_data/diff_file_unreadable.js249
-rw-r--r--spec/javascripts/diffs/store/actions_spec.js1369
-rw-r--r--spec/javascripts/diffs/store/getters_spec.js315
-rw-r--r--spec/javascripts/diffs/store/mutations_spec.js965
-rw-r--r--spec/javascripts/diffs/store/utils_spec.js950
20 files changed, 13 insertions, 5682 deletions
diff --git a/spec/javascripts/diffs/components/commit_widget_spec.js b/spec/javascripts/diffs/components/commit_widget_spec.js
deleted file mode 100644
index 2b60bd232ed..00000000000
--- a/spec/javascripts/diffs/components/commit_widget_spec.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import Vue from 'vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
-import CommitWidget from '~/diffs/components/commit_widget.vue';
-import getDiffWithCommit from '../mock_data/diff_with_commit';
-
-describe('diffs/components/commit_widget', () => {
- const Component = Vue.extend(CommitWidget);
- const { commit } = getDiffWithCommit();
-
- let vm;
-
- beforeEach(() => {
- vm = mountComponent(Component, {
- commit: getDiffWithCommit().commit,
- });
- });
-
- it('renders commit item', () => {
- const commitElement = vm.$el.querySelector('li.commit');
-
- expect(commitElement).not.toBeNull();
- expect(commitElement).toContainText(commit.short_id);
- });
-});
diff --git a/spec/javascripts/diffs/components/diff_discussions_spec.js b/spec/javascripts/diffs/components/diff_discussions_spec.js
deleted file mode 100644
index 1b924bb947d..00000000000
--- a/spec/javascripts/diffs/components/diff_discussions_spec.js
+++ /dev/null
@@ -1,102 +0,0 @@
-import { mount, createLocalVue } from '@vue/test-utils';
-import DiffDiscussions from '~/diffs/components/diff_discussions.vue';
-import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
-import NoteableDiscussion from '~/notes/components/noteable_discussion.vue';
-import DiscussionNotes from '~/notes/components/discussion_notes.vue';
-import Icon from '~/vue_shared/components/icon.vue';
-import { createStore } from '~/mr_notes/stores';
-import '~/behaviors/markdown/render_gfm';
-import discussionsMockData from '../mock_data/diff_discussions';
-
-const localVue = createLocalVue();
-
-describe('DiffDiscussions', () => {
- let store;
- let wrapper;
- const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)];
-
- const createComponent = props => {
- store = createStore();
- wrapper = mount(localVue.extend(DiffDiscussions), {
- store,
- propsData: {
- discussions: getDiscussionsMockData(),
- ...props,
- },
- localVue,
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- it('should have notes list', () => {
- createComponent();
-
- expect(wrapper.find(NoteableDiscussion).exists()).toBe(true);
- expect(wrapper.find(DiscussionNotes).exists()).toBe(true);
- expect(wrapper.find(DiscussionNotes).findAll(TimelineEntryItem).length).toBe(
- discussionsMockData.notes.length,
- );
- });
- });
-
- describe('image commenting', () => {
- const findDiffNotesToggle = () => wrapper.find('.js-diff-notes-toggle');
-
- it('renders collapsible discussion button', () => {
- createComponent({ shouldCollapseDiscussions: true });
- const diffNotesToggle = findDiffNotesToggle();
-
- expect(diffNotesToggle.exists()).toBe(true);
- expect(diffNotesToggle.find(Icon).exists()).toBe(true);
- expect(diffNotesToggle.classes('diff-notes-collapse')).toBe(true);
- });
-
- it('dispatches toggleDiscussion when clicking collapse button', () => {
- createComponent({ shouldCollapseDiscussions: true });
- spyOn(wrapper.vm.$store, 'dispatch').and.stub();
- const diffNotesToggle = findDiffNotesToggle();
- diffNotesToggle.trigger('click');
-
- expect(wrapper.vm.$store.dispatch).toHaveBeenCalledWith('toggleDiscussion', {
- discussionId: discussionsMockData.id,
- });
- });
-
- it('renders expand button when discussion is collapsed', () => {
- const discussions = getDiscussionsMockData();
- discussions[0].expanded = false;
- createComponent({ discussions, shouldCollapseDiscussions: true });
- const diffNotesToggle = findDiffNotesToggle();
-
- expect(diffNotesToggle.text().trim()).toBe('1');
- expect(diffNotesToggle.classes()).toEqual(
- jasmine.arrayContaining(['btn-transparent', 'badge', 'badge-pill']),
- );
- });
-
- it('hides discussion when collapsed', () => {
- const discussions = getDiscussionsMockData();
- discussions[0].expanded = false;
- createComponent({ discussions, shouldCollapseDiscussions: true });
-
- expect(wrapper.find(NoteableDiscussion).isVisible()).toBe(false);
- });
-
- it('renders badge on avatar', () => {
- createComponent({ renderAvatarBadge: true });
- const noteableDiscussion = wrapper.find(NoteableDiscussion);
-
- expect(noteableDiscussion.find('.badge-pill').exists()).toBe(true);
- expect(
- noteableDiscussion
- .find('.badge-pill')
- .text()
- .trim(),
- ).toBe('1');
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/diff_expansion_cell_spec.js b/spec/javascripts/diffs/components/diff_expansion_cell_spec.js
deleted file mode 100644
index 9a5048d9332..00000000000
--- a/spec/javascripts/diffs/components/diff_expansion_cell_spec.js
+++ /dev/null
@@ -1,229 +0,0 @@
-import Vue from 'vue';
-import { cloneDeep } from 'lodash';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createStore } from '~/mr_notes/stores';
-import DiffExpansionCell from '~/diffs/components/diff_expansion_cell.vue';
-import { getPreviousLineIndex } from '~/diffs/store/utils';
-import { INLINE_DIFF_VIEW_TYPE, PARALLEL_DIFF_VIEW_TYPE } from '~/diffs/constants';
-import diffFileMockData from '../mock_data/diff_file';
-
-const EXPAND_UP_CLASS = '.js-unfold';
-const EXPAND_DOWN_CLASS = '.js-unfold-down';
-const EXPAND_ALL_CLASS = '.js-unfold-all';
-const LINE_TO_USE = 5;
-const lineSources = {
- [INLINE_DIFF_VIEW_TYPE]: 'highlighted_diff_lines',
- [PARALLEL_DIFF_VIEW_TYPE]: 'parallel_diff_lines',
-};
-const lineHandlers = {
- [INLINE_DIFF_VIEW_TYPE]: line => line,
- [PARALLEL_DIFF_VIEW_TYPE]: line => line.right || line.left,
-};
-
-function makeLoadMoreLinesPayload({
- sinceLine,
- toLine,
- oldLineNumber,
- diffViewType,
- fileHash,
- nextLineNumbers = {},
- unfold = false,
- bottom = false,
- isExpandDown = false,
-}) {
- return {
- endpoint: 'contextLinesPath',
- params: {
- since: sinceLine,
- to: toLine,
- offset: toLine + 1 - oldLineNumber,
- view: diffViewType,
- unfold,
- bottom,
- },
- lineNumbers: {
- oldLineNumber,
- newLineNumber: toLine + 1,
- },
- nextLineNumbers,
- fileHash,
- isExpandDown,
- };
-}
-
-function getLine(file, type, index) {
- const source = lineSources[type];
- const handler = lineHandlers[type];
-
- return handler(file[source][index]);
-}
-
-describe('DiffExpansionCell', () => {
- let mockFile;
- let mockLine;
- let store;
- let vm;
-
- beforeEach(() => {
- mockFile = cloneDeep(diffFileMockData);
- mockLine = getLine(mockFile, INLINE_DIFF_VIEW_TYPE, LINE_TO_USE);
- store = createStore();
- store.state.diffs.diffFiles = [mockFile];
- spyOn(store, 'dispatch').and.returnValue(Promise.resolve());
- });
-
- const createComponent = (options = {}) => {
- const cmp = Vue.extend(DiffExpansionCell);
- const defaults = {
- fileHash: mockFile.file_hash,
- contextLinesPath: 'contextLinesPath',
- line: mockLine,
- isTop: false,
- isBottom: false,
- };
- const props = Object.assign({}, defaults, options);
-
- vm = createComponentWithStore(cmp, store, props).$mount();
- };
-
- const findExpandUp = () => vm.$el.querySelector(EXPAND_UP_CLASS);
- const findExpandDown = () => vm.$el.querySelector(EXPAND_DOWN_CLASS);
- const findExpandAll = () => vm.$el.querySelector(EXPAND_ALL_CLASS);
-
- describe('top row', () => {
- it('should have "expand up" and "show all" option', () => {
- createComponent({
- isTop: true,
- });
-
- expect(findExpandUp()).not.toBe(null);
- expect(findExpandDown()).toBe(null);
- expect(findExpandAll()).not.toBe(null);
- });
- });
-
- describe('middle row', () => {
- it('should have "expand down", "show all", "expand up" option', () => {
- createComponent();
-
- expect(findExpandUp()).not.toBe(null);
- expect(findExpandDown()).not.toBe(null);
- expect(findExpandAll()).not.toBe(null);
- });
- });
-
- describe('bottom row', () => {
- it('should have "expand down" and "show all" option', () => {
- createComponent({
- isBottom: true,
- });
-
- expect(findExpandUp()).toBe(null);
- expect(findExpandDown()).not.toBe(null);
- expect(findExpandAll()).not.toBe(null);
- });
- });
-
- describe('any row', () => {
- [
- { diffViewType: INLINE_DIFF_VIEW_TYPE, file: { parallel_diff_lines: [] } },
- { diffViewType: PARALLEL_DIFF_VIEW_TYPE, file: { highlighted_diff_lines: [] } },
- ].forEach(({ diffViewType, file }) => {
- describe(`with diffViewType (${diffViewType})`, () => {
- beforeEach(() => {
- mockLine = getLine(mockFile, diffViewType, LINE_TO_USE);
- store.state.diffs.diffFiles = [{ ...mockFile, ...file }];
- store.state.diffs.diffViewType = diffViewType;
- });
-
- it('does not initially dispatch anything', () => {
- expect(store.dispatch).not.toHaveBeenCalled();
- });
-
- it('on expand all clicked, dispatch loadMoreLines', () => {
- const oldLineNumber = mockLine.meta_data.old_pos;
- const newLineNumber = mockLine.meta_data.new_pos;
- const previousIndex = getPreviousLineIndex(diffViewType, mockFile, {
- oldLineNumber,
- newLineNumber,
- });
-
- createComponent();
-
- findExpandAll().click();
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/loadMoreLines',
- makeLoadMoreLinesPayload({
- fileHash: mockFile.file_hash,
- toLine: newLineNumber - 1,
- sinceLine: previousIndex,
- oldLineNumber,
- diffViewType,
- }),
- );
- });
-
- it('on expand up clicked, dispatch loadMoreLines', () => {
- mockLine.meta_data.old_pos = 200;
- mockLine.meta_data.new_pos = 200;
-
- const oldLineNumber = mockLine.meta_data.old_pos;
- const newLineNumber = mockLine.meta_data.new_pos;
-
- createComponent();
-
- findExpandUp().click();
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/loadMoreLines',
- makeLoadMoreLinesPayload({
- fileHash: mockFile.file_hash,
- toLine: newLineNumber - 1,
- sinceLine: 179,
- oldLineNumber,
- diffViewType,
- unfold: true,
- }),
- );
- });
-
- it('on expand down clicked, dispatch loadMoreLines', () => {
- mockFile[lineSources[diffViewType]][LINE_TO_USE + 1] = cloneDeep(
- mockFile[lineSources[diffViewType]][LINE_TO_USE],
- );
- const nextLine = getLine(mockFile, diffViewType, LINE_TO_USE + 1);
-
- nextLine.meta_data.old_pos = 300;
- nextLine.meta_data.new_pos = 300;
- mockLine.meta_data.old_pos = 200;
- mockLine.meta_data.new_pos = 200;
-
- createComponent();
-
- findExpandDown().click();
-
- expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
- endpoint: 'contextLinesPath',
- params: {
- since: 1,
- to: 21, // the load amount, plus 1 line
- offset: 0,
- view: diffViewType,
- unfold: true,
- bottom: true,
- },
- lineNumbers: {
- // when expanding down, these are based on the previous line, 0, in this case
- oldLineNumber: 0,
- newLineNumber: 0,
- },
- nextLineNumbers: { old_line: 200, new_line: 200 },
- fileHash: mockFile.file_hash,
- isExpandDown: true,
- });
- });
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/diff_file_spec.js b/spec/javascripts/diffs/components/diff_file_spec.js
deleted file mode 100644
index e2b64a5418e..00000000000
--- a/spec/javascripts/diffs/components/diff_file_spec.js
+++ /dev/null
@@ -1,259 +0,0 @@
-import Vue from 'vue';
-import { createStore } from 'ee_else_ce/mr_notes/stores';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { mockTracking, triggerEvent } from 'spec/helpers/tracking_helper';
-import DiffFileComponent from '~/diffs/components/diff_file.vue';
-import { diffViewerModes, diffViewerErrors } from '~/ide/constants';
-import diffFileMockDataReadable from '../mock_data/diff_file';
-import diffFileMockDataUnreadable from '../mock_data/diff_file_unreadable';
-
-describe('DiffFile', () => {
- let vm;
- let trackingSpy;
-
- beforeEach(() => {
- vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), {
- file: JSON.parse(JSON.stringify(diffFileMockDataReadable)),
- canCurrentUserFork: false,
- }).$mount();
- trackingSpy = mockTracking('_category_', vm.$el, spyOn);
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- const findDiffContent = () => vm.$el.querySelector('.diff-content');
- const isVisible = el => el.style.display !== 'none';
-
- describe('template', () => {
- it('should render component with file header, file content components', done => {
- const el = vm.$el;
- const { file_hash, file_path } = vm.file;
-
- expect(el.id).toEqual(file_hash);
- expect(el.classList.contains('diff-file')).toEqual(true);
-
- expect(el.querySelectorAll('.diff-content.hidden').length).toEqual(0);
- expect(el.querySelector('.js-file-title')).toBeDefined();
- expect(el.querySelector('.btn-clipboard')).toBeDefined();
- expect(el.querySelector('.file-title-name').innerText.indexOf(file_path)).toBeGreaterThan(-1);
- expect(el.querySelector('.js-syntax-highlight')).toBeDefined();
-
- vm.file.renderIt = true;
-
- vm.$nextTick()
- .then(() => {
- expect(el.querySelectorAll('.line_content').length).toBe(5);
- expect(el.querySelectorAll('.js-line-expansion-content').length).toBe(1);
- triggerEvent('.btn-clipboard');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('should track a click event on copy to clip board button', done => {
- const el = vm.$el;
-
- expect(el.querySelector('.btn-clipboard')).toBeDefined();
- vm.file.renderIt = true;
- vm.$nextTick()
- .then(() => {
- triggerEvent('.btn-clipboard');
-
- expect(trackingSpy).toHaveBeenCalledWith('_category_', 'click_copy_file_button', {
- label: 'diff_copy_file_path_button',
- property: 'diff_copy_file',
- });
- })
- .then(done)
- .catch(done.fail);
- });
-
- describe('collapsed', () => {
- it('should not have file content', done => {
- expect(isVisible(findDiffContent())).toBe(true);
- expect(vm.isCollapsed).toEqual(false);
- vm.isCollapsed = true;
- vm.file.renderIt = true;
-
- vm.$nextTick(() => {
- expect(isVisible(findDiffContent())).toBe(false);
-
- done();
- });
- });
-
- it('should have collapsed text and link', done => {
- vm.renderIt = true;
- vm.isCollapsed = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).toContain('This diff is collapsed');
- expect(vm.$el.querySelectorAll('.js-click-to-expand').length).toEqual(1);
-
- done();
- });
- });
-
- it('should have collapsed text and link even before rendered', done => {
- vm.renderIt = false;
- vm.isCollapsed = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).toContain('This diff is collapsed');
- expect(vm.$el.querySelectorAll('.js-click-to-expand').length).toEqual(1);
-
- done();
- });
- });
-
- it('should be collapsable for unreadable files', done => {
- vm.$destroy();
- vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), {
- file: JSON.parse(JSON.stringify(diffFileMockDataUnreadable)),
- canCurrentUserFork: false,
- }).$mount();
-
- vm.renderIt = false;
- vm.isCollapsed = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).toContain('This diff is collapsed');
- expect(vm.$el.querySelectorAll('.js-click-to-expand').length).toEqual(1);
-
- done();
- });
- });
-
- it('should be collapsed for renamed files', done => {
- vm.renderIt = true;
- vm.isCollapsed = false;
- vm.file.highlighted_diff_lines = null;
- vm.file.viewer.name = diffViewerModes.renamed;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).not.toContain('This diff is collapsed');
-
- done();
- });
- });
-
- it('should be collapsed for mode changed files', done => {
- vm.renderIt = true;
- vm.isCollapsed = false;
- vm.file.highlighted_diff_lines = null;
- vm.file.viewer.name = diffViewerModes.mode_changed;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).not.toContain('This diff is collapsed');
-
- done();
- });
- });
-
- it('should have loading icon while loading a collapsed diffs', done => {
- vm.isCollapsed = true;
- vm.isLoadingCollapsedDiff = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.querySelectorAll('.diff-content.loading').length).toEqual(1);
-
- done();
- });
- });
-
- it('should update store state', done => {
- spyOn(vm.$store, 'dispatch');
-
- vm.isCollapsed = true;
-
- vm.$nextTick(() => {
- expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/setFileCollapsed', {
- filePath: vm.file.file_path,
- collapsed: true,
- });
-
- done();
- });
- });
-
- it('updates local state when changing file state', done => {
- vm.file.viewer.collapsed = true;
-
- vm.$nextTick(() => {
- expect(vm.isCollapsed).toBe(true);
-
- done();
- });
- });
- });
- });
-
- describe('too large diff', () => {
- it('should have too large warning and blob link', done => {
- const BLOB_LINK = '/file/view/path';
- vm.file.viewer.error = diffViewerErrors.too_large;
- vm.file.viewer.error_message =
- 'This source diff could not be displayed because it is too large';
- vm.file.view_path = BLOB_LINK;
- vm.file.renderIt = true;
-
- vm.$nextTick(() => {
- expect(vm.$el.innerText).toContain(
- 'This source diff could not be displayed because it is too large',
- );
-
- done();
- });
- });
- });
-
- describe('watch collapsed', () => {
- it('calls handleLoadCollapsedDiff if collapsed changed & file has no lines', done => {
- spyOn(vm, 'handleLoadCollapsedDiff');
-
- vm.file.highlighted_diff_lines = undefined;
- vm.file.parallel_diff_lines = [];
- vm.isCollapsed = true;
-
- vm.$nextTick()
- .then(() => {
- vm.isCollapsed = false;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.handleLoadCollapsedDiff).toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('does not call handleLoadCollapsedDiff if collapsed changed & file is unreadable', done => {
- vm.$destroy();
- vm = createComponentWithStore(Vue.extend(DiffFileComponent), createStore(), {
- file: JSON.parse(JSON.stringify(diffFileMockDataUnreadable)),
- canCurrentUserFork: false,
- }).$mount();
-
- spyOn(vm, 'handleLoadCollapsedDiff');
-
- vm.file.highlighted_diff_lines = undefined;
- vm.file.parallel_diff_lines = [];
- vm.isCollapsed = true;
-
- vm.$nextTick()
- .then(() => {
- vm.isCollapsed = false;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.handleLoadCollapsedDiff).not.toHaveBeenCalled();
- })
- .then(done)
- .catch(done.fail);
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/diff_line_note_form_spec.js b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
deleted file mode 100644
index 09263e5ce83..00000000000
--- a/spec/javascripts/diffs/components/diff_line_note_form_spec.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
-import { createStore } from '~/mr_notes/stores';
-import diffFileMockData from '../mock_data/diff_file';
-import { noteableDataMock } from '../../notes/mock_data';
-
-describe('DiffLineNoteForm', () => {
- let component;
- let diffFile;
- let diffLines;
- const getDiffFileMock = () => Object.assign({}, diffFileMockData);
-
- beforeEach(() => {
- diffFile = getDiffFileMock();
- diffLines = diffFile.highlighted_diff_lines;
-
- component = createComponentWithStore(Vue.extend(DiffLineNoteForm), createStore(), {
- diffFileHash: diffFile.file_hash,
- diffLines,
- line: diffLines[0],
- noteTargetLine: diffLines[0],
- });
-
- Object.defineProperties(component, {
- noteableData: { value: noteableDataMock },
- isLoggedIn: { value: true },
- });
-
- component.$mount();
- });
-
- describe('methods', () => {
- describe('handleCancelCommentForm', () => {
- it('should ask for confirmation when shouldConfirm and isDirty passed as truthy', () => {
- spyOn(window, 'confirm').and.returnValue(false);
-
- component.handleCancelCommentForm(true, true);
-
- expect(window.confirm).toHaveBeenCalled();
- });
-
- it('should ask for confirmation when one of the params false', () => {
- spyOn(window, 'confirm').and.returnValue(false);
-
- component.handleCancelCommentForm(true, false);
-
- expect(window.confirm).not.toHaveBeenCalled();
-
- component.handleCancelCommentForm(false, true);
-
- expect(window.confirm).not.toHaveBeenCalled();
- });
-
- it('should call cancelCommentForm with lineCode', done => {
- spyOn(window, 'confirm');
- spyOn(component, 'cancelCommentForm');
- spyOn(component, 'resetAutoSave');
- component.handleCancelCommentForm();
-
- expect(window.confirm).not.toHaveBeenCalled();
- component.$nextTick(() => {
- expect(component.cancelCommentForm).toHaveBeenCalledWith({
- lineCode: diffLines[0].line_code,
- fileHash: component.diffFileHash,
- });
-
- expect(component.resetAutoSave).toHaveBeenCalled();
-
- done();
- });
- });
- });
-
- describe('saveNoteForm', () => {
- it('should call saveNote action with proper params', done => {
- const saveDiffDiscussionSpy = spyOn(component, 'saveDiffDiscussion').and.returnValue(
- Promise.resolve(),
- );
- spyOnProperty(component, 'formData').and.returnValue('formData');
-
- component
- .handleSaveNote('note body')
- .then(() => {
- expect(saveDiffDiscussionSpy).toHaveBeenCalledWith({
- note: 'note body',
- formData: 'formData',
- });
- })
- .then(done)
- .catch(done.fail);
- });
- });
- });
-
- describe('mounted', () => {
- it('should init autosave', () => {
- const key = 'autosave/Note/Issue/98//DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1';
-
- expect(component.autosave).toBeDefined();
- expect(component.autosave.key).toEqual(key);
- });
- });
-
- describe('template', () => {
- it('should have note form', () => {
- const { $el } = component;
-
- expect($el.querySelector('.js-vue-textarea')).toBeDefined();
- expect($el.querySelector('.js-vue-issue-save')).toBeDefined();
- expect($el.querySelector('.js-vue-markdown-field')).toBeDefined();
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/file_row_stats_spec.js b/spec/javascripts/diffs/components/file_row_stats_spec.js
deleted file mode 100644
index 59c5e592a59..00000000000
--- a/spec/javascripts/diffs/components/file_row_stats_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import Vue from 'vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
-import FileRowStats from '~/diffs/components/file_row_stats.vue';
-
-describe('Diff file row stats', () => {
- let Component;
- let vm;
-
- beforeAll(() => {
- Component = Vue.extend(FileRowStats);
- });
-
- beforeEach(() => {
- vm = mountComponent(Component, {
- file: {
- addedLines: 20,
- removedLines: 10,
- },
- });
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- it('renders added lines count', () => {
- expect(vm.$el.querySelector('.cgreen').textContent).toContain('+20');
- });
-
- it('renders removed lines count', () => {
- expect(vm.$el.querySelector('.cred').textContent).toContain('-10');
- });
-});
diff --git a/spec/javascripts/diffs/components/image_diff_overlay_spec.js b/spec/javascripts/diffs/components/image_diff_overlay_spec.js
deleted file mode 100644
index c2e5c6c34aa..00000000000
--- a/spec/javascripts/diffs/components/image_diff_overlay_spec.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import ImageDiffOverlay from '~/diffs/components/image_diff_overlay.vue';
-import { createStore } from '~/mr_notes/stores';
-import { imageDiffDiscussions } from '../mock_data/diff_discussions';
-
-describe('Diffs image diff overlay component', () => {
- const dimensions = {
- width: 100,
- height: 200,
- };
- let Component;
- let vm;
-
- function createComponent(props = {}, extendStore = () => {}) {
- const store = createStore();
-
- extendStore(store);
-
- vm = createComponentWithStore(Component, store, {
- discussions: [...imageDiffDiscussions],
- fileHash: 'ABC',
- ...props,
- });
- }
-
- beforeAll(() => {
- Component = Vue.extend(ImageDiffOverlay);
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- it('renders comment badges', () => {
- createComponent();
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelectorAll('.js-image-badge').length).toBe(2);
- });
-
- it('renders index of discussion in badge', () => {
- createComponent();
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelectorAll('.js-image-badge')[0].textContent.trim()).toBe('1');
- expect(vm.$el.querySelectorAll('.js-image-badge')[1].textContent.trim()).toBe('2');
- });
-
- it('renders icon when showCommentIcon is true', () => {
- createComponent({ showCommentIcon: true });
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelector('.js-image-badge svg')).not.toBe(null);
- });
-
- it('sets badge comment positions', () => {
- createComponent();
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelectorAll('.js-image-badge')[0].style.left).toBe('10px');
- expect(vm.$el.querySelectorAll('.js-image-badge')[0].style.top).toBe('10px');
-
- expect(vm.$el.querySelectorAll('.js-image-badge')[1].style.left).toBe('5px');
- expect(vm.$el.querySelectorAll('.js-image-badge')[1].style.top).toBe('5px');
- });
-
- it('renders single badge for discussion object', () => {
- createComponent({
- discussions: {
- ...imageDiffDiscussions[0],
- },
- });
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelectorAll('.js-image-badge').length).toBe(1);
- });
-
- it('dispatches openDiffFileCommentForm when clicking overlay', () => {
- createComponent({ canComment: true });
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- spyOn(vm.$store, 'dispatch').and.stub();
-
- vm.$el.querySelector('.js-add-image-diff-note-button').click();
-
- expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/openDiffFileCommentForm', {
- fileHash: 'ABC',
- x: 0,
- y: 0,
- width: 100,
- height: 200,
- });
- });
-
- describe('toggle discussion', () => {
- it('disables buttons when shouldToggleDiscussion is false', () => {
- createComponent({ shouldToggleDiscussion: false });
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- expect(vm.$el.querySelector('.js-image-badge').hasAttribute('disabled')).toBe(true);
- });
-
- it('dispatches toggleDiscussion when clicking image badge', () => {
- createComponent();
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
-
- spyOn(vm.$store, 'dispatch').and.stub();
-
- vm.$el.querySelector('.js-image-badge').click();
-
- expect(vm.$store.dispatch).toHaveBeenCalledWith('toggleDiscussion', { discussionId: '1' });
- });
- });
-
- describe('comment form', () => {
- beforeEach(() => {
- createComponent({}, store => {
- store.state.diffs.commentForms.push({
- fileHash: 'ABC',
- x: 20,
- y: 10,
- });
- });
- spyOn(vm, 'getImageDimensions').and.returnValue(dimensions);
- vm.$mount();
- });
-
- it('renders comment form badge', () => {
- expect(vm.$el.querySelector('.comment-indicator')).not.toBe(null);
- });
-
- it('sets comment form badge position', () => {
- expect(vm.$el.querySelector('.comment-indicator').style.left).toBe('20px');
- expect(vm.$el.querySelector('.comment-indicator').style.top).toBe('10px');
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/inline_diff_expansion_row_spec.js b/spec/javascripts/diffs/components/inline_diff_expansion_row_spec.js
deleted file mode 100644
index 852b8c4fbfc..00000000000
--- a/spec/javascripts/diffs/components/inline_diff_expansion_row_spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createStore } from '~/mr_notes/stores';
-import InlineDiffExpansionRow from '~/diffs/components/inline_diff_expansion_row.vue';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('InlineDiffExpansionRow', () => {
- const matchLine = diffFileMockData.highlighted_diff_lines[5];
-
- const createComponent = (options = {}) => {
- const cmp = Vue.extend(InlineDiffExpansionRow);
- const defaults = {
- fileHash: diffFileMockData.file_hash,
- contextLinesPath: 'contextLinesPath',
- line: matchLine,
- isTop: false,
- isBottom: false,
- };
- const props = Object.assign({}, defaults, options);
-
- return createComponentWithStore(cmp, createStore(), props).$mount();
- };
-
- describe('template', () => {
- it('should render expansion row for match lines', () => {
- const vm = createComponent();
-
- expect(vm.$el.classList.contains('line_expansion')).toBe(true);
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/inline_diff_table_row_spec.js b/spec/javascripts/diffs/components/inline_diff_table_row_spec.js
deleted file mode 100644
index 392893eb695..00000000000
--- a/spec/javascripts/diffs/components/inline_diff_table_row_spec.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createStore } from '~/mr_notes/stores';
-import InlineDiffTableRow from '~/diffs/components/inline_diff_table_row.vue';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('InlineDiffTableRow', () => {
- let vm;
- const thisLine = diffFileMockData.highlighted_diff_lines[0];
-
- beforeEach(() => {
- vm = createComponentWithStore(Vue.extend(InlineDiffTableRow), createStore(), {
- line: thisLine,
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- }).$mount();
- });
-
- it('does not add hll class to line content when line does not match highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- expect(vm.$el.querySelector('.line_content').classList).not.toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('adds hll class to lineContent when line is the highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.highlightedRow = thisLine.line_code;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.$el.querySelector('.line_content').classList).toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- describe('sets coverage title and class', () => {
- it('for lines with coverage', done => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = thisLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 5 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage');
-
- expect(coverage.title).toContain('Test coverage: 5 hits');
- expect(coverage.classList).toContain('coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for lines without coverage', done => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = thisLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 0 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage');
-
- expect(coverage.title).toContain('No test coverage');
- expect(coverage.classList).toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for unknown lines', done => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.coverageFiles = {};
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage');
-
- expect(coverage.title).not.toContain('Coverage');
- expect(coverage.classList).not.toContain('coverage');
- expect(coverage.classList).not.toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/inline_diff_view_spec.js b/spec/javascripts/diffs/components/inline_diff_view_spec.js
deleted file mode 100644
index 76d88d4d9f0..00000000000
--- a/spec/javascripts/diffs/components/inline_diff_view_spec.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import Vue from 'vue';
-import '~/behaviors/markdown/render_gfm';
-import { createStore } from 'ee_else_ce/mr_notes/stores';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import InlineDiffView from '~/diffs/components/inline_diff_view.vue';
-import diffFileMockData from '../mock_data/diff_file';
-import discussionsMockData from '../mock_data/diff_discussions';
-
-describe('InlineDiffView', () => {
- let component;
- const getDiffFileMock = () => Object.assign({}, diffFileMockData);
- const getDiscussionsMockData = () => [Object.assign({}, discussionsMockData)];
- const notesLength = getDiscussionsMockData()[0].notes.length;
-
- beforeEach(done => {
- const diffFile = getDiffFileMock();
-
- const store = createStore();
-
- store.dispatch('diffs/setInlineDiffViewType');
- component = createComponentWithStore(Vue.extend(InlineDiffView), store, {
- diffFile,
- diffLines: diffFile.highlighted_diff_lines,
- }).$mount();
-
- Vue.nextTick(done);
- });
-
- describe('template', () => {
- it('should have rendered diff lines', () => {
- const el = component.$el;
-
- expect(el.querySelectorAll('tr.line_holder').length).toEqual(5);
- expect(el.querySelectorAll('tr.line_holder.new').length).toEqual(2);
- expect(el.querySelectorAll('tr.line_expansion.match').length).toEqual(1);
- expect(el.textContent.indexOf('Bad dates')).toBeGreaterThan(-1);
- });
-
- it('should render discussions', done => {
- const el = component.$el;
- component.diffLines[1].discussions = getDiscussionsMockData();
- component.diffLines[1].discussionsExpanded = true;
-
- Vue.nextTick(() => {
- expect(el.querySelectorAll('.notes_holder').length).toEqual(1);
- expect(el.querySelectorAll('.notes_holder .note').length).toEqual(notesLength + 1);
- expect(el.innerText.indexOf('comment 5')).toBeGreaterThan(-1);
- component.$store.dispatch('setInitialNotes', []);
-
- done();
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/parallel_diff_expansion_row_spec.js b/spec/javascripts/diffs/components/parallel_diff_expansion_row_spec.js
deleted file mode 100644
index f6a5a1096f3..00000000000
--- a/spec/javascripts/diffs/components/parallel_diff_expansion_row_spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createStore } from '~/mr_notes/stores';
-import ParallelDiffExpansionRow from '~/diffs/components/parallel_diff_expansion_row.vue';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('ParallelDiffExpansionRow', () => {
- const matchLine = diffFileMockData.highlighted_diff_lines[5];
-
- const createComponent = (options = {}) => {
- const cmp = Vue.extend(ParallelDiffExpansionRow);
- const defaults = {
- fileHash: diffFileMockData.file_hash,
- contextLinesPath: 'contextLinesPath',
- line: matchLine,
- isTop: false,
- isBottom: false,
- };
- const props = Object.assign({}, defaults, options);
-
- return createComponentWithStore(cmp, createStore(), props).$mount();
- };
-
- describe('template', () => {
- it('should render expansion row for match lines', () => {
- const vm = createComponent();
-
- expect(vm.$el.classList.contains('line_expansion')).toBe(true);
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/parallel_diff_table_row_spec.js b/spec/javascripts/diffs/components/parallel_diff_table_row_spec.js
deleted file mode 100644
index 4e69382ba03..00000000000
--- a/spec/javascripts/diffs/components/parallel_diff_table_row_spec.js
+++ /dev/null
@@ -1,147 +0,0 @@
-import Vue from 'vue';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import { createStore } from '~/mr_notes/stores';
-import ParallelDiffTableRow from '~/diffs/components/parallel_diff_table_row.vue';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('ParallelDiffTableRow', () => {
- describe('when one side is empty', () => {
- let vm;
- const thisLine = diffFileMockData.parallel_diff_lines[0];
- const rightLine = diffFileMockData.parallel_diff_lines[0].right;
-
- beforeEach(() => {
- vm = createComponentWithStore(Vue.extend(ParallelDiffTableRow), createStore(), {
- line: thisLine,
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- }).$mount();
- });
-
- it('does not highlight non empty line content when line does not match highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).not.toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('highlights nonempty line content when line is the highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.highlightedRow = rightLine.line_code;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
- });
-
- describe('when both sides have content', () => {
- let vm;
- const thisLine = diffFileMockData.parallel_diff_lines[2];
- const rightLine = diffFileMockData.parallel_diff_lines[2].right;
-
- beforeEach(() => {
- vm = createComponentWithStore(Vue.extend(ParallelDiffTableRow), createStore(), {
- line: thisLine,
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- }).$mount();
- });
-
- it('does not highlight either line when line does not match highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).not.toContain('hll');
- expect(vm.$el.querySelector('.line_content.left-side').classList).not.toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('adds hll class to lineContent when line is the highlighted row', done => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.highlightedRow = rightLine.line_code;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).toContain('hll');
- expect(vm.$el.querySelector('.line_content.left-side').classList).toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- describe('sets coverage title and class', () => {
- it('for lines with coverage', done => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = rightLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 5 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).toContain('Test coverage: 5 hits');
- expect(coverage.classList).toContain('coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for lines without coverage', done => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = rightLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 0 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).toContain('No test coverage');
- expect(coverage.classList).toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for unknown lines', done => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.coverageFiles = {};
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).not.toContain('Coverage');
- expect(coverage.classList).not.toContain('coverage');
- expect(coverage.classList).not.toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/components/parallel_diff_view_spec.js b/spec/javascripts/diffs/components/parallel_diff_view_spec.js
deleted file mode 100644
index 7daca25719b..00000000000
--- a/spec/javascripts/diffs/components/parallel_diff_view_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import Vue from 'vue';
-import { createStore } from 'ee_else_ce/mr_notes/stores';
-import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
-import ParallelDiffView from '~/diffs/components/parallel_diff_view.vue';
-import * as constants from '~/diffs/constants';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('ParallelDiffView', () => {
- let component;
- const getDiffFileMock = () => Object.assign({}, diffFileMockData);
-
- beforeEach(() => {
- const diffFile = getDiffFileMock();
-
- component = createComponentWithStore(Vue.extend(ParallelDiffView), createStore(), {
- diffFile,
- diffLines: diffFile.parallel_diff_lines,
- }).$mount();
- });
-
- afterEach(() => {
- component.$destroy();
- });
-
- describe('assigned', () => {
- describe('diffLines', () => {
- it('should normalize lines for empty cells', () => {
- expect(component.diffLines[0].left.type).toEqual(constants.EMPTY_CELL_TYPE);
- expect(component.diffLines[1].left.type).toEqual(constants.EMPTY_CELL_TYPE);
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/create_diffs_store.js b/spec/javascripts/diffs/create_diffs_store.js
index cfefd4238b8..9df057dd8b2 100644
--- a/spec/javascripts/diffs/create_diffs_store.js
+++ b/spec/javascripts/diffs/create_diffs_store.js
@@ -1 +1,5 @@
+// No new code should be added to this file. Instead, modify the
+// file this one re-exports from. For more detail about why, see:
+// https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/31349
+
export { default } from '../../frontend/diffs/create_diffs_store';
diff --git a/spec/javascripts/diffs/mock_data/diff_discussions.js b/spec/javascripts/diffs/mock_data/diff_discussions.js
index dc25dd1647a..17586fddd0f 100644
--- a/spec/javascripts/diffs/mock_data/diff_discussions.js
+++ b/spec/javascripts/diffs/mock_data/diff_discussions.js
@@ -1,534 +1,5 @@
-export default {
- id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- reply_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- position: {
- old_line: null,
- new_line: 2,
- old_path: 'CHANGELOG',
- new_path: 'CHANGELOG',
- base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- },
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
- expanded: true,
- notes: [
- {
- id: '1749',
- type: 'DiffNote',
- attachment: null,
- author: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- created_at: '2018-04-03T21:06:21.521Z',
- updated_at: '2018-04-08T08:50:41.762Z',
- system: false,
- noteable_id: 51,
- noteable_type: 'MergeRequest',
- noteable_iid: 20,
- human_access: 'Owner',
- note: 'comment 1',
- note_html: '<p dir="auto">comment 1</p>',
- last_edited_at: '2018-04-08T08:50:41.762Z',
- last_edited_by: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- current_user: {
- can_edit: true,
- can_award_emoji: true,
- },
- resolved: false,
- resolvable: true,
- resolved_by: null,
- discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- emoji_awardable: true,
- award_emoji: [],
- toggle_award_path: '/gitlab-org/gitlab-test/notes/1749/toggle_award_emoji',
- report_abuse_path:
- '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1749&user_id=1',
- path: '/gitlab-org/gitlab-test/notes/1749',
- noteable_note_url:
- 'http://localhost:3000/gitlab-org/gitlab-test/-/merge_requests/20#note_1749',
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- },
- {
- id: '1753',
- type: 'DiffNote',
- attachment: null,
- author: {
- id: 1,
- name: 'Fatih Acet',
- username: 'fatihacet',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/fatihacevt',
- },
- created_at: '2018-04-08T08:49:35.804Z',
- updated_at: '2018-04-08T08:50:45.915Z',
- system: false,
- noteable_id: 51,
- noteable_type: 'MergeRequest',
- noteable_iid: 20,
- human_access: 'Owner',
- note: 'comment 2 is really long one',
- note_html: '<p dir="auto">comment 2 is really long one</p>',
- last_edited_at: '2018-04-08T08:50:45.915Z',
- last_edited_by: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- current_user: {
- can_edit: true,
- can_award_emoji: true,
- },
- resolved: false,
- resolvable: true,
- resolved_by: null,
- discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- emoji_awardable: true,
- award_emoji: [],
- toggle_award_path: '/gitlab-org/gitlab-test/notes/1753/toggle_award_emoji',
- report_abuse_path:
- '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1753&user_id=1',
- path: '/gitlab-org/gitlab-test/notes/1753',
- noteable_note_url:
- 'http://localhost:3000/gitlab-org/gitlab-test/-/merge_requests/20#note_1753',
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- },
- {
- id: '1754',
- type: 'DiffNote',
- attachment: null,
- author: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- created_at: '2018-04-08T08:50:48.294Z',
- updated_at: '2018-04-08T08:50:48.294Z',
- system: false,
- noteable_id: 51,
- noteable_type: 'MergeRequest',
- noteable_iid: 20,
- human_access: 'Owner',
- note: 'comment 3',
- note_html: '<p dir="auto">comment 3</p>',
- current_user: {
- can_edit: true,
- can_award_emoji: true,
- },
- resolved: false,
- resolvable: true,
- resolved_by: null,
- discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- emoji_awardable: true,
- award_emoji: [],
- toggle_award_path: '/gitlab-org/gitlab-test/notes/1754/toggle_award_emoji',
- report_abuse_path:
- '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1754&user_id=1',
- path: '/gitlab-org/gitlab-test/notes/1754',
- noteable_note_url:
- 'http://localhost:3000/gitlab-org/gitlab-test/-/merge_requests/20#note_1754',
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- },
- {
- id: '1755',
- type: 'DiffNote',
- attachment: null,
- author: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- created_at: '2018-04-08T08:50:50.911Z',
- updated_at: '2018-04-08T08:50:50.911Z',
- system: false,
- noteable_id: 51,
- noteable_type: 'MergeRequest',
- noteable_iid: 20,
- human_access: 'Owner',
- note: 'comment 4',
- note_html: '<p dir="auto">comment 4</p>',
- current_user: {
- can_edit: true,
- can_award_emoji: true,
- },
- resolved: false,
- resolvable: true,
- resolved_by: null,
- discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- emoji_awardable: true,
- award_emoji: [],
- toggle_award_path: '/gitlab-org/gitlab-test/notes/1755/toggle_award_emoji',
- report_abuse_path:
- '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1755&user_id=1',
- path: '/gitlab-org/gitlab-test/notes/1755',
- noteable_note_url:
- 'http://localhost:3000/gitlab-org/gitlab-test/-/merge_requests/20#note_1755',
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- },
- {
- id: '1756',
- type: 'DiffNote',
- attachment: null,
- author: {
- id: 1,
- name: 'Administrator',
- username: 'root',
- state: 'active',
- avatar_url:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- path: '/root',
- },
- created_at: '2018-04-08T08:50:53.895Z',
- updated_at: '2018-04-08T08:50:53.895Z',
- system: false,
- noteable_id: 51,
- noteable_type: 'MergeRequest',
- noteable_iid: 20,
- human_access: 'Owner',
- note: 'comment 5',
- note_html: '<p dir="auto">comment 5</p>',
- current_user: {
- can_edit: true,
- can_award_emoji: true,
- },
- resolved: false,
- resolvable: true,
- resolved_by: null,
- discussion_id: '6b232e05bea388c6b043ccc243ba505faac04ea8',
- emoji_awardable: true,
- award_emoji: [],
- toggle_award_path: '/gitlab-org/gitlab-test/notes/1756/toggle_award_emoji',
- report_abuse_path:
- '/abuse_reports/new?ref_url=http%3A%2F%2Flocalhost%3A3000%2Fgitlab-org%2Fgitlab-test%2Fmerge_requests%2F20%23note_1756&user_id=1',
- path: '/gitlab-org/gitlab-test/notes/1756',
- noteable_note_url:
- 'http://localhost:3000/gitlab-org/gitlab-test/-/merge_requests/20#note_1756',
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- },
- ],
- individual_note: false,
- resolvable: true,
- resolved: false,
- resolve_path:
- '/gitlab-org/gitlab-test/-/merge_requests/20/discussions/6b232e05bea388c6b043ccc243ba505faac04ea8/resolve',
- resolve_with_issue_path:
- '/gitlab-org/gitlab-test/-/issues/new?discussion_to_resolve=6b232e05bea388c6b043ccc243ba505faac04ea8&merge_request_to_resolve_discussions_of=20',
- diff_file: {
- submodule: false,
- submodule_link: null,
- blob: {
- id: '9e10516ca50788acf18c518a231914a21e5f16f7',
- path: 'CHANGELOG',
- name: 'CHANGELOG',
- mode: '100644',
- readable_text: true,
- icon: 'file-text-o',
- },
- blob_path: 'CHANGELOG',
- blob_name: 'CHANGELOG',
- blob_icon: '<i aria-hidden="true" data-hidden="true" class="fa fa-file-text-o fa-fw"></i>',
- file_hash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a',
- file_path: 'CHANGELOG.rb',
- new_file: false,
- deleted_file: false,
- renamed_file: false,
- old_path: 'CHANGELOG',
- new_path: 'CHANGELOG',
- mode_changed: false,
- a_mode: '100644',
- b_mode: '100644',
- text: true,
- added_lines: 2,
- removed_lines: 0,
- diff_refs: {
- base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- },
- content_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- stored_externally: null,
- external_storage: null,
- old_path_html: 'CHANGELOG_OLD',
- new_path_html: 'CHANGELOG',
- is_fully_expanded: true,
- context_lines_path:
- '/gitlab-org/gitlab-test/blob/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG/diff',
- highlighted_diff_lines: [
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
- type: 'new',
- old_line: null,
- new_line: 1,
- text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
- type: 'new',
- old_line: null,
- new_line: 2,
- text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- ],
- parallel_diff_lines: [
- {
- left: null,
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
- type: 'new',
- old_line: null,
- new_line: 1,
- text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- },
- },
- {
- left: null,
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
- type: 'new',
- old_line: null,
- new_line: 2,
- text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- right: {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- },
- ],
- viewer: {
- name: 'text',
- error: null,
- },
- },
- diff_discussion: true,
- truncated_diff_lines: [
- {
- text: 'line',
- rich_text:
- '<tr class="line_holder new" id="">\n<td class="diff-line-num new old_line" data-linenumber="1">\n \n</td>\n<td class="diff-line-num new new_line" data-linenumber="1">\n1\n</td>\n<td class="line_content new"><span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n</td>\n</tr>\n<tr class="line_holder new" id="">\n<td class="diff-line-num new old_line" data-linenumber="1">\n \n</td>\n<td class="diff-line-num new new_line" data-linenumber="2">\n2\n</td>\n<td class="line_content new"><span id="LC2" class="line" lang="plaintext"></span>\n</td>\n</tr>\n',
- can_receive_suggestion: true,
- line_code: '6f209374f7e565f771b95720abf46024c41d1885_1_1',
- type: 'new',
- old_line: null,
- new_line: 1,
- meta_data: null,
- },
- ],
-};
+// No new code should be added to this file. Instead, modify the
+// file this one re-exports from. For more detail about why, see:
+// https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/31349
-export const imageDiffDiscussions = [
- {
- id: '1',
- position: {
- x: 10,
- y: 10,
- width: 100,
- height: 200,
- },
- },
- {
- id: '2',
- position: {
- x: 5,
- y: 5,
- width: 100,
- height: 200,
- },
- },
-];
+export { default } from '../../../frontend/diffs/mock_data/diff_discussions';
diff --git a/spec/javascripts/diffs/mock_data/diff_file_unreadable.js b/spec/javascripts/diffs/mock_data/diff_file_unreadable.js
index 8c2df45988e..09a0dc61847 100644
--- a/spec/javascripts/diffs/mock_data/diff_file_unreadable.js
+++ b/spec/javascripts/diffs/mock_data/diff_file_unreadable.js
@@ -1,244 +1,5 @@
-export default {
- submodule: false,
- submodule_link: null,
- blob: {
- id: '9e10516ca50788acf18c518a231914a21e5f16f7',
- path: 'CHANGELOG',
- name: 'CHANGELOG',
- mode: '100644',
- readable_text: false,
- icon: 'file-text-o',
- },
- blob_path: 'CHANGELOG',
- blob_name: 'CHANGELOG',
- blob_icon: '<i aria-hidden="true" data-hidden="true" class="fa fa-file-text-o fa-fw"></i>',
- file_hash: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a',
- file_path: 'CHANGELOG',
- new_file: false,
- deleted_file: false,
- renamed_file: false,
- old_path: 'CHANGELOG',
- new_path: 'CHANGELOG',
- mode_changed: false,
- a_mode: '100644',
- b_mode: '100644',
- text: true,
- viewer: {
- name: 'text',
- error: null,
- collapsed: false,
- },
- added_lines: 0,
- removed_lines: 0,
- diff_refs: {
- base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- },
- content_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- stored_externally: null,
- external_storage: null,
- old_path_html: 'CHANGELOG',
- new_path_html: 'CHANGELOG',
- edit_path: '/gitlab-org/gitlab-test/edit/spooky-stuff/CHANGELOG',
- view_path: '/gitlab-org/gitlab-test/blob/spooky-stuff/CHANGELOG',
- replaced_view_path: null,
- collapsed: false,
- renderIt: false,
- too_large: false,
- context_lines_path:
- '/gitlab-org/gitlab-test/blob/c48ee0d1bf3b30453f5b32250ce03134beaa6d13/CHANGELOG/diff',
- highlighted_diff_lines: [
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
- type: 'new',
- old_line: null,
- new_line: 1,
- discussions: [],
- text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
- type: 'new',
- old_line: null,
- new_line: 2,
- discussions: [],
- text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- rich_text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- discussions: [],
- text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- discussions: [],
- text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- discussions: [],
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- discussions: [],
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- ],
- parallel_diff_lines: [
- {
- left: {
- type: 'empty-cell',
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1',
- type: 'new',
- old_line: null,
- new_line: 1,
- discussions: [],
- text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- type: 'empty-cell',
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
- type: 'new',
- old_line: null,
- new_line: 2,
- discussions: [],
- text: '+<span id="LC2" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC2" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_Code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- discussions: [],
- text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- type: null,
- old_line: 1,
- new_line: 3,
- discussions: [],
- text: ' <span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- rich_text: '<span id="LC3" class="line" lang="plaintext">v6.8.0</span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- discussions: [],
- text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_2_4',
- type: null,
- old_line: 2,
- new_line: 4,
- discussions: [],
- text: ' <span id="LC4" class="line" lang="plaintext"></span>\n',
- rich_text: '<span id="LC4" class="line" lang="plaintext"></span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- discussions: [],
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- right: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_3_5',
- type: null,
- old_line: 3,
- new_line: 5,
- discussions: [],
- text: ' <span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- rich_text: '<span id="LC5" class="line" lang="plaintext">v6.7.0</span>\n',
- meta_data: null,
- },
- },
- {
- left: {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- discussions: [],
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- right: {
- line_code: null,
- type: 'match',
- old_line: null,
- new_line: null,
- discussions: [],
- text: '',
- rich_text: '',
- meta_data: {
- old_pos: 3,
- new_pos: 5,
- },
- },
- },
- ],
- discussions: [],
- renderingLines: false,
-};
+// No new code should be added to this file. Instead, modify the
+// file this one re-exports from. For more detail about why, see:
+// https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/31349
+
+export { default } from '../../../frontend/diffs/mock_data/diff_file_unreadable';
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();
- },
- );
- });
- });
-});
diff --git a/spec/javascripts/diffs/store/getters_spec.js b/spec/javascripts/diffs/store/getters_spec.js
deleted file mode 100644
index ca47f51cb15..00000000000
--- a/spec/javascripts/diffs/store/getters_spec.js
+++ /dev/null
@@ -1,315 +0,0 @@
-import * as getters from '~/diffs/store/getters';
-import state from '~/diffs/store/modules/diff_state';
-import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
-import discussion from '../mock_data/diff_discussions';
-
-describe('Diffs Module Getters', () => {
- let localState;
- let discussionMock;
- let discussionMock1;
-
- const diffFileMock = {
- fileHash: '9732849daca6ae818696d9575f5d1207d1a7f8bb',
- };
-
- beforeEach(() => {
- localState = state();
- discussionMock = Object.assign({}, discussion);
- discussionMock.diff_file.file_hash = diffFileMock.fileHash;
-
- discussionMock1 = Object.assign({}, discussion);
- discussionMock1.diff_file.file_hash = diffFileMock.fileHash;
- });
-
- describe('isParallelView', () => {
- it('should return true if view set to parallel view', () => {
- localState.diffViewType = PARALLEL_DIFF_VIEW_TYPE;
-
- expect(getters.isParallelView(localState)).toEqual(true);
- });
-
- it('should return false if view not to parallel view', () => {
- localState.diffViewType = INLINE_DIFF_VIEW_TYPE;
-
- expect(getters.isParallelView(localState)).toEqual(false);
- });
- });
-
- describe('isInlineView', () => {
- it('should return true if view set to inline view', () => {
- localState.diffViewType = INLINE_DIFF_VIEW_TYPE;
-
- expect(getters.isInlineView(localState)).toEqual(true);
- });
-
- it('should return false if view not to inline view', () => {
- localState.diffViewType = PARALLEL_DIFF_VIEW_TYPE;
-
- expect(getters.isInlineView(localState)).toEqual(false);
- });
- });
-
- describe('hasCollapsedFile', () => {
- it('returns true when all files are collapsed', () => {
- localState.diffFiles = [{ viewer: { collapsed: true } }, { viewer: { collapsed: true } }];
-
- expect(getters.hasCollapsedFile(localState)).toEqual(true);
- });
-
- it('returns true when at least one file is collapsed', () => {
- localState.diffFiles = [{ viewer: { collapsed: false } }, { viewer: { collapsed: true } }];
-
- expect(getters.hasCollapsedFile(localState)).toEqual(true);
- });
- });
-
- describe('commitId', () => {
- it('returns commit id when is set', () => {
- const commitID = '800f7a91';
- localState.commit = {
- id: commitID,
- };
-
- expect(getters.commitId(localState)).toEqual(commitID);
- });
-
- it('returns null when no commit is set', () => {
- expect(getters.commitId(localState)).toEqual(null);
- });
- });
-
- describe('diffHasAllExpandedDiscussions', () => {
- it('returns true when all discussions are expanded', () => {
- expect(
- getters.diffHasAllExpandedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock, discussionMock],
- })(diffFileMock),
- ).toEqual(true);
- });
-
- it('returns false when there are no discussions', () => {
- expect(
- getters.diffHasAllExpandedDiscussions(localState, {
- getDiffFileDiscussions: () => [],
- })(diffFileMock),
- ).toEqual(false);
- });
-
- it('returns false when one discussions is collapsed', () => {
- discussionMock1.expanded = false;
-
- expect(
- getters.diffHasAllExpandedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock, discussionMock1],
- })(diffFileMock),
- ).toEqual(false);
- });
- });
-
- describe('diffHasAllCollapsedDiscussions', () => {
- it('returns true when all discussions are collapsed', () => {
- discussionMock.diff_file.file_hash = diffFileMock.fileHash;
- discussionMock.expanded = false;
-
- expect(
- getters.diffHasAllCollapsedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock],
- })(diffFileMock),
- ).toEqual(true);
- });
-
- it('returns false when there are no discussions', () => {
- expect(
- getters.diffHasAllCollapsedDiscussions(localState, {
- getDiffFileDiscussions: () => [],
- })(diffFileMock),
- ).toEqual(false);
- });
-
- it('returns false when one discussions is expanded', () => {
- discussionMock1.expanded = false;
-
- expect(
- getters.diffHasAllCollapsedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock, discussionMock1],
- })(diffFileMock),
- ).toEqual(false);
- });
- });
-
- describe('diffHasExpandedDiscussions', () => {
- it('returns true when one of the discussions is expanded', () => {
- discussionMock1.expanded = false;
-
- expect(
- getters.diffHasExpandedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock, discussionMock],
- })(diffFileMock),
- ).toEqual(true);
- });
-
- it('returns false when there are no discussions', () => {
- expect(
- getters.diffHasExpandedDiscussions(localState, { getDiffFileDiscussions: () => [] })(
- diffFileMock,
- ),
- ).toEqual(false);
- });
-
- it('returns false when no discussion is expanded', () => {
- discussionMock.expanded = false;
- discussionMock1.expanded = false;
-
- expect(
- getters.diffHasExpandedDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock, discussionMock1],
- })(diffFileMock),
- ).toEqual(false);
- });
- });
-
- describe('diffHasDiscussions', () => {
- it('returns true when getDiffFileDiscussions returns discussions', () => {
- expect(
- getters.diffHasDiscussions(localState, {
- getDiffFileDiscussions: () => [discussionMock],
- })(diffFileMock),
- ).toEqual(true);
- });
-
- it('returns false when getDiffFileDiscussions returns no discussions', () => {
- expect(
- getters.diffHasDiscussions(localState, {
- getDiffFileDiscussions: () => [],
- })(diffFileMock),
- ).toEqual(false);
- });
- });
-
- describe('getDiffFileDiscussions', () => {
- it('returns an array with discussions when fileHash matches and the discussion belongs to a diff', () => {
- discussionMock.diff_file.file_hash = diffFileMock.file_hash;
-
- expect(
- getters.getDiffFileDiscussions(localState, {}, {}, { discussions: [discussionMock] })(
- diffFileMock,
- ).length,
- ).toEqual(1);
- });
-
- it('returns an empty array when no discussions are found in the given diff', () => {
- expect(
- getters.getDiffFileDiscussions(localState, {}, {}, { discussions: [] })(diffFileMock)
- .length,
- ).toEqual(0);
- });
- });
-
- describe('getDiffFileByHash', () => {
- it('returns file by hash', () => {
- const fileA = {
- file_hash: '123',
- };
- const fileB = {
- file_hash: '456',
- };
- localState.diffFiles = [fileA, fileB];
-
- expect(getters.getDiffFileByHash(localState)('456')).toEqual(fileB);
- });
-
- it('returns null if no matching file is found', () => {
- localState.diffFiles = [];
-
- expect(getters.getDiffFileByHash(localState)('123')).toBeUndefined();
- });
- });
-
- describe('allBlobs', () => {
- it('returns an array of blobs', () => {
- localState.treeEntries = {
- file: {
- type: 'blob',
- path: 'file',
- parentPath: '/',
- tree: [],
- },
- tree: {
- type: 'tree',
- path: 'tree',
- parentPath: '/',
- tree: [],
- },
- };
-
- expect(
- getters.allBlobs(localState, {
- flatBlobsList: getters.flatBlobsList(localState),
- }),
- ).toEqual([
- {
- isHeader: true,
- path: '/',
- tree: [
- {
- parentPath: '/',
- path: 'file',
- tree: [],
- type: 'blob',
- },
- ],
- },
- ]);
- });
- });
-
- describe('currentDiffIndex', () => {
- it('returns index of currently selected diff in diffList', () => {
- localState.diffFiles = [{ file_hash: '111' }, { file_hash: '222' }, { file_hash: '333' }];
- localState.currentDiffFileId = '222';
-
- expect(getters.currentDiffIndex(localState)).toEqual(1);
-
- localState.currentDiffFileId = '333';
-
- expect(getters.currentDiffIndex(localState)).toEqual(2);
- });
-
- it('returns 0 if no diff is selected yet or diff is not found', () => {
- localState.diffFiles = [{ file_hash: '111' }, { file_hash: '222' }, { file_hash: '333' }];
- localState.currentDiffFileId = '';
-
- expect(getters.currentDiffIndex(localState)).toEqual(0);
- });
- });
-
- describe('fileLineCoverage', () => {
- beforeEach(() => {
- Object.assign(localState.coverageFiles, { files: { 'app.js': { '1': 0, '2': 5 } } });
- });
-
- it('returns empty object when no coverage data is available', () => {
- Object.assign(localState.coverageFiles, {});
-
- expect(getters.fileLineCoverage(localState)('test.js', 2)).toEqual({});
- });
-
- it('returns empty object when unknown filename is passed', () => {
- expect(getters.fileLineCoverage(localState)('test.js', 2)).toEqual({});
- });
-
- it('returns no-coverage info when correct filename and line is passed', () => {
- expect(getters.fileLineCoverage(localState)('app.js', 1)).toEqual({
- text: 'No test coverage',
- class: 'no-coverage',
- });
- });
-
- it('returns coverage info when correct filename and line is passed', () => {
- expect(getters.fileLineCoverage(localState)('app.js', 2)).toEqual({
- text: 'Test coverage: 5 hits',
- class: 'coverage',
- });
- });
- });
-});
diff --git a/spec/javascripts/diffs/store/mutations_spec.js b/spec/javascripts/diffs/store/mutations_spec.js
deleted file mode 100644
index c36aff39aa9..00000000000
--- a/spec/javascripts/diffs/store/mutations_spec.js
+++ /dev/null
@@ -1,965 +0,0 @@
-import createState from '~/diffs/store/modules/diff_state';
-import mutations from '~/diffs/store/mutations';
-import * as types from '~/diffs/store/mutation_types';
-import { INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('DiffsStoreMutations', () => {
- describe('SET_BASE_CONFIG', () => {
- it('should set endpoint and project path', () => {
- const state = {};
- const endpoint = '/diffs/endpoint';
- const projectPath = '/root/project';
- const useSingleDiffStyle = false;
-
- mutations[types.SET_BASE_CONFIG](state, { endpoint, projectPath, useSingleDiffStyle });
-
- expect(state.endpoint).toEqual(endpoint);
- expect(state.projectPath).toEqual(projectPath);
- expect(state.useSingleDiffStyle).toEqual(useSingleDiffStyle);
- });
- });
-
- describe('SET_LOADING', () => {
- it('should set loading state', () => {
- const state = {};
-
- mutations[types.SET_LOADING](state, false);
-
- expect(state.isLoading).toEqual(false);
- });
- });
-
- describe('SET_BATCH_LOADING', () => {
- it('should set loading state', () => {
- const state = {};
-
- mutations[types.SET_BATCH_LOADING](state, false);
-
- expect(state.isBatchLoading).toEqual(false);
- });
- });
-
- describe('SET_RETRIEVING_BATCHES', () => {
- it('should set retrievingBatches state', () => {
- const state = {};
-
- mutations[types.SET_RETRIEVING_BATCHES](state, false);
-
- expect(state.retrievingBatches).toEqual(false);
- });
- });
-
- describe('SET_DIFF_DATA', () => {
- it('should set diff data type properly', () => {
- const state = {
- diffFiles: [
- {
- ...diffFileMockData,
- parallel_diff_lines: [],
- },
- ],
- };
- const diffMock = {
- diff_files: [diffFileMockData],
- };
-
- mutations[types.SET_DIFF_DATA](state, diffMock);
-
- const firstLine = state.diffFiles[0].parallel_diff_lines[0];
-
- expect(firstLine.right.text).toBeUndefined();
- expect(state.diffFiles.length).toEqual(1);
- expect(state.diffFiles[0].renderIt).toEqual(true);
- expect(state.diffFiles[0].collapsed).toEqual(false);
- });
-
- describe('given diffsBatchLoad feature flag is enabled', () => {
- beforeEach(() => {
- gon.features = { diffsBatchLoad: true };
- });
-
- afterEach(() => {
- delete gon.features;
- });
-
- it('should not modify the existing state', () => {
- const state = {
- diffFiles: [
- {
- content_sha: diffFileMockData.content_sha,
- file_hash: diffFileMockData.file_hash,
- highlighted_diff_lines: [],
- },
- ],
- };
- const diffMock = {
- diff_files: [diffFileMockData],
- };
-
- mutations[types.SET_DIFF_DATA](state, diffMock);
-
- // If the batch load is enabled, there shouldn't be any processing
- // done on the existing state object, so we shouldn't have this.
- expect(state.diffFiles[0].parallel_diff_lines).toBeUndefined();
- });
- });
- });
-
- describe('SET_DIFFSET_DIFF_DATA_BATCH_DATA', () => {
- it('should set diff data batch type properly', () => {
- const state = { diffFiles: [] };
- const diffMock = {
- diff_files: [diffFileMockData],
- };
-
- mutations[types.SET_DIFF_DATA_BATCH](state, diffMock);
-
- const firstLine = state.diffFiles[0].parallel_diff_lines[0];
-
- expect(firstLine.right.text).toBeUndefined();
- expect(state.diffFiles[0].renderIt).toEqual(true);
- expect(state.diffFiles[0].collapsed).toEqual(false);
- });
- });
-
- describe('SET_COVERAGE_DATA', () => {
- it('should set coverage data properly', () => {
- const state = { coverageFiles: {} };
- const coverage = { 'app.js': { '1': 0, '2': 1 } };
-
- mutations[types.SET_COVERAGE_DATA](state, coverage);
-
- expect(state.coverageFiles).toEqual(coverage);
- });
- });
-
- describe('SET_DIFF_VIEW_TYPE', () => {
- it('should set diff view type properly', () => {
- const state = {};
-
- mutations[types.SET_DIFF_VIEW_TYPE](state, INLINE_DIFF_VIEW_TYPE);
-
- expect(state.diffViewType).toEqual(INLINE_DIFF_VIEW_TYPE);
- });
- });
-
- describe('EXPAND_ALL_FILES', () => {
- it('should change the collapsed prop from diffFiles', () => {
- const diffFile = {
- viewer: {
- collapsed: true,
- },
- };
- const state = { expandAllFiles: true, diffFiles: [diffFile] };
-
- mutations[types.EXPAND_ALL_FILES](state);
-
- expect(state.diffFiles[0].viewer.collapsed).toEqual(false);
- });
- });
-
- describe('ADD_CONTEXT_LINES', () => {
- it('should call utils.addContextLines with proper params', () => {
- const options = {
- lineNumbers: { oldLineNumber: 1, newLineNumber: 2 },
- contextLines: [
- { old_line: 1, new_line: 1, line_code: 'ff9200_1_1', discussions: [], hasForm: false },
- ],
- fileHash: 'ff9200',
- params: {
- bottom: true,
- },
- isExpandDown: false,
- nextLineNumbers: {},
- };
- const diffFile = {
- file_hash: options.fileHash,
- highlighted_diff_lines: [],
- parallel_diff_lines: [],
- };
- const state = { diffFiles: [diffFile], diffViewType: 'viewType' };
- const lines = [{ old_line: 1, new_line: 1 }];
-
- const findDiffFileSpy = spyOnDependency(mutations, 'findDiffFile').and.returnValue(diffFile);
- const removeMatchLineSpy = spyOnDependency(mutations, 'removeMatchLine');
- const lineRefSpy = spyOnDependency(mutations, 'addLineReferences').and.returnValue(lines);
- const addContextLinesSpy = spyOnDependency(mutations, 'addContextLines');
-
- mutations[types.ADD_CONTEXT_LINES](state, options);
-
- expect(findDiffFileSpy).toHaveBeenCalledWith(state.diffFiles, options.fileHash);
- expect(removeMatchLineSpy).toHaveBeenCalledWith(
- diffFile,
- options.lineNumbers,
- options.params.bottom,
- );
-
- expect(lineRefSpy).toHaveBeenCalledWith(
- options.contextLines,
- options.lineNumbers,
- options.params.bottom,
- options.isExpandDown,
- options.nextLineNumbers,
- );
-
- expect(addContextLinesSpy).toHaveBeenCalledWith({
- inlineLines: diffFile.highlighted_diff_lines,
- parallelLines: diffFile.parallel_diff_lines,
- diffViewType: 'viewType',
- contextLines: options.contextLines,
- bottom: options.params.bottom,
- lineNumbers: options.lineNumbers,
- isExpandDown: false,
- });
- });
- });
-
- describe('ADD_COLLAPSED_DIFFS', () => {
- it('should update the state with the given data for the given file hash', () => {
- const fileHash = 123;
- const state = {
- diffFiles: [{}, { content_sha: 'abc', file_hash: fileHash, existing_field: 0 }],
- };
- const data = {
- diff_files: [
- {
- content_sha: 'abc',
- file_hash: fileHash,
- extra_field: 1,
- existing_field: 1,
- viewer: { name: 'text' },
- },
- ],
- };
-
- mutations[types.ADD_COLLAPSED_DIFFS](state, { file: state.diffFiles[1], data });
-
- expect(state.diffFiles[1].file_hash).toEqual(fileHash);
- expect(state.diffFiles[1].existing_field).toEqual(1);
- expect(state.diffFiles[1].extra_field).toEqual(1);
- });
- });
-
- describe('SET_LINE_DISCUSSIONS_FOR_FILE', () => {
- it('should add discussions to the given line', () => {
- const diffPosition = {
- base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- new_line: null,
- new_path: '500-lines-4.txt',
- old_line: 5,
- old_path: '500-lines-4.txt',
- start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- };
-
- const state = {
- latestDiff: true,
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1',
- discussions: [],
- },
- right: {
- line_code: 'ABC_2',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [],
- },
- ],
- },
- ],
- };
- const discussion = {
- id: 1,
- line_code: 'ABC_1',
- diff_discussion: true,
- resolvable: true,
- original_position: diffPosition,
- position: diffPosition,
- diff_file: {
- file_hash: state.diffFiles[0].file_hash,
- },
- };
-
- const diffPositionByLineCode = {
- ABC_1: diffPosition,
- };
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].right.discussions).toEqual([]);
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
- });
-
- it('should not duplicate discussions on line', () => {
- const diffPosition = {
- base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- new_line: null,
- new_path: '500-lines-4.txt',
- old_line: 5,
- old_path: '500-lines-4.txt',
- start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- };
-
- const state = {
- latestDiff: true,
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1',
- discussions: [],
- },
- right: {
- line_code: 'ABC_2',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [],
- },
- ],
- },
- ],
- };
- const discussion = {
- id: 1,
- line_code: 'ABC_1',
- diff_discussion: true,
- resolvable: true,
- original_position: diffPosition,
- position: diffPosition,
- diff_file: {
- file_hash: state.diffFiles[0].file_hash,
- },
- };
-
- const diffPositionByLineCode = {
- ABC_1: diffPosition,
- };
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].right.discussions).toEqual([]);
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].right.discussions).toEqual([]);
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
- });
-
- it('updates existing discussion', () => {
- const diffPosition = {
- base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- new_line: null,
- new_path: '500-lines-4.txt',
- old_line: 5,
- old_path: '500-lines-4.txt',
- start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- };
-
- const state = {
- latestDiff: true,
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1',
- discussions: [],
- },
- right: {
- line_code: 'ABC_2',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [],
- },
- ],
- },
- ],
- };
- const discussion = {
- id: 1,
- line_code: 'ABC_1',
- diff_discussion: true,
- resolvable: true,
- original_position: diffPosition,
- position: diffPosition,
- diff_file: {
- file_hash: state.diffFiles[0].file_hash,
- },
- };
-
- const diffPositionByLineCode = {
- ABC_1: diffPosition,
- };
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].right.discussions).toEqual([]);
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion: {
- ...discussion,
- resolved: true,
- notes: ['test'],
- },
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].notes.length).toBe(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].notes.length).toBe(1);
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].resolved).toBe(true);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].resolved).toBe(true);
- });
-
- it('should not duplicate inline diff discussions', () => {
- const diffPosition = {
- base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- new_line: null,
- new_path: '500-lines-4.txt',
- old_line: 5,
- old_path: '500-lines-4.txt',
- start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- };
-
- const state = {
- latestDiff: true,
- diffFiles: [
- {
- file_hash: 'ABC',
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [
- {
- id: 1,
- line_code: 'ABC_1',
- diff_discussion: true,
- resolvable: true,
- original_position: diffPosition,
- position: diffPosition,
- diff_file: {
- file_hash: 'ABC',
- },
- },
- ],
- },
- {
- line_code: 'ABC_2',
- discussions: [],
- },
- ],
- parallel_diff_lines: [],
- },
- ],
- };
- const discussion = {
- id: 2,
- line_code: 'ABC_2',
- diff_discussion: true,
- resolvable: true,
- original_position: diffPosition,
- position: diffPosition,
- diff_file: {
- file_hash: state.diffFiles[0].file_hash,
- },
- };
-
- const diffPositionByLineCode = {
- ABC_2: diffPosition,
- };
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toBe(1);
- });
-
- it('should add legacy discussions to the given line', () => {
- const diffPosition = {
- base_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- head_sha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- new_line: null,
- new_path: '500-lines-4.txt',
- old_line: 5,
- old_path: '500-lines-4.txt',
- start_sha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- line_code: 'ABC_1',
- };
-
- const state = {
- latestDiff: true,
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1',
- discussions: [],
- },
- right: {
- line_code: 'ABC_1',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [],
- },
- ],
- },
- ],
- };
- const discussion = {
- id: 1,
- line_code: 'ABC_1',
- diff_discussion: true,
- active: true,
- diff_file: {
- file_hash: state.diffFiles[0].file_hash,
- },
- };
-
- const diffPositionByLineCode = {
- ABC_1: diffPosition,
- };
-
- mutations[types.SET_LINE_DISCUSSIONS_FOR_FILE](state, {
- discussion,
- diffPositionByLineCode,
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(1);
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions[0].id).toEqual(1);
-
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(1);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions[0].id).toEqual(1);
- });
- });
-
- describe('REMOVE_LINE_DISCUSSIONS', () => {
- it('should remove the existing discussions on the given line', () => {
- const state = {
- diffFiles: [
- {
- file_hash: 'ABC',
- parallel_diff_lines: [
- {
- left: {
- line_code: 'ABC_1',
- discussions: [
- {
- id: 1,
- line_code: 'ABC_1',
- notes: [],
- },
- {
- id: 2,
- line_code: 'ABC_1',
- notes: [],
- },
- ],
- },
- right: {
- line_code: 'ABC_1',
- discussions: [],
- },
- },
- ],
- highlighted_diff_lines: [
- {
- line_code: 'ABC_1',
- discussions: [
- {
- id: 1,
- line_code: 'ABC_1',
- notes: [],
- },
- {
- id: 2,
- line_code: 'ABC_1',
- notes: [],
- },
- ],
- },
- ],
- },
- ],
- };
-
- mutations[types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, {
- fileHash: 'ABC',
- lineCode: 'ABC_1',
- });
-
- expect(state.diffFiles[0].parallel_diff_lines[0].left.discussions.length).toEqual(0);
- expect(state.diffFiles[0].highlighted_diff_lines[0].discussions.length).toEqual(0);
- });
- });
-
- describe('TOGGLE_FOLDER_OPEN', () => {
- it('toggles entry opened prop', () => {
- const state = {
- treeEntries: {
- path: {
- opened: false,
- },
- },
- };
-
- mutations[types.TOGGLE_FOLDER_OPEN](state, 'path');
-
- expect(state.treeEntries.path.opened).toBe(true);
- });
- });
-
- describe('TOGGLE_SHOW_TREE_LIST', () => {
- it('toggles showTreeList', () => {
- const state = createState();
-
- mutations[types.TOGGLE_SHOW_TREE_LIST](state);
-
- expect(state.showTreeList).toBe(false, 'Failed to toggle showTreeList to false');
-
- mutations[types.TOGGLE_SHOW_TREE_LIST](state);
-
- expect(state.showTreeList).toBe(true, 'Failed to toggle showTreeList to true');
- });
- });
-
- describe('UPDATE_CURRENT_DIFF_FILE_ID', () => {
- it('updates currentDiffFileId', () => {
- const state = createState();
-
- mutations[types.UPDATE_CURRENT_DIFF_FILE_ID](state, 'somefileid');
-
- expect(state.currentDiffFileId).toBe('somefileid');
- });
- });
-
- describe('Set highlighted row', () => {
- it('sets highlighted row', () => {
- const state = createState();
-
- mutations[types.SET_HIGHLIGHTED_ROW](state, 'ABC_123');
-
- expect(state.highlightedRow).toBe('ABC_123');
- });
- });
-
- describe('TOGGLE_LINE_HAS_FORM', () => {
- it('sets hasForm on lines', () => {
- const file = {
- file_hash: 'hash',
- parallel_diff_lines: [
- { left: { line_code: '123', hasForm: false }, right: {} },
- { left: {}, right: { line_code: '124', hasForm: false } },
- ],
- highlighted_diff_lines: [
- { line_code: '123', hasForm: false },
- { line_code: '124', hasForm: false },
- ],
- };
- const state = {
- diffFiles: [file],
- };
-
- mutations[types.TOGGLE_LINE_HAS_FORM](state, {
- lineCode: '123',
- hasForm: true,
- fileHash: 'hash',
- });
-
- expect(file.highlighted_diff_lines[0].hasForm).toBe(true);
- expect(file.highlighted_diff_lines[1].hasForm).toBe(false);
-
- expect(file.parallel_diff_lines[0].left.hasForm).toBe(true);
- expect(file.parallel_diff_lines[1].right.hasForm).toBe(false);
- });
- });
-
- describe('SET_TREE_DATA', () => {
- it('sets treeEntries and tree in state', () => {
- const state = {
- treeEntries: {},
- tree: [],
- };
-
- mutations[types.SET_TREE_DATA](state, {
- treeEntries: { file: { name: 'index.js' } },
- tree: ['tree'],
- });
-
- expect(state.treeEntries).toEqual({
- file: {
- name: 'index.js',
- },
- });
-
- expect(state.tree).toEqual(['tree']);
- });
- });
-
- describe('SET_RENDER_TREE_LIST', () => {
- it('sets renderTreeList', () => {
- const state = {
- renderTreeList: true,
- };
-
- mutations[types.SET_RENDER_TREE_LIST](state, false);
-
- expect(state.renderTreeList).toBe(false);
- });
- });
-
- describe('SET_SHOW_WHITESPACE', () => {
- it('sets showWhitespace', () => {
- const state = {
- showWhitespace: true,
- };
-
- mutations[types.SET_SHOW_WHITESPACE](state, false);
-
- expect(state.showWhitespace).toBe(false);
- });
- });
-
- describe('REQUEST_FULL_DIFF', () => {
- it('sets isLoadingFullFile to true', () => {
- const state = {
- diffFiles: [{ file_path: 'test', isLoadingFullFile: false }],
- };
-
- mutations[types.REQUEST_FULL_DIFF](state, 'test');
-
- expect(state.diffFiles[0].isLoadingFullFile).toBe(true);
- });
- });
-
- describe('RECEIVE_FULL_DIFF_ERROR', () => {
- it('sets isLoadingFullFile to false', () => {
- const state = {
- diffFiles: [{ file_path: 'test', isLoadingFullFile: true }],
- };
-
- mutations[types.RECEIVE_FULL_DIFF_ERROR](state, 'test');
-
- expect(state.diffFiles[0].isLoadingFullFile).toBe(false);
- });
- });
-
- describe('RECEIVE_FULL_DIFF_SUCCESS', () => {
- it('sets isLoadingFullFile to false', () => {
- const state = {
- diffFiles: [
- {
- file_path: 'test',
- isLoadingFullFile: true,
- isShowingFullFile: false,
- highlighted_diff_lines: [],
- parallel_diff_lines: [],
- },
- ],
- };
-
- mutations[types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath: 'test', data: [] });
-
- expect(state.diffFiles[0].isLoadingFullFile).toBe(false);
- });
-
- it('sets isShowingFullFile to true', () => {
- const state = {
- diffFiles: [
- {
- file_path: 'test',
- isLoadingFullFile: true,
- isShowingFullFile: false,
- highlighted_diff_lines: [],
- parallel_diff_lines: [],
- },
- ],
- };
-
- mutations[types.RECEIVE_FULL_DIFF_SUCCESS](state, { filePath: 'test', data: [] });
-
- expect(state.diffFiles[0].isShowingFullFile).toBe(true);
- });
- });
-
- describe('SET_FILE_COLLAPSED', () => {
- it('sets collapsed', () => {
- const state = {
- diffFiles: [{ file_path: 'test', viewer: { collapsed: false } }],
- };
-
- mutations[types.SET_FILE_COLLAPSED](state, { filePath: 'test', collapsed: true });
-
- expect(state.diffFiles[0].viewer.collapsed).toBe(true);
- });
- });
-
- describe('SET_HIDDEN_VIEW_DIFF_FILE_LINES', () => {
- [
- { current: 'highlighted', hidden: 'parallel', diffViewType: 'inline' },
- { current: 'parallel', hidden: 'highlighted', diffViewType: 'parallel' },
- ].forEach(({ current, hidden, diffViewType }) => {
- it(`sets the ${hidden} lines when diff view is ${diffViewType}`, () => {
- const file = { file_path: 'test', parallel_diff_lines: [], highlighted_diff_lines: [] };
- const state = {
- diffFiles: [file],
- diffViewType,
- };
-
- mutations[types.SET_HIDDEN_VIEW_DIFF_FILE_LINES](state, {
- filePath: 'test',
- lines: ['test'],
- });
-
- expect(file[`${current}_diff_lines`]).toEqual([]);
- expect(file[`${hidden}_diff_lines`]).toEqual(['test']);
- });
- });
- });
-
- describe('SET_CURRENT_VIEW_DIFF_FILE_LINES', () => {
- [
- { current: 'highlighted', hidden: 'parallel', diffViewType: 'inline' },
- { current: 'parallel', hidden: 'highlighted', diffViewType: 'parallel' },
- ].forEach(({ current, hidden, diffViewType }) => {
- it(`sets the ${current} lines when diff view is ${diffViewType}`, () => {
- const file = { file_path: 'test', parallel_diff_lines: [], highlighted_diff_lines: [] };
- const state = {
- diffFiles: [file],
- diffViewType,
- };
-
- mutations[types.SET_CURRENT_VIEW_DIFF_FILE_LINES](state, {
- filePath: 'test',
- lines: ['test'],
- });
-
- expect(file[`${current}_diff_lines`]).toEqual(['test']);
- expect(file[`${hidden}_diff_lines`]).toEqual([]);
- });
- });
- });
-
- describe('ADD_CURRENT_VIEW_DIFF_FILE_LINES', () => {
- [
- { current: 'highlighted', hidden: 'parallel', diffViewType: 'inline' },
- { current: 'parallel', hidden: 'highlighted', diffViewType: 'parallel' },
- ].forEach(({ current, hidden, diffViewType }) => {
- it(`pushes to ${current} lines when diff view is ${diffViewType}`, () => {
- const file = { file_path: 'test', parallel_diff_lines: [], highlighted_diff_lines: [] };
- const state = {
- diffFiles: [file],
- diffViewType,
- };
-
- mutations[types.ADD_CURRENT_VIEW_DIFF_FILE_LINES](state, {
- filePath: 'test',
- line: 'test',
- });
-
- expect(file[`${current}_diff_lines`]).toEqual(['test']);
- expect(file[`${hidden}_diff_lines`]).toEqual([]);
-
- mutations[types.ADD_CURRENT_VIEW_DIFF_FILE_LINES](state, {
- filePath: 'test',
- line: 'test2',
- });
-
- expect(file[`${current}_diff_lines`]).toEqual(['test', 'test2']);
- expect(file[`${hidden}_diff_lines`]).toEqual([]);
- });
- });
- });
-
- describe('TOGGLE_DIFF_FILE_RENDERING_MORE', () => {
- it('toggles renderingLines on file', () => {
- const file = { file_path: 'test', renderingLines: false };
- const state = {
- diffFiles: [file],
- };
-
- mutations[types.TOGGLE_DIFF_FILE_RENDERING_MORE](state, 'test');
-
- expect(file.renderingLines).toBe(true);
-
- mutations[types.TOGGLE_DIFF_FILE_RENDERING_MORE](state, 'test');
-
- expect(file.renderingLines).toBe(false);
- });
- });
-
- describe('SET_SHOW_SUGGEST_POPOVER', () => {
- it('sets showSuggestPopover to false', () => {
- const state = { showSuggestPopover: true };
-
- mutations[types.SET_SHOW_SUGGEST_POPOVER](state);
-
- expect(state.showSuggestPopover).toBe(false);
- });
- });
-});
diff --git a/spec/javascripts/diffs/store/utils_spec.js b/spec/javascripts/diffs/store/utils_spec.js
deleted file mode 100644
index 223c4d7e40b..00000000000
--- a/spec/javascripts/diffs/store/utils_spec.js
+++ /dev/null
@@ -1,950 +0,0 @@
-import { clone } from 'lodash';
-import * as utils from '~/diffs/store/utils';
-import {
- LINE_POSITION_LEFT,
- LINE_POSITION_RIGHT,
- TEXT_DIFF_POSITION_TYPE,
- LEGACY_DIFF_NOTE_TYPE,
- DIFF_NOTE_TYPE,
- NEW_LINE_TYPE,
- OLD_LINE_TYPE,
- MATCH_LINE_TYPE,
- INLINE_DIFF_VIEW_TYPE,
- PARALLEL_DIFF_VIEW_TYPE,
-} from '~/diffs/constants';
-import { MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants';
-import diffFileMockData from '../mock_data/diff_file';
-import { noteableDataMock } from '../../notes/mock_data';
-
-const getDiffFileMock = () => JSON.parse(JSON.stringify(diffFileMockData));
-
-describe('DiffsStoreUtils', () => {
- describe('findDiffFile', () => {
- const files = [{ file_hash: 1, name: 'one' }];
-
- it('should return correct file', () => {
- expect(utils.findDiffFile(files, 1).name).toEqual('one');
- expect(utils.findDiffFile(files, 2)).toBeUndefined();
- });
- });
-
- describe('getReversePosition', () => {
- it('should return correct line position name', () => {
- expect(utils.getReversePosition(LINE_POSITION_RIGHT)).toEqual(LINE_POSITION_LEFT);
- expect(utils.getReversePosition(LINE_POSITION_LEFT)).toEqual(LINE_POSITION_RIGHT);
- });
- });
-
- describe('findIndexInInlineLines and findIndexInParallelLines', () => {
- const expectSet = (method, lines, invalidLines) => {
- expect(method(lines, { oldLineNumber: 3, newLineNumber: 5 })).toEqual(4);
- expect(method(invalidLines || lines, { oldLineNumber: 32, newLineNumber: 53 })).toEqual(-1);
- };
-
- describe('findIndexInInlineLines', () => {
- it('should return correct index for given line numbers', () => {
- expectSet(utils.findIndexInInlineLines, getDiffFileMock().highlighted_diff_lines);
- });
- });
-
- describe('findIndexInParallelLines', () => {
- it('should return correct index for given line numbers', () => {
- expectSet(utils.findIndexInParallelLines, getDiffFileMock().parallel_diff_lines, []);
- });
- });
- });
-
- describe('getPreviousLineIndex', () => {
- [
- { diffViewType: INLINE_DIFF_VIEW_TYPE, file: { parallel_diff_lines: [] } },
- { diffViewType: PARALLEL_DIFF_VIEW_TYPE, file: { highlighted_diff_lines: [] } },
- ].forEach(({ diffViewType, file }) => {
- describe(`with diffViewType (${diffViewType}) in split diffs`, () => {
- let diffFile;
-
- beforeEach(() => {
- diffFile = { ...clone(diffFileMockData), ...file };
- });
-
- it('should return the correct previous line number', () => {
- const emptyLines =
- diffViewType === INLINE_DIFF_VIEW_TYPE
- ? diffFile.parallel_diff_lines
- : diffFile.highlighted_diff_lines;
-
- // This expectation asserts that we cannot possibly be using the opposite view type lines in the next expectation
- expect(emptyLines.length).toBe(0);
- expect(
- utils.getPreviousLineIndex(diffViewType, diffFile, {
- oldLineNumber: 3,
- newLineNumber: 5,
- }),
- ).toBe(4);
- });
- });
- });
- });
-
- describe('removeMatchLine', () => {
- it('should remove match line properly by regarding the bottom parameter', () => {
- const diffFile = getDiffFileMock();
- const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
- const inlineIndex = utils.findIndexInInlineLines(
- diffFile.highlighted_diff_lines,
- lineNumbers,
- );
- const parallelIndex = utils.findIndexInParallelLines(
- diffFile.parallel_diff_lines,
- lineNumbers,
- );
- const atInlineIndex = diffFile.highlighted_diff_lines[inlineIndex];
- const atParallelIndex = diffFile.parallel_diff_lines[parallelIndex];
-
- utils.removeMatchLine(diffFile, lineNumbers, false);
-
- expect(diffFile.highlighted_diff_lines[inlineIndex]).not.toEqual(atInlineIndex);
- expect(diffFile.parallel_diff_lines[parallelIndex]).not.toEqual(atParallelIndex);
-
- utils.removeMatchLine(diffFile, lineNumbers, true);
-
- expect(diffFile.highlighted_diff_lines[inlineIndex + 1]).not.toEqual(atInlineIndex);
- expect(diffFile.parallel_diff_lines[parallelIndex + 1]).not.toEqual(atParallelIndex);
- });
- });
-
- describe('addContextLines', () => {
- [INLINE_DIFF_VIEW_TYPE, PARALLEL_DIFF_VIEW_TYPE].forEach(diffViewType => {
- it(`should add context lines for ${diffViewType}`, () => {
- const diffFile = getDiffFileMock();
- const inlineLines = diffFile.highlighted_diff_lines;
- const parallelLines = diffFile.parallel_diff_lines;
- const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
- const contextLines = [{ lineNumber: 42, line_code: '123' }];
- const options = { inlineLines, parallelLines, contextLines, lineNumbers, diffViewType };
- const inlineIndex = utils.findIndexInInlineLines(inlineLines, lineNumbers);
- const parallelIndex = utils.findIndexInParallelLines(parallelLines, lineNumbers);
- const normalizedParallelLine = {
- left: options.contextLines[0],
- right: options.contextLines[0],
- line_code: '123',
- };
-
- utils.addContextLines(options);
-
- if (diffViewType === INLINE_DIFF_VIEW_TYPE) {
- expect(inlineLines[inlineIndex]).toEqual(contextLines[0]);
- } else {
- expect(parallelLines[parallelIndex]).toEqual(normalizedParallelLine);
- }
- });
-
- it(`should add context lines properly with bottom parameter for ${diffViewType}`, () => {
- const diffFile = getDiffFileMock();
- const inlineLines = diffFile.highlighted_diff_lines;
- const parallelLines = diffFile.parallel_diff_lines;
- const lineNumbers = { oldLineNumber: 3, newLineNumber: 5 };
- const contextLines = [{ lineNumber: 42, line_code: '123' }];
- const options = {
- inlineLines,
- parallelLines,
- contextLines,
- lineNumbers,
- bottom: true,
- diffViewType,
- };
- const normalizedParallelLine = {
- left: options.contextLines[0],
- right: options.contextLines[0],
- line_code: '123',
- };
-
- utils.addContextLines(options);
-
- if (diffViewType === INLINE_DIFF_VIEW_TYPE) {
- expect(inlineLines[inlineLines.length - 1]).toEqual(contextLines[0]);
- } else {
- expect(parallelLines[parallelLines.length - 1]).toEqual(normalizedParallelLine);
- }
- });
- });
- });
-
- describe('getNoteFormData', () => {
- it('should properly create note form data', () => {
- const diffFile = getDiffFileMock();
- noteableDataMock.targetType = MERGE_REQUEST_NOTEABLE_TYPE;
-
- const options = {
- note: 'Hello world!',
- noteableData: noteableDataMock,
- noteableType: MERGE_REQUEST_NOTEABLE_TYPE,
- diffFile,
- noteTargetLine: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- meta_data: null,
- new_line: 3,
- old_line: 1,
- },
- diffViewType: PARALLEL_DIFF_VIEW_TYPE,
- linePosition: LINE_POSITION_LEFT,
- };
-
- const position = JSON.stringify({
- base_sha: diffFile.diff_refs.base_sha,
- start_sha: diffFile.diff_refs.start_sha,
- head_sha: diffFile.diff_refs.head_sha,
- old_path: diffFile.old_path,
- new_path: diffFile.new_path,
- position_type: TEXT_DIFF_POSITION_TYPE,
- old_line: options.noteTargetLine.old_line,
- new_line: options.noteTargetLine.new_line,
- });
-
- const postData = {
- view: options.diffViewType,
- line_type: options.linePosition === LINE_POSITION_RIGHT ? NEW_LINE_TYPE : OLD_LINE_TYPE,
- merge_request_diff_head_sha: diffFile.diff_refs.head_sha,
- in_reply_to_discussion_id: '',
- note_project_id: '',
- target_type: options.noteableType,
- target_id: options.noteableData.id,
- return_discussion: true,
- note: {
- noteable_type: options.noteableType,
- noteable_id: options.noteableData.id,
- commit_id: undefined,
- type: DIFF_NOTE_TYPE,
- line_code: options.noteTargetLine.line_code,
- note: options.note,
- position,
- },
- };
-
- expect(utils.getNoteFormData(options)).toEqual({
- endpoint: options.noteableData.create_note_path,
- data: postData,
- });
- });
-
- it('should create legacy note form data', () => {
- const diffFile = getDiffFileMock();
- delete diffFile.diff_refs.start_sha;
- delete diffFile.diff_refs.head_sha;
-
- noteableDataMock.targetType = MERGE_REQUEST_NOTEABLE_TYPE;
-
- const options = {
- note: 'Hello world!',
- noteableData: noteableDataMock,
- noteableType: MERGE_REQUEST_NOTEABLE_TYPE,
- diffFile,
- noteTargetLine: {
- line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_3',
- meta_data: null,
- new_line: 3,
- old_line: 1,
- },
- diffViewType: PARALLEL_DIFF_VIEW_TYPE,
- linePosition: LINE_POSITION_LEFT,
- };
-
- const position = JSON.stringify({
- base_sha: diffFile.diff_refs.base_sha,
- start_sha: undefined,
- head_sha: undefined,
- old_path: diffFile.old_path,
- new_path: diffFile.new_path,
- position_type: TEXT_DIFF_POSITION_TYPE,
- old_line: options.noteTargetLine.old_line,
- new_line: options.noteTargetLine.new_line,
- });
-
- const postData = {
- view: options.diffViewType,
- line_type: options.linePosition === LINE_POSITION_RIGHT ? NEW_LINE_TYPE : OLD_LINE_TYPE,
- merge_request_diff_head_sha: undefined,
- in_reply_to_discussion_id: '',
- note_project_id: '',
- target_type: options.noteableType,
- target_id: options.noteableData.id,
- return_discussion: true,
- note: {
- noteable_type: options.noteableType,
- noteable_id: options.noteableData.id,
- commit_id: undefined,
- type: LEGACY_DIFF_NOTE_TYPE,
- line_code: options.noteTargetLine.line_code,
- note: options.note,
- position,
- },
- };
-
- expect(utils.getNoteFormData(options)).toEqual({
- endpoint: options.noteableData.create_note_path,
- data: postData,
- });
- });
- });
-
- describe('addLineReferences', () => {
- const lineNumbers = { oldLineNumber: 3, newLineNumber: 4 };
-
- it('should add correct line references when bottom set to true', () => {
- const lines = [{ type: null }, { type: MATCH_LINE_TYPE }];
- const linesWithReferences = utils.addLineReferences(lines, lineNumbers, true);
-
- expect(linesWithReferences[0].old_line).toEqual(lineNumbers.oldLineNumber + 1);
- expect(linesWithReferences[0].new_line).toEqual(lineNumbers.newLineNumber + 1);
- expect(linesWithReferences[1].meta_data.old_pos).toEqual(4);
- expect(linesWithReferences[1].meta_data.new_pos).toEqual(5);
- });
-
- it('should add correct line references when bottom falsy', () => {
- const lines = [{ type: null }, { type: MATCH_LINE_TYPE }, { type: null }];
- const linesWithReferences = utils.addLineReferences(lines, lineNumbers);
-
- expect(linesWithReferences[0].old_line).toEqual(0);
- expect(linesWithReferences[0].new_line).toEqual(1);
- expect(linesWithReferences[1].meta_data.old_pos).toEqual(2);
- expect(linesWithReferences[1].meta_data.new_pos).toEqual(3);
- });
-
- it('should add correct line references when isExpandDown is true', () => {
- const lines = [{ type: null }, { type: MATCH_LINE_TYPE }];
- const linesWithReferences = utils.addLineReferences(lines, lineNumbers, false, true, {
- old_line: 10,
- new_line: 11,
- });
-
- expect(linesWithReferences[1].meta_data.old_pos).toEqual(10);
- expect(linesWithReferences[1].meta_data.new_pos).toEqual(11);
- });
- });
-
- describe('trimFirstCharOfLineContent', () => {
- it('trims the line when it starts with a space', () => {
- expect(utils.trimFirstCharOfLineContent({ rich_text: ' diff' })).toEqual({
- rich_text: 'diff',
- });
- });
-
- it('trims the line when it starts with a +', () => {
- expect(utils.trimFirstCharOfLineContent({ rich_text: '+diff' })).toEqual({
- rich_text: 'diff',
- });
- });
-
- it('trims the line when it starts with a -', () => {
- expect(utils.trimFirstCharOfLineContent({ rich_text: '-diff' })).toEqual({
- rich_text: 'diff',
- });
- });
-
- it('does not trims the line when it starts with a letter', () => {
- expect(utils.trimFirstCharOfLineContent({ rich_text: 'diff' })).toEqual({
- rich_text: 'diff',
- });
- });
-
- it('does not modify the provided object', () => {
- const lineObj = {
- rich_text: ' diff',
- };
-
- utils.trimFirstCharOfLineContent(lineObj);
-
- expect(lineObj).toEqual({ rich_text: ' diff' });
- });
-
- it('handles a undefined or null parameter', () => {
- expect(utils.trimFirstCharOfLineContent()).toEqual({});
- });
- });
-
- describe('prepareDiffData', () => {
- let mock;
- let preparedDiff;
- let splitInlineDiff;
- let splitParallelDiff;
- let completedDiff;
-
- beforeEach(() => {
- mock = getDiffFileMock();
- preparedDiff = { diff_files: [mock] };
- splitInlineDiff = {
- diff_files: [Object.assign({}, mock, { parallel_diff_lines: undefined })],
- };
- splitParallelDiff = {
- diff_files: [Object.assign({}, mock, { highlighted_diff_lines: undefined })],
- };
- completedDiff = {
- diff_files: [Object.assign({}, mock, { highlighted_diff_lines: undefined })],
- };
-
- preparedDiff.diff_files = utils.prepareDiffData(preparedDiff);
- splitInlineDiff.diff_files = utils.prepareDiffData(splitInlineDiff);
- splitParallelDiff.diff_files = utils.prepareDiffData(splitParallelDiff);
- completedDiff.diff_files = utils.prepareDiffData(completedDiff, [mock]);
- });
-
- it('sets the renderIt and collapsed attribute on files', () => {
- const firstParallelDiffLine = preparedDiff.diff_files[0].parallel_diff_lines[2];
-
- expect(firstParallelDiffLine.left.discussions.length).toBe(0);
- expect(firstParallelDiffLine.left).not.toHaveAttr('text');
- expect(firstParallelDiffLine.right.discussions.length).toBe(0);
- expect(firstParallelDiffLine.right).not.toHaveAttr('text');
- const firstParallelChar = firstParallelDiffLine.right.rich_text.charAt(0);
-
- expect(firstParallelChar).not.toBe(' ');
- expect(firstParallelChar).not.toBe('+');
- expect(firstParallelChar).not.toBe('-');
-
- const checkLine = preparedDiff.diff_files[0].highlighted_diff_lines[0];
-
- expect(checkLine.discussions.length).toBe(0);
- expect(checkLine).not.toHaveAttr('text');
- const firstChar = checkLine.rich_text.charAt(0);
-
- expect(firstChar).not.toBe(' ');
- expect(firstChar).not.toBe('+');
- expect(firstChar).not.toBe('-');
-
- expect(preparedDiff.diff_files[0].renderIt).toBeTruthy();
- expect(preparedDiff.diff_files[0].collapsed).toBeFalsy();
- });
-
- it('adds line_code to all lines', () => {
- expect(
- preparedDiff.diff_files[0].parallel_diff_lines.filter(line => !line.line_code),
- ).toHaveLength(0);
- });
-
- it('uses right line code if left has none', () => {
- const firstLine = preparedDiff.diff_files[0].parallel_diff_lines[0];
-
- expect(firstLine.line_code).toEqual(firstLine.right.line_code);
- });
-
- it('guarantees an empty array for both diff styles', () => {
- expect(splitInlineDiff.diff_files[0].parallel_diff_lines.length).toEqual(0);
- expect(splitInlineDiff.diff_files[0].highlighted_diff_lines.length).toBeGreaterThan(0);
- expect(splitParallelDiff.diff_files[0].parallel_diff_lines.length).toBeGreaterThan(0);
- expect(splitParallelDiff.diff_files[0].highlighted_diff_lines.length).toEqual(0);
- });
-
- it('merges existing diff files with newly loaded diff files to ensure split diffs are eventually completed', () => {
- expect(completedDiff.diff_files.length).toEqual(1);
- expect(completedDiff.diff_files[0].parallel_diff_lines.length).toBeGreaterThan(0);
- expect(completedDiff.diff_files[0].highlighted_diff_lines.length).toBeGreaterThan(0);
- });
-
- it('leaves files in the existing state', () => {
- const priorFiles = [mock];
- const fakeNewFile = {
- ...mock,
- content_sha: 'ABC',
- file_hash: 'DEF',
- };
- const updatedFilesList = utils.prepareDiffData({ diff_files: [fakeNewFile] }, priorFiles);
-
- expect(updatedFilesList).toEqual([mock, fakeNewFile]);
- });
-
- it('completes an existing split diff without overwriting existing diffs', () => {
- // The current state has a file that has only loaded inline lines
- const priorFiles = [{ ...mock, parallel_diff_lines: [] }];
- // The next (batch) load loads two files: the other half of that file, and a new file
- const fakeBatch = [
- { ...mock, highlighted_diff_lines: undefined },
- { ...mock, highlighted_diff_lines: undefined, content_sha: 'ABC', file_hash: 'DEF' },
- ];
- const updatedFilesList = utils.prepareDiffData({ diff_files: fakeBatch }, priorFiles);
-
- expect(updatedFilesList).toEqual([
- mock,
- jasmine.objectContaining({
- content_sha: 'ABC',
- file_hash: 'DEF',
- }),
- ]);
- });
- });
-
- describe('isDiscussionApplicableToLine', () => {
- const diffPosition = {
- baseSha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- headSha: 'b921914f9a834ac47e6fd9420f78db0f83559130',
- newLine: null,
- newPath: '500-lines-4.txt',
- oldLine: 5,
- oldPath: '500-lines-4.txt',
- startSha: 'ed13df29948c41ba367caa757ab3ec4892509910',
- };
-
- const wrongDiffPosition = {
- baseSha: 'wrong',
- headSha: 'wrong',
- newLine: null,
- newPath: '500-lines-4.txt',
- oldLine: 5,
- oldPath: '500-lines-4.txt',
- startSha: 'wrong',
- };
-
- const discussions = {
- upToDateDiscussion1: {
- original_position: diffPosition,
- position: wrongDiffPosition,
- },
- outDatedDiscussion1: {
- original_position: wrongDiffPosition,
- position: wrongDiffPosition,
- },
- };
-
- it('returns true when the discussion is up to date', () => {
- expect(
- utils.isDiscussionApplicableToLine({
- discussion: discussions.upToDateDiscussion1,
- diffPosition,
- latestDiff: true,
- }),
- ).toBe(true);
- });
-
- it('returns false when the discussion is not up to date', () => {
- expect(
- utils.isDiscussionApplicableToLine({
- discussion: discussions.outDatedDiscussion1,
- diffPosition,
- latestDiff: true,
- }),
- ).toBe(false);
- });
-
- it('returns true when line codes match and discussion does not contain position and is not active', () => {
- const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: false };
- delete discussion.original_position;
- delete discussion.position;
-
- expect(
- utils.isDiscussionApplicableToLine({
- discussion,
- diffPosition: {
- ...diffPosition,
- lineCode: 'ABC_1',
- },
- latestDiff: true,
- }),
- ).toBe(false);
- });
-
- it('returns true when line codes match and discussion does not contain position and is active', () => {
- const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: true };
- delete discussion.original_position;
- delete discussion.position;
-
- expect(
- utils.isDiscussionApplicableToLine({
- discussion,
- diffPosition: {
- ...diffPosition,
- line_code: 'ABC_1',
- },
- latestDiff: true,
- }),
- ).toBe(true);
- });
-
- it('returns false when not latest diff', () => {
- const discussion = { ...discussions.outDatedDiscussion1, line_code: 'ABC_1', active: true };
- delete discussion.original_position;
- delete discussion.position;
-
- expect(
- utils.isDiscussionApplicableToLine({
- discussion,
- diffPosition: {
- ...diffPosition,
- lineCode: 'ABC_1',
- },
- latestDiff: false,
- }),
- ).toBe(false);
- });
- });
-
- describe('generateTreeList', () => {
- let files;
-
- beforeAll(() => {
- files = [
- {
- new_path: 'app/index.js',
- deleted_file: false,
- new_file: false,
- removed_lines: 10,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'app/test/index.js',
- deleted_file: false,
- new_file: true,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'app/test/filepathneedstruncating.js',
- deleted_file: false,
- new_file: true,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'package.json',
- deleted_file: true,
- new_file: false,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- ];
- });
-
- it('creates a tree of files', () => {
- const { tree } = utils.generateTreeList(files);
-
- expect(tree).toEqual([
- {
- key: 'app',
- path: 'app',
- name: 'app',
- type: 'tree',
- tree: [
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/index.js',
- name: 'index.js',
- parentPath: 'app/',
- path: 'app/index.js',
- removedLines: 10,
- tempFile: false,
- type: 'blob',
- tree: [],
- },
- {
- key: 'app/test',
- path: 'app/test',
- name: 'test',
- type: 'tree',
- opened: true,
- tree: [
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/test/index.js',
- name: 'index.js',
- parentPath: 'app/test/',
- path: 'app/test/index.js',
- removedLines: 0,
- tempFile: true,
- type: 'blob',
- tree: [],
- },
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/test/filepathneedstruncating.js',
- name: 'filepathneedstruncating.js',
- parentPath: 'app/test/',
- path: 'app/test/filepathneedstruncating.js',
- removedLines: 0,
- tempFile: true,
- type: 'blob',
- tree: [],
- },
- ],
- },
- ],
- opened: true,
- },
- {
- key: 'package.json',
- parentPath: '/',
- path: 'package.json',
- name: 'package.json',
- type: 'blob',
- changed: true,
- tempFile: false,
- deleted: true,
- fileHash: 'test',
- addedLines: 0,
- removedLines: 0,
- tree: [],
- },
- ]);
- });
-
- it('creates flat list of blobs & folders', () => {
- const { treeEntries } = utils.generateTreeList(files);
-
- expect(Object.keys(treeEntries)).toEqual([
- 'app',
- 'app/index.js',
- 'app/test',
- 'app/test/index.js',
- 'app/test/filepathneedstruncating.js',
- 'package.json',
- ]);
- });
- });
-
- describe('getDiffMode', () => {
- it('returns mode when matched in file', () => {
- expect(
- utils.getDiffMode({
- renamed_file: true,
- }),
- ).toBe('renamed');
- });
-
- it('returns mode_changed if key has no match', () => {
- expect(
- utils.getDiffMode({
- viewer: { name: 'mode_changed' },
- }),
- ).toBe('mode_changed');
- });
-
- it('defaults to replaced', () => {
- expect(utils.getDiffMode({})).toBe('replaced');
- });
- });
-
- describe('getLowestSingleFolder', () => {
- it('returns path and tree of lowest single folder tree', () => {
- const folder = {
- name: 'app',
- type: 'tree',
- tree: [
- {
- name: 'javascripts',
- type: 'tree',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- },
- ],
- },
- ],
- };
- const { path, treeAcc } = utils.getLowestSingleFolder(folder);
-
- expect(path).toEqual('app/javascripts');
- expect(treeAcc).toEqual([
- {
- type: 'blob',
- name: 'index.js',
- },
- ]);
- });
-
- it('returns passed in folders path & tree when more than tree exists', () => {
- const folder = {
- name: 'app',
- type: 'tree',
- tree: [
- {
- name: 'spec',
- type: 'blob',
- tree: [],
- },
- ],
- };
- const { path, treeAcc } = utils.getLowestSingleFolder(folder);
-
- expect(path).toEqual('app');
- expect(treeAcc).toBeNull();
- });
- });
-
- describe('flattenTree', () => {
- it('returns flattened directory structure', () => {
- const tree = [
- {
- type: 'tree',
- name: 'app',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- tree: [],
- },
- ],
- },
- ],
- },
- {
- type: 'tree',
- name: 'ee',
- tree: [
- {
- type: 'tree',
- name: 'lib',
- tree: [
- {
- type: 'tree',
- name: 'ee',
- tree: [
- {
- type: 'tree',
- name: 'gitlab',
- tree: [
- {
- type: 'tree',
- name: 'checks',
- tree: [
- {
- type: 'tree',
- name: 'longtreenametomakepath',
- tree: [
- {
- type: 'blob',
- name: 'diff_check.rb',
- tree: [],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- {
- type: 'tree',
- name: 'spec',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [],
- },
- {
- type: 'blob',
- name: 'index_spec.js',
- tree: [],
- },
- ],
- },
- ];
- const flattened = utils.flattenTree(tree);
-
- expect(flattened).toEqual([
- {
- type: 'tree',
- name: 'app/javascripts',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- tree: [],
- },
- ],
- },
- {
- type: 'tree',
- name: 'ee/lib/…/…/…/longtreenametomakepath',
- tree: [
- {
- name: 'diff_check.rb',
- tree: [],
- type: 'blob',
- },
- ],
- },
- {
- type: 'tree',
- name: 'spec',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [],
- },
- {
- type: 'blob',
- name: 'index_spec.js',
- tree: [],
- },
- ],
- },
- ]);
- });
- });
-
- describe('convertExpandLines', () => {
- it('converts expanded lines to normal lines', () => {
- const diffLines = [
- {
- type: 'match',
- old_line: 1,
- new_line: 1,
- },
- {
- type: '',
- old_line: 2,
- new_line: 2,
- },
- ];
-
- const lines = utils.convertExpandLines({
- diffLines,
- data: [{ text: 'expanded' }],
- typeKey: 'type',
- oldLineKey: 'old_line',
- newLineKey: 'new_line',
- mapLine: ({ line, oldLine, newLine }) => ({
- ...line,
- old_line: oldLine,
- new_line: newLine,
- }),
- });
-
- expect(lines).toEqual([
- {
- text: 'expanded',
- new_line: 1,
- old_line: 1,
- discussions: [],
- hasForm: false,
- },
- {
- type: '',
- old_line: 2,
- new_line: 2,
- },
- ]);
- });
- });
-});