//
// SPDX-License-Identifier: AGPL-3.0
-import { initAuth } from "./auth-action";
+import { getNewExtraToken, initAuth } from "./auth-action";
import { API_TOKEN_KEY } from "~/services/auth-service/auth-service";
import 'jest-localstorage-mock';
import MockAdapter from "axios-mock-adapter";
import { ImportMock } from 'ts-mock-imports';
import * as servicesModule from "~/services/services";
+import { SessionStatus } from "~/models/session";
describe('auth-actions', () => {
const axiosInst = Axios.create({ headers: {} });
importMocks.map(m => m.restore());
});
- it('should initialise state with user and api token from local storage', (done) => {
-
+ it('creates an extra token', async () => {
axiosMock
.onGet("/users/current")
.reply(200, {
is_active: true,
username: "jdoe",
prefs: {}
+ })
+ .onGet("/api_client_authorizations/current")
+ .reply(200, {
+ expires_at: "2140-01-01T00:00:00.000Z",
+ api_token: 'extra token',
+ })
+ .onPost("/api_client_authorizations")
+ .replyOnce(200, {
+ uuid: 'zzzzz-gj3su-xxxxxxxxxx',
+ apiToken: 'extra token',
+ })
+ .onPost("/api_client_authorizations")
+ .reply(200, {
+ uuid: 'zzzzz-gj3su-xxxxxxxxxx',
+ apiToken: 'extra additional token',
});
+ importMocks.push(ImportMock.mockFunction(servicesModule, 'createServices', services));
+ sessionStorage.setItem(ACCOUNT_LINK_STATUS_KEY, "0");
+ localStorage.setItem(API_TOKEN_KEY, "token");
+
+ const config: any = {
+ rootUrl: "https://zzzzz.arvadosapi.com",
+ uuidPrefix: "zzzzz",
+ remoteHosts: { },
+ apiRevision: 12345678,
+ clusterConfig: {
+ Login: { LoginCluster: "" },
+ },
+ };
+
+ // Set up auth, confirm that no extra token was requested
+ await store.dispatch(initAuth(config))
+ expect(store.getState().auth.apiToken).toBeDefined();
+ expect(store.getState().auth.extraApiToken).toBeUndefined();
+
+ // Ask for an extra token
+ await store.dispatch(getNewExtraToken());
+ expect(store.getState().auth.apiToken).toBeDefined();
+ expect(store.getState().auth.extraApiToken).toBeDefined();
+ const extraToken = store.getState().auth.extraApiToken;
+
+ // Ask for a cached extra token
+ await store.dispatch(getNewExtraToken(true));
+ expect(store.getState().auth.extraApiToken).toBe(extraToken);
+
+ // Ask for a new extra token, should make a second api request
+ await store.dispatch(getNewExtraToken(false));
+ expect(store.getState().auth.extraApiToken).toBeDefined();
+ expect(store.getState().auth.extraApiToken).not.toBe(extraToken);
+ });
+
+ it('should initialise state with user and api token from local storage', (done) => {
axiosMock
+ .onGet("/users/current")
+ .reply(200, {
+ email: "test@test.com",
+ first_name: "John",
+ last_name: "Doe",
+ uuid: "zzzzz-tpzed-abcefg",
+ owner_uuid: "ownerUuid",
+ is_admin: false,
+ is_active: true,
+ username: "jdoe",
+ prefs: {}
+ })
.onGet("/api_client_authorizations/current")
.reply(200, {
expires_at: "2140-01-01T00:00:00.000Z"
- });
-
- axiosMock
+ })
.onGet("https://xc59z.arvadosapi.com/discovery/v1/apis/arvados/v1/rest")
.reply(200, {
baseUrl: "https://xc59z.arvadosapi.com/arvados/v1",
const auth = store.getState().auth;
if (auth.apiToken === "token" &&
auth.sessions.length === 2 &&
- auth.sessions[0].status === 2 &&
- auth.sessions[1].status === 2
+ auth.sessions[0].status === SessionStatus.VALIDATED &&
+ auth.sessions[1].status === SessionStatus.VALIDATED
) {
try {
expect(auth).toEqual({
});
done();
} catch (e) {
- console.log(e);
+ fail(e);
}
}
});
REMOTE_CLUSTER_CONFIG: ofType<{ config: Config }>(),
});
-export const initAuth = (config: Config) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+export const initAuth = (config: Config) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository): Promise<any> => {
// Cancel any link account ops in progress unless the user has
// just logged in or there has been a successful link operation
const data = services.linkAccountService.getLinkOpStatus();
if (!matchTokenRoute(location.pathname) &&
(!matchFedTokenRoute(location.pathname)) && data === undefined) {
- dispatch<any>(cancelLinking()).then(() => {
- dispatch<any>(init(config));
- });
- } else {
- dispatch<any>(init(config));
+ await dispatch<any>(cancelLinking());
}
+ return dispatch<any>(init(config));
};
-const init = (config: Config) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+const init = (config: Config) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
const remoteHosts = () => getState().auth.remoteHosts;
const token = services.authService.getApiToken();
let homeCluster = services.authService.getHomeCluster();
if (token && token !== "undefined") {
dispatch(progressIndicatorActions.START_WORKING(WORKBENCH_LOADING_SCREEN));
- dispatch<any>(saveApiToken(token)).then(() => {
- dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
- }).catch(() => {
+ try {
+ await dispatch<any>(saveApiToken(token)); // .then(() => {
+ await dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
+ } catch (e) {
dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN));
- });
+ }
}
};