diff options
Diffstat (limited to 'spec/frontend/snippets/utils/blob_spec.js')
-rw-r--r-- | spec/frontend/snippets/utils/blob_spec.js | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/spec/frontend/snippets/utils/blob_spec.js b/spec/frontend/snippets/utils/blob_spec.js new file mode 100644 index 00000000000..ba39b9fec36 --- /dev/null +++ b/spec/frontend/snippets/utils/blob_spec.js @@ -0,0 +1,134 @@ +import { cloneDeep } from 'lodash'; +import { + SNIPPET_BLOB_ACTION_CREATE, + SNIPPET_BLOB_ACTION_UPDATE, + SNIPPET_BLOB_ACTION_MOVE, + SNIPPET_BLOB_ACTION_DELETE, +} from '~/snippets/constants'; +import { decorateBlob, createBlob, diffAll } from '~/snippets/utils/blob'; + +jest.mock('lodash/uniqueId', () => arg => `${arg}fakeUniqueId`); + +const TEST_RAW_BLOB = { + rawPath: '/test/blob/7/raw', +}; +const CONTENT_1 = 'Lorem ipsum dolar\nSit amit\n\nGoodbye!\n'; +const CONTENT_2 = 'Lorem ipsum dolar sit amit.\n\nGoodbye!\n'; + +describe('~/snippets/utils/blob', () => { + describe('decorateBlob', () => { + it('should decorate the given object with local blob properties', () => { + const orig = cloneDeep(TEST_RAW_BLOB); + + expect(decorateBlob(orig)).toEqual({ + ...TEST_RAW_BLOB, + id: 'blob_local_fakeUniqueId', + isLoaded: false, + content: '', + }); + }); + }); + + describe('createBlob', () => { + it('should create an empty local blob', () => { + expect(createBlob()).toEqual({ + id: 'blob_local_fakeUniqueId', + isLoaded: true, + content: '', + path: '', + }); + }); + }); + + describe('diffAll', () => { + // This object contains entries that contain an expected "diff" and the `id` + // or `origContent` that should be used to generate the expected diff. + const testEntries = { + created: { + id: 'blob_1', + diff: { + action: SNIPPET_BLOB_ACTION_CREATE, + filePath: '/new/file', + previousPath: '/new/file', + content: CONTENT_1, + }, + }, + deleted: { + id: 'blob_2', + diff: { + action: SNIPPET_BLOB_ACTION_DELETE, + filePath: '/src/delete/me', + previousPath: '/src/delete/me', + content: CONTENT_1, + }, + }, + updated: { + id: 'blob_3', + origContent: CONTENT_1, + diff: { + action: SNIPPET_BLOB_ACTION_UPDATE, + filePath: '/lorem.md', + previousPath: '/lorem.md', + content: CONTENT_2, + }, + }, + renamed: { + id: 'blob_4', + diff: { + action: SNIPPET_BLOB_ACTION_MOVE, + filePath: '/dolar.md', + previousPath: '/ipsum.md', + content: CONTENT_1, + }, + }, + renamedAndUpdated: { + id: 'blob_5', + origContent: CONTENT_1, + diff: { + action: SNIPPET_BLOB_ACTION_MOVE, + filePath: '/sit.md', + previousPath: '/sit/amit.md', + content: CONTENT_2, + }, + }, + }; + const createBlobsFromTestEntries = (entries, isOrig = false) => + entries.reduce( + (acc, { id, diff, origContent }) => + Object.assign(acc, { + [id]: { + id, + content: isOrig && origContent ? origContent : diff.content, + path: isOrig ? diff.previousPath : diff.filePath, + }, + }), + {}, + ); + + it('should create diff from original files', () => { + const origBlobs = createBlobsFromTestEntries( + [ + testEntries.deleted, + testEntries.updated, + testEntries.renamed, + testEntries.renamedAndUpdated, + ], + true, + ); + const blobs = createBlobsFromTestEntries([ + testEntries.created, + testEntries.updated, + testEntries.renamed, + testEntries.renamedAndUpdated, + ]); + + expect(diffAll(blobs, origBlobs)).toEqual([ + testEntries.deleted.diff, + testEntries.created.diff, + testEntries.updated.diff, + testEntries.renamed.diff, + testEntries.renamedAndUpdated.diff, + ]); + }); + }); +}); |