--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import { configure, mount } from "enzyme";
+import * as Adapter from 'enzyme-adapter-react-16';
+import { AutoLogoutComponent, AutoLogoutProps } from './auto-logout';
+
+configure({ adapter: new Adapter() });
+
+describe('<AutoLogoutComponent />', () => {
+ let props: AutoLogoutProps;
+ const sessionIdleTimeout = 300;
+ const lastWarningDuration = 60;
+ jest.useFakeTimers();
+
+ beforeEach(() => {
+ props = {
+ sessionIdleTimeout: sessionIdleTimeout,
+ lastWarningDuration: lastWarningDuration,
+ doLogout: jest.fn(),
+ doWarn: jest.fn(),
+ doCloseWarn: jest.fn(),
+ };
+ mount(<div><AutoLogoutComponent {...props} /></div>);
+ });
+
+ it('should logout after idle timeout', () => {
+ jest.runTimersToTime((sessionIdleTimeout-1)*1000);
+ expect(props.doLogout).not.toBeCalled();
+ jest.runTimersToTime(1*1000);
+ expect(props.doLogout).toBeCalled();
+ });
+
+ it('should warn the user previous to close the session', () => {
+ jest.runTimersToTime((sessionIdleTimeout-lastWarningDuration-1)*1000);
+ expect(props.doWarn).not.toBeCalled();
+ jest.runTimersToTime(1*1000);
+ expect(props.doWarn).toBeCalled();
+ });
+});
\ No newline at end of file
doCloseWarn: () => dispatch(snackbarActions.CLOSE_SNACKBAR()),
});
-type AutoLogoutProps = AutoLogoutDataProps & AutoLogoutActionProps;
+export type AutoLogoutProps = AutoLogoutDataProps & AutoLogoutActionProps;
-export const AutoLogout = connect(mapStateToProps, mapDispatchToProps)(
- (props: AutoLogoutProps) => {
- let logoutTimer: NodeJS.Timer;
- const lastWarningDuration = min([props.lastWarningDuration, props.sessionIdleTimeout])! * 1000 ;
+export const AutoLogoutComponent = (props: AutoLogoutProps) => {
+ let logoutTimer: NodeJS.Timer;
+ const lastWarningDuration = min([props.lastWarningDuration, props.sessionIdleTimeout])! * 1000 ;
- const handleOnIdle = () => {
- logoutTimer = setTimeout(
- () => props.doLogout(), lastWarningDuration);
- props.doWarn(
- "Your session is about to be closed due to inactivity",
- lastWarningDuration);
- };
-
- const handleOnActive = () => {
- clearTimeout(logoutTimer);
- props.doCloseWarn();
- };
+ const handleOnIdle = () => {
+ logoutTimer = setTimeout(
+ () => props.doLogout(), lastWarningDuration);
+ props.doWarn(
+ "Your session is about to be closed due to inactivity",
+ lastWarningDuration);
+ };
- useIdleTimer({
- timeout: (props.lastWarningDuration < props.sessionIdleTimeout)
- ? 1000 * (props.sessionIdleTimeout - props.lastWarningDuration)
- : 1,
- onIdle: handleOnIdle,
- onActive: handleOnActive,
- debounce: 500
- });
+ const handleOnActive = () => {
+ clearTimeout(logoutTimer);
+ props.doCloseWarn();
+ };
- return <span />;
+ useIdleTimer({
+ timeout: (props.lastWarningDuration < props.sessionIdleTimeout)
+ ? 1000 * (props.sessionIdleTimeout - props.lastWarningDuration)
+ : 1,
+ onIdle: handleOnIdle,
+ onActive: handleOnActive,
+ debounce: 500
});
+
+ return <span />;
+};
+
+export const AutoLogout = connect(mapStateToProps, mapDispatchToProps)(AutoLogoutComponent);