Merge branch '18874-merge-wb2'
[arvados.git] / services / workbench2 / src / common / webdav.test.ts
diff --git a/services/workbench2/src/common/webdav.test.ts b/services/workbench2/src/common/webdav.test.ts
new file mode 100644 (file)
index 0000000..1149c45
--- /dev/null
@@ -0,0 +1,159 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { WebDAV } from "./webdav";
+
+describe('WebDAV', () => {
+    it('makes use of provided config', async () => {
+        const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://foo.com/', headers: { Authorization: 'Basic' } }, createRequest);
+        const promise = webdav.propfind('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PROPFIND', 'http://foo.com/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Authorization', 'Basic');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('allows to modify defaults after instantiation', async () => {
+        const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://foo.com/' }, createRequest);
+        webdav.setAuthorization('Basic');
+        const promise = webdav.propfind('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PROPFIND', 'http://foo.com/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Authorization', 'Basic');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('PROPFIND', async () => {
+        const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV(undefined, createRequest);
+        const promise = webdav.propfind('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PROPFIND', 'foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('PUT', async () => {
+        const { open, send, load, progress, setRequestHeader, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV(undefined, createRequest);
+        const promise = webdav.put('foo', 'Test data');
+        progress();
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PUT', 'foo');
+        expect(send).toHaveBeenCalledWith('Test data');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('COPY', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.copy('foo', 'foo-copy');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('COPY', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-copy');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('COPY - adds baseURL with trailing slash to Destination header', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.copy('foo', 'foo-copy');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('COPY', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-copy');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('COPY - adds baseURL without trailing slash to Destination header', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.copy('foo', 'foo-copy');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('COPY', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-copy');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('MOVE', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.move('foo', 'foo-moved');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('MOVE', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-moved');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('MOVE - adds baseURL with trailing slash to Destination header', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.move('foo', 'foo-moved');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('MOVE', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-moved');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('MOVE - adds baseURL without trailing slash to Destination header', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV({ baseURL: 'http://base' }, createRequest);
+        const promise = webdav.move('foo', 'foo-moved');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('MOVE', 'http://base/foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'http://base/foo-moved');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('DELETE', async () => {
+        const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
+        const webdav = new WebDAV(undefined, createRequest);
+        const promise = webdav.delete('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('DELETE', 'foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+});
+
+const mockCreateRequest = () => {
+    const send = jest.fn();
+    const open = jest.fn();
+    const setRequestHeader = jest.fn();
+    const request = new XMLHttpRequest();
+    request.send = send;
+    request.open = open;
+    request.setRequestHeader = setRequestHeader;
+    const load = () => request.dispatchEvent(new Event('load'));
+    const progress = () => request.dispatchEvent(new Event('progress'));
+    return {
+        send,
+        open,
+        load,
+        progress,
+        setRequestHeader,
+        createRequest: () => request
+    };
+};