Add auth reducer tests
authorDaniel Kos <daniel.kos@contractors.roche.com>
Wed, 6 Jun 2018 15:33:40 +0000 (17:33 +0200)
committerDaniel Kos <daniel.kos@contractors.roche.com>
Wed, 6 Jun 2018 15:39:51 +0000 (17:39 +0200)
Feature #13563

Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos@contractors.roche.com>:

package.json
src/services/auth-service/auth-service.ts
src/store/auth/auth-reducer.test.ts [new file with mode: 0644]
yarn.lock

index 9a31c4e7fddfa5169574cf2cf0f41bdf85393211..ac890d8d89460f5e42f70ab33b4f43c8f67c67da 100644 (file)
@@ -34,8 +34,9 @@
     "@types/react-router-dom": "4.2.7",
     "@types/react-router-redux": "5.0.15",
     "@types/redux-devtools": "3.0.44",
-    "typescript": "2.9.1",
-    "redux-devtools": "3.4.1"
+    "jest-localstorage-mock": "2.2.0",
+    "redux-devtools": "3.4.1",
+    "typescript": "2.9.1"
   },
   "moduleNameMapper": {
     "^~/(.*)$": "<rootDir>/src/$1"
index 12c5b6801277c97a455a5a18415b877c2064f7e9..9e75c72a9fa54f8fa27a2f33c657506823d04556 100644 (file)
@@ -5,10 +5,10 @@
 import { API_HOST } from "../../common/server-api";
 import { User } from "../../models/user";
 
-const API_TOKEN_KEY = 'apiToken';
-const USER_EMAIL_KEY = 'userEmail';
-const USER_FIRST_NAME_KEY = 'userFirstName';
-const USER_LAST_NAME_KEY = 'userLastName';
+export const API_TOKEN_KEY = 'apiToken';
+export const USER_EMAIL_KEY = 'userEmail';
+export const USER_FIRST_NAME_KEY = 'userFirstName';
+export const USER_LAST_NAME_KEY = 'userLastName';
 
 export default class AuthService {
 
diff --git a/src/store/auth/auth-reducer.test.ts b/src/store/auth/auth-reducer.test.ts
new file mode 100644 (file)
index 0000000..3d60c4f
--- /dev/null
@@ -0,0 +1,83 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import authReducer from "./auth-reducer";
+import actions from "./auth-action";
+import {
+    API_TOKEN_KEY,
+    USER_EMAIL_KEY,
+    USER_FIRST_NAME_KEY,
+    USER_LAST_NAME_KEY
+} from "../../services/auth-service/auth-service";
+
+require('jest-localstorage-mock');
+
+describe('auth-reducer', () => {
+    beforeAll(() => {
+        localStorage.clear();
+    });
+
+    it('should return default state on initialisation', () => {
+        const initialState = undefined;
+        const state = authReducer(initialState, actions.INIT());
+        expect(state).toEqual({
+            apiToken: undefined,
+            user: undefined
+        });
+    });
+
+    it('should read user and api token from local storage on init if they are there', () => {
+        const initialState = undefined;
+
+        localStorage.setItem(API_TOKEN_KEY, "token");
+        localStorage.setItem(USER_EMAIL_KEY, "test@test.com");
+        localStorage.setItem(USER_FIRST_NAME_KEY, "John");
+        localStorage.setItem(USER_LAST_NAME_KEY, "Doe");
+
+        const state = authReducer(initialState, actions.INIT());
+        expect(state).toEqual({
+            apiToken: "token",
+            user: {
+                email: "test@test.com",
+                firstName: "John",
+                lastName: "Doe"
+            }
+        });
+    });
+
+    it('should store token in local storage', () => {
+        const initialState = undefined;
+
+        const state = authReducer(initialState, actions.SAVE_API_TOKEN("token"));
+        expect(state).toEqual({
+            apiToken: "token",
+            user: undefined
+        });
+
+        expect(localStorage.getItem(API_TOKEN_KEY)).toBe("token");
+    });
+
+    it('should set user details on success fetch', () => {
+        const initialState = undefined;
+
+        const userDetails = {
+            email: "test@test.com",
+            first_name: "John",
+            last_name: "Doe",
+            is_admin: true
+        };
+
+        const state = authReducer(initialState, actions.USER_DETAILS_SUCCESS(userDetails));
+        expect(state).toEqual({
+            apiToken: undefined,
+            user: {
+                email: "test@test.com",
+                firstName: "John",
+                lastName: "Doe"
+            }
+        });
+
+        expect(localStorage.getItem(API_TOKEN_KEY)).toBe("token");
+    });
+});
index 2d6ca3c1c10c2a2f198222c269f3867b7f1a1dcd..17549e01dbd103de463b6cf7b5fec27b85bfa1b1 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -4003,6 +4003,10 @@ jest-leak-detector@^22.4.0:
   dependencies:
     pretty-format "^22.4.3"
 
+jest-localstorage-mock@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/jest-localstorage-mock/-/jest-localstorage-mock-2.2.0.tgz#ce9a9de01dfdde2ad8aa08adf73acc7e5cc394cf"
+
 jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"