diff --git a/package.json b/package.json index 6f62039d..b1a9e974 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,12 @@ }, "dependencies": { "@skolplattformen/embedded-api": "^0.20.0", - "react": "^16.11.0", "react-redux": "^7.2.2", "redux": "^4.0.5" }, + "peerDependencies": { + "react": "^16.11.0" + }, "devDependencies": { "@babel/preset-env": "^7.12.13", "@babel/preset-react": "^7.12.13", @@ -45,6 +47,7 @@ "eslint-plugin-react-hooks": "^4.0.8", "events": "^3.2.0", "jest": "^26.6.3", + "react": "^16.11.0", "react-dom": "^16.11.0", "react-test-renderer": "^16.11.0", "regenerator-runtime": "^0.13.7", diff --git a/src/logout.test.js b/src/logout.test.js new file mode 100644 index 00000000..5e5c714b --- /dev/null +++ b/src/logout.test.js @@ -0,0 +1,72 @@ +import React from 'react' +import { renderHook, act } from '@testing-library/react-hooks' +import { ApiProvider } from './provider' +import { useChildList } from './hooks' +import store from './store' +import init from './__mocks__/@skolplattformen/embedded-api' +import createStorage from './__mocks__/AsyncStorage' +import reporter from './__mocks__/reporter' + +const pause = (ms = 0) => new Promise((r) => setTimeout(r, ms)) + +describe('logout - cleanup', () => { + let api + let storage + let response + const wrapper = ({ children }) => ( + + {children} + + ) + beforeEach(() => { + response = [{ id: 1 }] + api = init() + api.getChildren.mockImplementation(() => ( + new Promise((res) => { + setTimeout(() => res(response), 50) + }) + )) + storage = createStorage({ + children: [{ id: 2 }], + }, 2) + }) + afterEach(async () => { + await act(async () => { + await pause(70) + store.dispatch({ entity: 'ALL', type: 'CLEAR' }) + }) + }) + it('cleans up on logout', async () => { + await act(async () => { + api.isLoggedIn = true + api.isFake = false + + const { waitForNextUpdate: wait1 } = renderHook(() => useChildList(), { wrapper }) + + await wait1() + await wait1() + await wait1() + await pause(20) + + api.isLoggedIn = false + api.emitter.emit('logout') + + const { result } = renderHook(() => useChildList(), { wrapper }) + + expect(result.current.data).toHaveLength(0) + + api.isLoggedIn = true + api.emitter.emit('login') + + const { result: result2, waitForNextUpdate: wait2 } = renderHook(() => useChildList(), { wrapper }) + + await wait2() + + expect(result2.current.data).toHaveLength(1) + }) + }) +}) diff --git a/src/provider.tsx b/src/provider.tsx index d6ffda4f..1da62b66 100644 --- a/src/provider.tsx +++ b/src/provider.tsx @@ -7,7 +7,7 @@ import React, { import { Provider } from 'react-redux' import { ApiContext } from './context' import store from './store' -import { AsyncStorage, IApiContext, Reporter } from './types' +import { AsyncStorage, EntityAction, IApiContext, Reporter } from './types' type TApiProvider = FC { setIsLoggedIn(api.isLoggedIn) setIsFake(api.isFake) + + if (!api.isLoggedIn) { + store.dispatch({ type: 'CLEAR', entity: 'ALL' }) + } } api.on('login', handler) diff --git a/yarn.lock b/yarn.lock index cec830c9..e3d83370 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4792,9 +4792,9 @@ react-test-renderer@^16.11.0: scheduler "^0.17.0" react@^16.11.0: - version "16.11.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb" - integrity sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g== + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1"