beforeAll(() => { jest.spyOn(global, 'setTimeout'); document.body.innerHTML = `

Your session will end soon. Please choose to extend your session or sign out. Your session will expire in 5 minutes or less.

You have been inactive for too long. Your session will expire in .

`; const sessionTimerModule = require('../../app/assets/javascripts/timeoutPopup.js'); window.NotifyModules.start(); }); afterAll(() => { document.body.innerHTML = ''; }); describe('When the session timer module is loaded', () => { beforeEach(() => { jest.useFakeTimers(); }); afterEach(() => { jest.useFakeTimers(); }); test('everything initializes properly', () => { const sessionTimer = document.getElementById('sessionTimer'); sessionTimer.showModal = jest.fn(); sessionTimer.close = jest.fn(); jest.runAllTimers(); }); }); describe('The session timer ', () => { beforeEach(() => { jest.useFakeTimers(); }); afterEach(() => { jest.useFakeTimers(); }); test('signoutUser method logs the user out', () => { const restore = mockWindowLocation(); // Test the actual function, not a mock const signoutUserMethod = window.NotifyModules.TimeoutPopup.signoutUser; // This will try to set location.href but our mock will catch it expect(() => signoutUserMethod()).not.toThrow(); restore(); }); test('expireUserSession method logs the user out with next query parameter', () => { const restore = mockWindowLocation(); // Test the actual function, not a mock const expireUserSessionMethod = window.NotifyModules.TimeoutPopup.expireUserSession; // This will try to set location.href but our mock will catch it expect(() => expireUserSessionMethod()).not.toThrow(); restore(); }); test('extendSession method reloads the page', () => { const restore = mockWindowLocation(); // Test the actual function, not a mock const extendSessionMethod = window.NotifyModules.TimeoutPopup.extendSession; // This will try to call location.reload but our mock will catch it expect(() => extendSessionMethod()).not.toThrow(); restore(); }); test('showTimer method shows the session timer modal', () => { const sessionTimer = document.getElementById('sessionTimer'); sessionTimer.showModal = jest.fn(); const showTimerMock = jest.spyOn(sessionTimer, 'showModal'); window.NotifyModules.TimeoutPopup.showTimer(); expect(showTimerMock).toHaveBeenCalled(); }); test('closeTimer method closes the session timer modal', () => { const sessionTimer = document.getElementById('sessionTimer'); sessionTimer.close = jest.fn(); const closeTimerMock = jest.spyOn(sessionTimer, 'close'); window.NotifyModules.TimeoutPopup.closeTimer(); expect(closeTimerMock).toHaveBeenCalled(); }); test('checkTimer is called', () => { const checkTimerMock = jest.spyOn( window.NotifyModules.TimeoutPopup, 'checkTimer' ); window.NotifyModules.TimeoutPopup.checkTimer(); expect(checkTimerMock).toHaveBeenCalled(); }); });