Feature #13989
Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>
export const CONFIG_URL = process.env.REACT_APP_ARVADOS_CONFIG_URL || "/config.json";
export interface Config {
export const CONFIG_URL = process.env.REACT_APP_ARVADOS_CONFIG_URL || "/config.json";
export interface Config {
- API_HOST: string;
- KEEP_WEB_HOST: string;
+ apiHost: string;
+ keepWebHost: string;
}
export const fetchConfig = () => {
}
export const fetchConfig = () => {
const mapConfig = (config: Config): Config => ({
...config,
const mapConfig = (config: Config): Config => ({
...config,
- API_HOST: addProtocol(config.API_HOST)
+ apiHost: addProtocol(config.apiHost),
+ keepWebHost: addProtocol(config.keepWebHost)
});
const getDefaultConfig = (): Config => ({
});
const getDefaultConfig = (): Config => ({
- API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || "",
- KEEP_WEB_HOST: process.env.REACT_APP_ARVADOS_KEEP_WEB_HOST || ""
+ apiHost: process.env.REACT_APP_ARVADOS_API_HOST || "",
+ keepWebHost: process.env.REACT_APP_ARVADOS_KEEP_WEB_HOST || ""
});
const addProtocol = (url: string) => `${window.location.protocol}//${url}`;
});
const addProtocol = (url: string) => `${window.location.protocol}//${url}`;
describe('WebDAV', () => {
it('makes use of provided config', async () => {
const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
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 webdav = new WebDAV({ baseURL: 'http://foo.com/', headers: { Authorization: 'Basic' } }, createRequest);
const promise = webdav.propfind('foo');
load();
const request = await promise;
const promise = webdav.propfind('foo');
load();
const request = await promise;
it('allows to modify defaults after instantiation', async () => {
const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
it('allows to modify defaults after instantiation', async () => {
const { open, load, setRequestHeader, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
- webdav.defaults.baseUrl = 'http://foo.com/';
+ const webdav = new WebDAV(undefined, createRequest);
+ webdav.defaults.baseURL = 'http://foo.com/';
webdav.defaults.headers = { Authorization: 'Basic' };
const promise = webdav.propfind('foo');
load();
webdav.defaults.headers = { Authorization: 'Basic' };
const promise = webdav.propfind('foo');
load();
it('PROPFIND', async () => {
const { open, load, createRequest } = mockCreateRequest();
it('PROPFIND', async () => {
const { open, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
+ const webdav = new WebDAV(undefined, createRequest);
const promise = webdav.propfind('foo');
load();
const request = await promise;
const promise = webdav.propfind('foo');
load();
const request = await promise;
it('PUT', async () => {
const { open, send, load, progress, createRequest } = mockCreateRequest();
const onProgress = jest.fn();
it('PUT', async () => {
const { open, send, load, progress, createRequest } = mockCreateRequest();
const onProgress = jest.fn();
- const webdav = WebDAV.create(undefined, createRequest);
- const promise = webdav.put('foo', { data: 'Test data', onProgress });
+ const webdav = new WebDAV(undefined, createRequest);
+ const promise = webdav.put('foo', 'Test data', { onProgress });
progress();
load();
const request = await promise;
progress();
load();
const request = await promise;
it('COPY', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
it('COPY', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
- const promise = webdav.copy('foo', { destination: 'foo-copy' });
+ const webdav = new WebDAV(undefined, createRequest);
+ const promise = webdav.copy('foo', 'foo-copy');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('COPY', 'foo');
expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
expect(request).toBeInstanceOf(XMLHttpRequest);
});
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('COPY', 'foo');
expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy');
expect(request).toBeInstanceOf(XMLHttpRequest);
});
-
- it('COPY - adds baseUrl to Destination header', async () => {
+
+ it('COPY - adds baseURL to Destination header', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
- webdav.defaults.baseUrl = 'base/';
- const promise = webdav.copy('foo', { destination: 'foo-copy' });
+ const webdav = new WebDAV(undefined, createRequest);
+ webdav.defaults.baseURL = 'base/';
+ const promise = webdav.copy('foo', 'foo-copy');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('COPY', 'base/foo');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('COPY', 'base/foo');
it('MOVE', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
it('MOVE', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
- const promise = webdav.move('foo', { destination: 'foo-copy' });
+ const webdav = new WebDAV(undefined, createRequest);
+ const promise = webdav.move('foo', 'foo-copy');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('MOVE', 'foo');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('MOVE', 'foo');
expect(request).toBeInstanceOf(XMLHttpRequest);
});
expect(request).toBeInstanceOf(XMLHttpRequest);
});
- it('MOVE - adds baseUrl to Destination header', async () => {
+ it('MOVE - adds baseURL to Destination header', async () => {
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
const { open, setRequestHeader, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
- webdav.defaults.baseUrl = 'base/';
- const promise = webdav.move('foo', { destination: 'foo-moved' });
+ const webdav = new WebDAV(undefined, createRequest);
+ webdav.defaults.baseURL = 'base/';
+ const promise = webdav.move('foo', 'foo-moved');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('MOVE', 'base/foo');
load();
const request = await promise;
expect(open).toHaveBeenCalledWith('MOVE', 'base/foo');
it('DELETE', async () => {
const { open, load, createRequest } = mockCreateRequest();
it('DELETE', async () => {
const { open, load, createRequest } = mockCreateRequest();
- const webdav = WebDAV.create(undefined, createRequest);
+ const webdav = new WebDAV(undefined, createRequest);
const promise = webdav.delete('foo');
load();
const request = await promise;
const promise = webdav.delete('foo');
load();
const request = await promise;
// SPDX-License-Identifier: AGPL-3.0
export class WebDAV {
// SPDX-License-Identifier: AGPL-3.0
export class WebDAV {
- static create(config?: Partial<WebDAVDefaults>, createRequest?: () => XMLHttpRequest) {
- return new WebDAV(config, createRequest);
- }
defaults: WebDAVDefaults = {
defaults: WebDAVDefaults = {
- propfind = (url: string, config: PropfindConfig = {}) =>
+ constructor(config?: Partial<WebDAVDefaults>, private createRequest = () => new XMLHttpRequest()) {
+ if (config) {
+ this.defaults = { ...this.defaults, ...config };
+ }
+ }
+
+ propfind = (url: string, config: WebDAVRequestConfig = {}) =>
this.request({
...config, url,
method: 'PROPFIND'
})
this.request({
...config, url,
method: 'PROPFIND'
})
- put = (url: string, config: PutConfig = {}) =>
+ put = (url: string, data?: any, config: WebDAVRequestConfig = {}) =>
this.request({
...config, url,
this.request({
...config, url,
- copy = (url: string, { destination, ...config }: CopyConfig) =>
+ copy = (url: string, destination: string, config: WebDAVRequestConfig = {}) =>
this.request({
...config, url,
method: 'COPY',
this.request({
...config, url,
method: 'COPY',
- headers: { ...config.headers, Destination: this.defaults.baseUrl + destination }
+ headers: { ...config.headers, Destination: this.defaults.baseURL + destination }
- move = (url: string, { destination, ...config }: MoveConfig) =>
+ move = (url: string, destination: string, config: WebDAVRequestConfig = {}) =>
this.request({
...config, url,
method: 'MOVE',
this.request({
...config, url,
method: 'MOVE',
- headers: { ...config.headers, Destination: this.defaults.baseUrl + destination }
+ headers: { ...config.headers, Destination: this.defaults.baseURL + destination }
- delete = (url: string, config: DeleteConfig = {}) =>
+ delete = (url: string, config: WebDAVRequestConfig = {}) =>
this.request({
...config, url,
method: 'DELETE'
})
this.request({
...config, url,
method: 'DELETE'
})
- private constructor(config?: Partial<WebDAVDefaults>, private createRequest = () => new XMLHttpRequest()) {
- if (config) {
- this.defaults = { ...this.defaults, ...config };
- }
- }
private request = (config: RequestConfig) => {
return new Promise<XMLHttpRequest>((resolve, reject) => {
const r = this.createRequest();
private request = (config: RequestConfig) => {
return new Promise<XMLHttpRequest>((resolve, reject) => {
const r = this.createRequest();
- r.open(config.method, this.defaults.baseUrl + config.url);
+ r.open(config.method, this.defaults.baseURL + config.url);
const headers = { ...this.defaults.headers, ...config.headers };
Object
const headers = { ...this.defaults.headers, ...config.headers };
Object
-
-export interface PropfindConfig extends BaseConfig { }
-
-export interface PutConfig extends BaseConfig {
- data?: any;
- onProgress?: (event: ProgressEvent) => void;
-}
-
-export interface CopyConfig extends BaseConfig {
- destination: string;
-}
-
-export interface MoveConfig extends BaseConfig {
- destination: string;
-}
-
-export interface DeleteConfig extends BaseConfig { }
-
-interface BaseConfig {
+export interface WebDAVRequestConfig {
headers?: {
[key: string]: string;
};
headers?: {
[key: string]: string;
};
+ onProgress?: (event: ProgressEvent) => void;
}
interface WebDAVDefaults {
}
interface WebDAVDefaults {
headers: { [key: string]: string };
}
headers: { [key: string]: string };
}
export const createServices = (config: Config) => {
const apiClient = Axios.create();
export const createServices = (config: Config) => {
const apiClient = Axios.create();
- apiClient.defaults.baseURL = `${config.API_HOST}/arvados/v1`;
+ apiClient.defaults.baseURL = `${config.apiHost}/arvados/v1`;
- const webdavClient = WebDAV.create();
- webdavClient.defaults.baseUrl = config.KEEP_WEB_HOST;
+ const webdavClient = new WebDAV();
+ webdavClient.defaults.baseURL = config.keepWebHost;
- const authService = new AuthService(apiClient, config.API_HOST);
+ const authService = new AuthService(apiClient, config.apiHost);
const keepService = new KeepService(apiClient);
const groupsService = new GroupsService(apiClient);
const projectService = new ProjectService(apiClient);
const keepService = new KeepService(apiClient);
const groupsService = new GroupsService(apiClient);
const projectService = new ProjectService(apiClient);
let store: RootStore;
beforeEach(() => {
let store: RootStore;
beforeEach(() => {
- store = configureStore(createBrowserHistory(), createServices({ API_HOST: "/arvados/v1", KEEP_WEB_HOST: "" }));
+ store = configureStore(createBrowserHistory(), createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
- reducer = authReducer(createServices({ API_HOST: "/arvados/v1", KEEP_WEB_HOST: "" }));
+ reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
});
it('should initialise state with user and api token from local storage', () => {
});
it('should initialise state with user and api token from local storage', () => {
beforeAll(() => {
localStorage.clear();
beforeAll(() => {
localStorage.clear();
- reducer = authReducer(createServices({ API_HOST: "/arvados/v1", KEEP_WEB_HOST: "" }));
+ reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
});
it('should correctly initialise state', () => {
});
it('should correctly initialise state', () => {