From 6af196d9385a332ed39009e92670bc78c26c8708 Mon Sep 17 00:00:00 2001 From: Kevin Jennison Date: Fri, 24 Sep 2021 15:38:11 -0400 Subject: [PATCH 1/2] Reorder logout logic and fully clear local storage --- src/utils/__mocks__/localstorage-mgr.js | 23 +++++++++++++++++++++++ src/utils/auth/__tests__/logout.test.js | 14 +++++++------- src/utils/auth/logout.js | 12 +++++++----- 3 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 src/utils/__mocks__/localstorage-mgr.js diff --git a/src/utils/__mocks__/localstorage-mgr.js b/src/utils/__mocks__/localstorage-mgr.js new file mode 100644 index 00000000..4f42e8e0 --- /dev/null +++ b/src/utils/__mocks__/localstorage-mgr.js @@ -0,0 +1,23 @@ +import { isNil } from 'lodash/lang' + +let mockStorage = {} + +// eslint-disable-next-line no-underscore-dangle +export const __mockClear = () => { + mockStorage = {} +} + +export default { + getItem: jest.fn((key) => mockStorage[key]), + setItem: jest.fn((key, val) => { + if (!isNil(val)) { + mockStorage[key] = String(val) + } + }), + removeItem: jest.fn((key) => { + delete mockStorage[key] + }), + clear: jest.fn(() => { + __mockClear() + }), +} diff --git a/src/utils/auth/__tests__/logout.test.js b/src/utils/auth/__tests__/logout.test.js index f72909dd..31edae15 100644 --- a/src/utils/auth/__tests__/logout.test.js +++ b/src/utils/auth/__tests__/logout.test.js @@ -2,11 +2,10 @@ import getMockAuthUser from 'src/utils/testHelpers/getMockAuthUser' import { clearAllServiceWorkerCaches } from 'src/utils/caching' import logger from 'src/utils/logger' import localStorageMgr from 'src/utils/localstorage-mgr' -import { STORAGE_KEY_USERNAME } from 'src/utils/constants' jest.mock('src/utils/caching') jest.mock('src/utils/logger') -jest.mock('src/utils/localstorage-mgr', () => ({ removeItem: jest.fn() })) +jest.mock('src/utils/localstorage-mgr') afterEach(() => { jest.clearAllMocks() }) @@ -14,23 +13,23 @@ afterEach(() => { describe('logout.js', () => { it('calls AuthUser.signOut', async () => { expect.assertions(1) + clearAllServiceWorkerCaches.mockResolvedValueOnce() const mockAuthUser = getMockAuthUser() const logout = require('src/utils/auth/logout').default await logout(mockAuthUser) expect(mockAuthUser.signOut).toHaveBeenCalled() }) - it('calls clearAllServiceWorkerCaches', async () => { + it('clears local storage', async () => { expect.assertions(1) + clearAllServiceWorkerCaches.mockResolvedValueOnce() const mockAuthUser = getMockAuthUser() const logout = require('src/utils/auth/logout').default await logout(mockAuthUser) - expect(localStorageMgr.removeItem).toHaveBeenCalledWith( - STORAGE_KEY_USERNAME - ) + expect(localStorageMgr.clear).toHaveBeenCalled() }) - it('calls local storage remove item', async () => { + it('calls clearAllServiceWorkerCaches', async () => { expect.assertions(1) const mockAuthUser = getMockAuthUser() const logout = require('src/utils/auth/logout').default @@ -52,6 +51,7 @@ describe('logout.js', () => { it('resolves to `true` on success', async () => { expect.assertions(1) + clearAllServiceWorkerCaches.mockResolvedValueOnce() const mockAuthUser = getMockAuthUser() const logout = require('src/utils/auth/logout').default const result = await logout(mockAuthUser) diff --git a/src/utils/auth/logout.js b/src/utils/auth/logout.js index 6d765c1b..1f174a88 100644 --- a/src/utils/auth/logout.js +++ b/src/utils/auth/logout.js @@ -1,15 +1,17 @@ import { clearAllServiceWorkerCaches } from 'src/utils/caching' import logger from 'src/utils/logger' import localStorageMgr from 'src/utils/localstorage-mgr' -import { STORAGE_KEY_USERNAME } from 'src/utils/constants' const logout = async (AuthUser) => { try { - await AuthUser.signOut() - - // Clear the cache so it does not contain any authed content. + // Clear the cache and local data so it does not contain any + // authed content. await clearAllServiceWorkerCaches() - await localStorageMgr.removeItem(STORAGE_KEY_USERNAME) + localStorageMgr.clear() + + // Do the above first, because signing out will trigger a redirect + // to the auth page via next-firebase-auth. + await AuthUser.signOut() return true } catch (e) { logger.error(e) From 4a321fd4c27b652e6542a146a570a9bfff4ff2b7 Mon Sep 17 00:00:00 2001 From: Kevin Jennison Date: Fri, 24 Sep 2021 15:38:51 -0400 Subject: [PATCH 2/2] Be sure not to run E2E tests in watch mode --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba975b5f..3a5e9a1d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "start": "NODE_ENV=production next start --port 3001", "test": "yarn run relay && yarn run lint && yarn run jest --testPathIgnorePatterns=e2e", "test:e2e": "dotenv-extended --defaults=./.env --path=./.env.local yarn run jest e2e-tests.test.js", - "test:watch": "yarn run relay && jest --watch", + "test:watch": "yarn run test --watch", "test:coverage": "yarn run test --coverage", "format": "prettier \"**/*.{js,jsx,ts,tsx,json,css,scss,md}\"", "format:fix": "yarn run format --write",