Create webdav client tests
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 9 Aug 2018 13:53:24 +0000 (15:53 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 9 Aug 2018 13:53:24 +0000 (15:53 +0200)
Feature #13989

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/common/webdav.test.ts [new file with mode: 0644]
src/common/webdav.ts

diff --git a/src/common/webdav.test.ts b/src/common/webdav.test.ts
new file mode 100644 (file)
index 0000000..7da1585
--- /dev/null
@@ -0,0 +1,89 @@
+// 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 = WebDAV.create({ 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(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('PROPFIND', async () => {
+        const { open, load, createRequest } = mockCreateRequest();
+        const webdav = WebDAV.create(undefined, createRequest);
+        const promise = webdav.propfind('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PROPFIND', 'foo');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('PUT', async () => {
+        const { open, send, load, createRequest } = mockCreateRequest();
+        const webdav = WebDAV.create(undefined, createRequest);
+        const promise = webdav.put('foo', { data: 'Test data' });
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('PUT', 'foo');
+        expect(send).toHaveBeenCalledWith('Test data');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('COPY', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = WebDAV.create(undefined, createRequest);
+        const promise = webdav.copy('foo', { destination: 'foo-copy' });
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('COPY', 'foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('MOVE', async () => {
+        const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
+        const webdav = WebDAV.create(undefined, createRequest);
+        const promise = webdav.move('foo', { destination: 'foo-copy' });
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('MOVE', 'foo');
+        expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
+        expect(request).toBeInstanceOf(XMLHttpRequest);
+    });
+
+    it('DELETE', async () => {
+        const { open, load, createRequest } = mockCreateRequest();
+        const webdav = WebDAV.create(undefined, createRequest);
+        const promise = webdav.delete('foo');
+        load();
+        const request = await promise;
+        expect(open).toHaveBeenCalledWith('DELETE', 'foo');
+        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'));
+    return {
+        send,
+        open,
+        load,
+        setRequestHeader,
+        createRequest: () => request
+    };
+};
index 5c7f9d24919a66538ad180a4b727871785f2525b..24dacbdedd6ca6f6fb39264d5803db03aec25096 100644 (file)
@@ -3,8 +3,8 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 export class WebDAV {
-    static create(config?: Partial<WebDAVDefaults>) {
-        return new WebDAV(config);
+    static create(config?: Partial<WebDAVDefaults>, createRequest?: () => XMLHttpRequest) {
+        return new WebDAV(config, createRequest);
     }
 
     defaults: WebDAVDefaults = {
@@ -44,7 +44,7 @@ export class WebDAV {
             method: 'DELETE'
         })
 
-    private constructor(config?: Partial<WebDAVDefaults>) {
+    private constructor(config?: Partial<WebDAVDefaults>, private createRequest = () => new XMLHttpRequest()) {
         if (config) {
             this.defaults = { ...this.defaults, ...config };
         }
@@ -52,7 +52,7 @@ export class WebDAV {
 
     private request = (config: RequestConfig) => {
         return new Promise<XMLHttpRequest>((resolve, reject) => {
-            const r = new XMLHttpRequest();
+            const r = this.createRequest();
             r.open(config.method, this.defaults.baseUrl + config.url);
 
             const headers = { ...this.defaults.headers, ...config.headers };