diff options
Diffstat (limited to 'spec/frontend/diffs/store/utils_spec.js')
-rw-r--r-- | spec/frontend/diffs/store/utils_spec.js | 243 |
1 files changed, 156 insertions, 87 deletions
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js index 641373e666f..891de45e268 100644 --- a/spec/frontend/diffs/store/utils_spec.js +++ b/spec/frontend/diffs/store/utils_spec.js @@ -14,9 +14,11 @@ import { } from '~/diffs/constants'; import { MERGE_REQUEST_NOTEABLE_TYPE } from '~/notes/constants'; import diffFileMockData from '../mock_data/diff_file'; +import { diffMetadata } from '../mock_data/diff_metadata'; import { noteableDataMock } from '../../notes/mock_data'; const getDiffFileMock = () => JSON.parse(JSON.stringify(diffFileMockData)); +const getDiffMetadataMock = () => JSON.parse(JSON.stringify(diffMetadata)); describe('DiffsStoreUtils', () => { describe('findDiffFile', () => { @@ -187,6 +189,7 @@ describe('DiffsStoreUtils', () => { }, diffViewType: PARALLEL_DIFF_VIEW_TYPE, linePosition: LINE_POSITION_LEFT, + lineRange: { start_line_code: 'abc_1_1', end_line_code: 'abc_2_2' }, }; const position = JSON.stringify({ @@ -198,6 +201,7 @@ describe('DiffsStoreUtils', () => { position_type: TEXT_DIFF_POSITION_TYPE, old_line: options.noteTargetLine.old_line, new_line: options.noteTargetLine.new_line, + line_range: options.lineRange, }); const postData = { @@ -428,112 +432,177 @@ describe('DiffsStoreUtils', () => { }); describe('prepareDiffData', () => { - let mock; - let preparedDiff; - let splitInlineDiff; - let splitParallelDiff; - let completedDiff; + describe('for regular diff files', () => { + let mock; + let preparedDiff; + let splitInlineDiff; + let splitParallelDiff; + let completedDiff; + + beforeEach(() => { + mock = getDiffFileMock(); + + preparedDiff = { diff_files: [mock] }; + splitInlineDiff = { + diff_files: [{ ...mock, parallel_diff_lines: undefined }], + }; + splitParallelDiff = { + diff_files: [{ ...mock, highlighted_diff_lines: undefined }], + }; + completedDiff = { + diff_files: [{ ...mock, highlighted_diff_lines: undefined }], + }; - beforeEach(() => { - mock = getDiffFileMock(); - preparedDiff = { diff_files: [mock] }; - splitInlineDiff = { - diff_files: [{ ...mock, parallel_diff_lines: undefined }], - }; - splitParallelDiff = { - diff_files: [{ ...mock, highlighted_diff_lines: undefined }], - }; - completedDiff = { - diff_files: [{ ...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]); + }); - 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]; - 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(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('-'); - expect(firstParallelChar).not.toBe(' '); - expect(firstParallelChar).not.toBe('+'); - expect(firstParallelChar).not.toBe('-'); + const checkLine = preparedDiff.diff_files[0].highlighted_diff_lines[0]; - 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(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(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(); + }); - 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('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]; - 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); + }); - 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('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('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); - 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]); + }); - 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, + expect.objectContaining({ + content_sha: 'ABC', + file_hash: 'DEF', + }), + ]); + }); }); - 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); + describe('for diff metadata', () => { + let mock; + let preparedDiffFiles; - expect(updatedFilesList).toEqual([ - mock, - expect.objectContaining({ - content_sha: 'ABC', - file_hash: 'DEF', - }), - ]); + beforeEach(() => { + mock = getDiffMetadataMock(); + + preparedDiffFiles = utils.prepareDiffData(mock); + }); + + it('sets the renderIt and collapsed attribute on files', () => { + expect(preparedDiffFiles[0].renderIt).toBeTruthy(); + expect(preparedDiffFiles[0].collapsed).toBeFalsy(); + }); + + it('guarantees an empty array of lines for both diff styles', () => { + expect(preparedDiffFiles[0].parallel_diff_lines.length).toEqual(0); + expect(preparedDiffFiles[0].highlighted_diff_lines.length).toEqual(0); + }); + + it('leaves files in the existing state', () => { + const fileMock = getDiffFileMock(); + const metaData = getDiffMetadataMock(); + const priorFiles = [fileMock]; + const updatedFilesList = utils.prepareDiffData(metaData, priorFiles); + + expect(updatedFilesList.length).toEqual(2); + expect(updatedFilesList[0]).toEqual(fileMock); + }); + + it('adds a new file to the file that already exists in state', () => { + // This is actually buggy behavior: + // Because the metadata doesn't include a content_sha, + // the de-duplicator in prepareDiffData doesn't realize it + // should combine these two. + + // This buggy behavior hasn't caused a defect YET, because + // `diffs_metadata.json` is only called the first time the + // diffs app starts up, which is: + // - after a fresh page load + // - after you switch to the changes tab *the first time* + + // This test should begin FAILING and can be reversed to check + // for just a single file when this is implemented: + // https://gitlab.com/groups/gitlab-org/-/epics/2852#note_304803233 + + const fileMock = getDiffFileMock(); + const metaMock = getDiffMetadataMock(); + const priorFiles = [{ ...fileMock }]; + const updatedFilesList = utils.prepareDiffData(metaMock, priorFiles); + + expect(updatedFilesList).toEqual([ + fileMock, + { + ...metaMock.diff_files[0], + highlighted_diff_lines: [], + parallel_diff_lines: [], + }, + ]); + }); }); }); |