Add onProgress callback to PutConfig
[arvados-workbench2.git] / src / common / webdav.test.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { WebDAV } from "./webdav";
6
7 describe('WebDAV', () => {
8     it('makes use of provided config', async () => {
9         const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
10         const webdav = WebDAV.create({ baseUrl: 'http://foo.com/', headers: { Authorization: 'Basic' } }, createRequest);
11         const promise = webdav.propfind('foo');
12         load();
13         const request = await promise;
14         expect(open).toHaveBeenCalledWith('PROPFIND', 'http://foo.com/foo');
15         expect(setRequestHeader).toHaveBeenCalledWith('Authorization', 'Basic');
16         expect(request).toBeInstanceOf(XMLHttpRequest);
17     });
18
19     it('PROPFIND', async () => {
20         const { open, load, createRequest } = mockCreateRequest();
21         const webdav = WebDAV.create(undefined, createRequest);
22         const promise = webdav.propfind('foo');
23         load();
24         const request = await promise;
25         expect(open).toHaveBeenCalledWith('PROPFIND', 'foo');
26         expect(request).toBeInstanceOf(XMLHttpRequest);
27     });
28
29     it('PUT', async () => {
30         const { open, send, load, progress, createRequest } = mockCreateRequest();
31         const onProgress = jest.fn();
32         const webdav = WebDAV.create(undefined, createRequest);
33         const promise = webdav.put('foo', { data: 'Test data', onProgress });
34         progress();
35         load();
36         const request = await promise;
37         expect(open).toHaveBeenCalledWith('PUT', 'foo');
38         expect(send).toHaveBeenCalledWith('Test data');
39         expect(onProgress).toHaveBeenCalled();
40         expect(request).toBeInstanceOf(XMLHttpRequest);
41     });
42
43     it('COPY', async () => {
44         const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
45         const webdav = WebDAV.create(undefined, createRequest);
46         const promise = webdav.copy('foo', { destination: 'foo-copy' });
47         load();
48         const request = await promise;
49         expect(open).toHaveBeenCalledWith('COPY', 'foo');
50         expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
51         expect(request).toBeInstanceOf(XMLHttpRequest);
52     });
53
54     it('MOVE', async () => {
55         const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
56         const webdav = WebDAV.create(undefined, createRequest);
57         const promise = webdav.move('foo', { destination: 'foo-copy' });
58         load();
59         const request = await promise;
60         expect(open).toHaveBeenCalledWith('MOVE', 'foo');
61         expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
62         expect(request).toBeInstanceOf(XMLHttpRequest);
63     });
64
65     it('DELETE', async () => {
66         const { open, load, createRequest } = mockCreateRequest();
67         const webdav = WebDAV.create(undefined, createRequest);
68         const promise = webdav.delete('foo');
69         load();
70         const request = await promise;
71         expect(open).toHaveBeenCalledWith('DELETE', 'foo');
72         expect(request).toBeInstanceOf(XMLHttpRequest);
73     });
74 });
75
76 const mockCreateRequest = () => {
77     const send = jest.fn();
78     const open = jest.fn();
79     const setRequestHeader = jest.fn();
80     const request = new XMLHttpRequest();
81     request.send = send;
82     request.open = open;
83     request.setRequestHeader = setRequestHeader;
84     const load = () => request.dispatchEvent(new Event('load'));
85     const progress = () => request.dispatchEvent(new Event('progress'));
86     return {
87         send,
88         open,
89         load,
90         progress,
91         setRequestHeader,
92         createRequest: () => request
93     };
94 };