UNPKG

box-ui-elements-mlh

Version:
292 lines (245 loc) 11.4 kB
import noop from 'lodash/noop'; import FolderUploadNode from '../FolderUploadNode'; import FolderAPI from '../../Folder'; import { ERROR_CODE_ITEM_NAME_IN_USE, STATUS_COMPLETE, ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED, } from '../../../constants'; jest.mock('../../Folder'); jest.mock('../../../utils/uploads', () => ({ ...require.requireActual('../../../utils/uploads'), getFileFromEntry: jest.fn(entry => entry), })); let folderUploadNodeInstance; let folderCreateMock; describe('api/uploads/FolderUploadNode', () => { const name = 'hi'; beforeEach(() => { folderUploadNodeInstance = new FolderUploadNode(name, noop, noop, {}, {}); folderCreateMock = jest.fn((a, b, resolve) => { resolve(); }); FolderAPI.mockClear(); FolderAPI.mockImplementation(() => ({ create: folderCreateMock, })); }); describe('upload()', () => { test('should call createAndUploadFolder(), addFilesToUploadQueue() and uploadChildFolders()', async () => { const errorCallback = () => 'errorCallback'; const parentFolderId = '0'; const isRoot = true; const files = [{ file: 1 }]; folderUploadNodeInstance.createAndUploadFolder = jest.fn(() => Promise.resolve()); folderUploadNodeInstance.addFilesToUploadQueue = jest.fn(); folderUploadNodeInstance.uploadChildFolders = jest.fn(); folderUploadNodeInstance.getFormattedFiles = jest.fn(() => files); folderUploadNodeInstance.getFolderId = jest.fn(() => 123); await folderUploadNodeInstance.upload(parentFolderId, errorCallback, isRoot); expect(folderUploadNodeInstance.createAndUploadFolder).toHaveBeenCalledWith(errorCallback, isRoot); expect(folderUploadNodeInstance.addFilesToUploadQueue).toHaveBeenCalledWith( files, expect.any(Function), true, ); expect(folderUploadNodeInstance.uploadChildFolders).toHaveBeenCalledWith(errorCallback); }); }); describe('uploadChildFolders()', () => { test('should upload all child folders', async () => { const errorCallback = () => 'errorCallback'; const upload1 = jest.fn(); const upload2 = jest.fn(); folderUploadNodeInstance.folders = { a: { upload: upload1, }, b: { upload: upload2, }, }; folderUploadNodeInstance.folderId = '123'; await folderUploadNodeInstance.uploadChildFolders(errorCallback); expect(upload1).toHaveBeenCalledWith(folderUploadNodeInstance.folderId, errorCallback); }); }); describe('createAndUploadFolder()', () => { test('should create folder', async () => { const folderId = '1'; const errorCallback = () => 'errorCallback'; const isRoot = true; folderUploadNodeInstance.createFolder = jest.fn(() => ({ id: folderId, })); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(folderUploadNodeInstance.createFolder).toHaveBeenCalledWith(); expect(folderUploadNodeInstance.folderId).toBe(folderId); }); test('should call errorCallback when create folder fails and error code is not ITEM_NAME_IN_USE', async () => { const errorCallback = jest.fn(); const isRoot = true; const error = { code: 'random' }; folderUploadNodeInstance.createFolder = jest.fn(() => Promise.reject(error)); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(errorCallback).toHaveBeenCalledWith(error); }); test('should recovery correctly from ITEM_NAME_IN_USE', async () => { const errorCallback = jest.fn(); const folderId = '1'; const isRoot = true; const error = { code: ERROR_CODE_ITEM_NAME_IN_USE, context_info: { conflicts: [{ id: folderId }] }, }; folderUploadNodeInstance.createFolder = jest.fn(() => Promise.reject(error)); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(errorCallback).not.toHaveBeenCalledWith(error); expect(folderUploadNodeInstance.folderId).toBe(folderId); }); test('should call addFolderToUploadQueue if the sub-folder(s) already exist', async () => { const folderId = '1'; const errorCallback = jest.fn(); const isRoot = false; const error = { code: ERROR_CODE_ITEM_NAME_IN_USE, context_info: { conflicts: [{ id: folderId }] }, }; folderUploadNodeInstance.name = name; folderUploadNodeInstance.createFolder = jest.fn(() => Promise.reject(error)); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(errorCallback).not.toHaveBeenCalledWith(error); expect(errorCallback).not.toHaveBeenCalledWith({ code: ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED }); expect(folderUploadNodeInstance.addFolderToUploadQueue).toHaveBeenCalledWith({ extension: '', name, status: STATUS_COMPLETE, isFolder: true, size: 1, progress: 100, }); }); test('should call addFolderToUploadQueue when folder is created successfully for non-root folder', async () => { const folderId = '1'; const errorCallback = () => 'errorCallback'; const isRoot = false; folderUploadNodeInstance.name = name; folderUploadNodeInstance.createFolder = jest.fn(() => ({ id: folderId, })); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(folderUploadNodeInstance.addFolderToUploadQueue).toHaveBeenCalledWith({ extension: '', name, status: STATUS_COMPLETE, isFolder: true, size: 1, progress: 100, }); }); test('should not addFolderToUploadQueue() when folder is created successfully for root folder', async () => { const folderId = '1'; const errorCallback = () => 'errorCallback'; const isRoot = true; folderUploadNodeInstance.name = name; folderUploadNodeInstance.createFolder = jest.fn(() => ({ id: folderId, })); folderUploadNodeInstance.addFolderToUploadQueue = jest.fn(); await folderUploadNodeInstance.createAndUploadFolder(errorCallback, isRoot); expect(folderUploadNodeInstance.addFolderToUploadQueue).not.toHaveBeenCalled(); }); }); describe('getFormattedFiles()', () => { test('should return correctly formatted file', () => { const now = Date.now(); Date.now = jest.fn(() => now); const file1 = { name: 1 }; const file2 = { name: 2 }; folderUploadNodeInstance.files = [file1, file2]; folderUploadNodeInstance.folderId = '1'; folderUploadNodeInstance.fileAPIOptions = { a: 1, b: 2 }; const data = folderUploadNodeInstance.getFormattedFiles(); expect(data).toEqual([ { file: file1, options: { ...folderUploadNodeInstance.fileAPIOptions, folderId: folderUploadNodeInstance.folderId, uploadInitTimestamp: now, }, }, { file: file2, options: { ...folderUploadNodeInstance.fileAPIOptions, folderId: folderUploadNodeInstance.folderId, uploadInitTimestamp: now, }, }, ]); }); }); describe('createFolder()', () => { test('create folder with folderAPI', async () => { const parentFolderId = '0'; folderUploadNodeInstance.folderId = '123'; folderUploadNodeInstance.folderId = '123'; folderUploadNodeInstance.parentFolderId = parentFolderId; await folderUploadNodeInstance.createFolder(); expect(FolderAPI).toHaveBeenCalled(); expect(folderCreateMock).toHaveBeenCalled(); }); }); describe('buildCurrentFolderFromEntry()', () => { test('should resolve when entry is empty', async () => { folderUploadNodeInstance.entry = undefined; try { await folderUploadNodeInstance.buildCurrentFolderFromEntry(); } catch (error) { throw Error('buildCurrentFolderFromEntry throws an error'); } }); test('should readEntry() when entry is not empty', async () => { const reader = { reader: true }; folderUploadNodeInstance.readEntry = (readerParam, resolve) => { expect(readerParam).toEqual(reader); resolve(); }; folderUploadNodeInstance.entry = { createReader: () => reader, }; await folderUploadNodeInstance.buildCurrentFolderFromEntry(); }); }); describe('readEntry()', () => { test('should call readEntries() on the reader instance', async () => { const readEntriesMock = jest.fn(); const reader = { readEntries: readEntriesMock }; await folderUploadNodeInstance.readEntry(reader, noop); expect(readEntriesMock).toHaveBeenCalledTimes(1); }); }); describe('createFolderUploadNodesFromEntries()', () => { test('should create folders and files from entries', async () => { const entries = [ { name: '1', isFile: true }, { name: '2', isFile: false }, { name: '3', isFile: true }, ]; await folderUploadNodeInstance.createFolderUploadNodesFromEntries(entries); expect(folderUploadNodeInstance.files).toEqual([ { name: '1', isFile: true }, { name: '3', isFile: true }, ]); expect(Object.keys(folderUploadNodeInstance.folders)).toHaveLength(1); expect(folderUploadNodeInstance.folders['2'].name).toEqual('2'); expect(folderUploadNodeInstance.folders['2'].entry).toEqual(entries[1]); }); }); });