Skip to content

Commit d0241de

Browse files
committed
test: add multipart file upload handling in PUT request handler
1 parent eb5eb59 commit d0241de

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

test/webdav/handlers/PUT.handler.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,76 @@ describe('PUT request handler', () => {
207207
expect(deleteDBFileStub).toHaveBeenCalledOnce();
208208
expect(deleteDriveFileStub).toHaveBeenCalledOnce();
209209
});
210+
211+
it('When the Drive destination folder is found, then it should upload the multipart file', async () => {
212+
const driveDatabaseManager = getDriveDatabaseManager();
213+
const downloadService = DownloadService.instance;
214+
const uploadService = UploadService.instance;
215+
const cryptoService = CryptoService.instance;
216+
const authService = AuthService.instance;
217+
const networkFacade = new NetworkFacade(getNetworkMock(), uploadService, downloadService, cryptoService);
218+
const sut = new PUTRequestHandler({
219+
driveFileService: DriveFileService.instance,
220+
driveFolderService: DriveFolderService.instance,
221+
authService: AuthService.instance,
222+
trashService: TrashService.instance,
223+
networkFacade,
224+
driveDatabaseManager,
225+
});
226+
227+
const multipartFileSize = 105 * 1024 * 1024;
228+
229+
const requestedFileResource: WebDavRequestedResource = getRequestedFileResource();
230+
const requestedParentFolderResource: WebDavRequestedResource = getRequestedFolderResource({
231+
parentFolder: '/',
232+
folderName: '',
233+
});
234+
const folderFixture = newFolderItem({ name: requestedParentFolderResource.name });
235+
const fileFixture = newDriveFile({
236+
folderId: folderFixture.id,
237+
folderUuid: folderFixture.uuid,
238+
size: multipartFileSize,
239+
});
240+
241+
const request = createWebDavRequestFixture({
242+
method: 'PUT',
243+
url: requestedFileResource.url,
244+
headers: {
245+
'content-length': multipartFileSize.toString(),
246+
},
247+
});
248+
249+
const response = createWebDavResponseFixture({
250+
status: vi.fn().mockReturnValue({ send: vi.fn() }),
251+
});
252+
253+
const getRequestedResourceStub = vi
254+
.spyOn(WebDavUtils, 'getRequestedResource')
255+
.mockResolvedValueOnce(requestedFileResource)
256+
.mockResolvedValueOnce(requestedParentFolderResource);
257+
const getAndSearchItemFromResourceStub = vi
258+
.spyOn(WebDavUtils, 'getAndSearchItemFromResource')
259+
.mockResolvedValueOnce(folderFixture)
260+
.mockRejectedValue(new Error());
261+
const getAuthDetailsStub = vi.spyOn(authService, 'getAuthDetails').mockResolvedValue(UserCredentialsFixture);
262+
const uploadMultipartFromStreamStub = vi
263+
.spyOn(networkFacade, 'uploadMultipartFromStream')
264+
.mockResolvedValue([
265+
Promise.resolve({ fileId: '09218313209', hash: Buffer.from('test') }),
266+
new AbortController(),
267+
]);
268+
const createDriveFileStub = vi
269+
.spyOn(DriveFileService.instance, 'createFile')
270+
.mockResolvedValue(fileFixture.toItem());
271+
const createDBFileStub = vi.spyOn(driveDatabaseManager, 'createFile').mockResolvedValue(fileFixture);
272+
273+
await sut.handle(request, response);
274+
expect(response.status).toHaveBeenCalledWith(200);
275+
expect(getRequestedResourceStub).toHaveBeenCalledTimes(2);
276+
expect(getAndSearchItemFromResourceStub).toHaveBeenCalledTimes(2);
277+
expect(getAuthDetailsStub).toHaveBeenCalledOnce();
278+
expect(uploadMultipartFromStreamStub).toHaveBeenCalledOnce();
279+
expect(createDriveFileStub).toHaveBeenCalledOnce();
280+
expect(createDBFileStub).toHaveBeenCalledOnce();
281+
});
210282
});

0 commit comments

Comments
 (0)