--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import axios, { AxiosInstance } from "axios";
+// import MockAdapter from 'axios-mock-adapter';
+import { ApiClientAuthorizationService } from "./api-client-authorization-service";
+
+
+describe('ApiClientAuthorizationService', () => {
+ let apiClientAuthorizationService: ApiClientAuthorizationService;
+ let serverApi: AxiosInstance;
+ let actions;
+
+
+ beforeEach(() => {
+ serverApi = axios.create();
+ actions = {
+ progressFn: jest.fn(),
+ } as any;
+ apiClientAuthorizationService = new ApiClientAuthorizationService(serverApi, actions);
+ });
+
+ describe('createCollectionSharingToken', () => {
+ it('should return error on invalid collection uuid', () => {
+ expect(() => apiClientAuthorizationService.createCollectionSharingToken("foo")).toThrowError("UUID foo is not a collection");
+ });
+
+ it('should make a create request with proper scopes', async () => {
+ serverApi.post = jest.fn(() => Promise.resolve(
+ { data: { uuid: 'zzzzz-4zz18-0123456789abcde' } }
+ ));
+ const uuid = 'zzzzz-4zz18-0123456789abcde'
+ await apiClientAuthorizationService.createCollectionSharingToken(uuid);
+ expect(serverApi.post).toHaveBeenCalledWith(
+ '/api_client_authorizations', {
+ scopes: [
+ `GET /arvados/v1/collections/${uuid}`,
+ `GET /arvados/v1/collections/${uuid}/`,
+ `GET /arvados/v1/keep_services/accessible`,
+ ]
+ }
+ );
+ });
+ });
+
+ describe('listCollectionSharingToken', () => {
+ it('should return error on invalid collection uuid', () => {
+ expect(() => apiClientAuthorizationService.listCollectionSharingTokens("foo")).toThrowError("UUID foo is not a collection");
+ });
+
+ it('should make a list request with proper scopes', async () => {
+ serverApi.get = jest.fn(() => Promise.resolve(
+ { data: { items: [{}] } }
+ ));
+ const uuid = 'zzzzz-4zz18-0123456789abcde'
+ await apiClientAuthorizationService.listCollectionSharingTokens(uuid);
+ expect(serverApi.get).toHaveBeenCalledWith(
+ `/api_client_authorizations`, {params: {
+ filters: '[["scopes","=","' + JSON.stringify([
+ `GET /arvados/v1/collections/${uuid}`,
+ `GET /arvados/v1/collections/${uuid}/`,
+ `GET /arvados/v1/keep_services/accessible`,
+ ]) + '"]]',
+ select: undefined,
+ }}
+ );
+ });
+ });
+});
\ No newline at end of file
import { AxiosInstance } from "axios";
import { ApiActions } from 'services/api/api-actions';
import { ApiClientAuthorization } from 'models/api-client-authorization';
-import { CommonService } from 'services/common-service/common-service';
+import { CommonService, ListResults } from 'services/common-service/common-service';
+import { extractUuidObjectType, ResourceObjectType } from "models/resource";
+import { FilterBuilder } from "services/api/filter-builder";
export class ApiClientAuthorizationService extends CommonService<ApiClientAuthorization> {
constructor(serverApi: AxiosInstance, actions: ApiActions) {
super(serverApi, "api_client_authorizations", actions);
}
-}
\ No newline at end of file
+
+ createCollectionSharingToken(uuid: string): Promise<ApiClientAuthorization> {
+ if (extractUuidObjectType(uuid) !== ResourceObjectType.COLLECTION) {
+ throw new Error(`UUID ${uuid} is not a collection`);
+ }
+ return this.create({
+ scopes: [
+ `GET /arvados/v1/collections/${uuid}`,
+ `GET /arvados/v1/collections/${uuid}/`,
+ `GET /arvados/v1/keep_services/accessible`,
+ ]
+ });
+ }
+
+ listCollectionSharingTokens(uuid: string): Promise<ListResults<ApiClientAuthorization>> {
+ if (extractUuidObjectType(uuid) !== ResourceObjectType.COLLECTION) {
+ throw new Error(`UUID ${uuid} is not a collection`);
+ }
+ return this.list({
+ filters: new FilterBuilder()
+ .addEqual("scopes", JSON.stringify([
+ `GET /arvados/v1/collections/${uuid}`,
+ `GET /arvados/v1/collections/${uuid}/`,
+ "GET /arvados/v1/keep_services/accessible",
+ ])).getFilters()
+ });
+ }
+}
\ No newline at end of file