From 0b00a5f9d6a20f137fa543db956906b0aac6d88f Mon Sep 17 00:00:00 2001 From: David <4661784+retyui@users.noreply.github.com> Date: Mon, 18 Oct 2021 17:15:33 +0300 Subject: [PATCH] Add useAppState tests --- src/useAppState.test.ts | 50 +++++++++++++++++++++++++++++++++++++++++ src/useAppState.ts | 8 +++---- 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/useAppState.test.ts diff --git a/src/useAppState.test.ts b/src/useAppState.test.ts new file mode 100644 index 00000000..8b60ed9f --- /dev/null +++ b/src/useAppState.test.ts @@ -0,0 +1,50 @@ +import {act, renderHook} from '@testing-library/react-hooks' +import {AppState, AppStateStatus} from 'react-native' +import {useAppState} from './useAppState' + +jest.mock('react-native', () => ({ + AppState: { + currentState: 'mock-currentState', + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + }, +})) + +describe('useAppState', () => { + const addEventListenerMock = AppState.addEventListener as jest.Mock + const createEmitAppStateChange = () => { + let listener: (newStatus: AppStateStatus) => {} + + addEventListenerMock.mockImplementationOnce((_, fn) => { + listener = fn + }) + + return (newStatus: AppStateStatus) => listener(newStatus) + } + + it('should return current state by default', () => { + const {result} = renderHook(() => useAppState()) + + expect(result.current).toBe(AppState.currentState) + }) + + it('should update state when it change', () => { + const newStatus = 'background' + const emit = createEmitAppStateChange() + + const {result} = renderHook(() => useAppState()) + + const {current: initialStatus} = result + + act(() => { + emit(newStatus) + }) + + const {current: statusAfterUpdate} = result + + expect({initialStatus, statusAfterUpdate}).toEqual({ + initialStatus: AppState.currentState, + statusAfterUpdate: newStatus, + }) + }) +}) diff --git a/src/useAppState.ts b/src/useAppState.ts index e0533967..54d2b9c6 100644 --- a/src/useAppState.ts +++ b/src/useAppState.ts @@ -5,11 +5,11 @@ export function useAppState() { const currentState = AppState.currentState const [appState, setAppState] = useState(currentState) - function onChange(newState: AppStateStatus) { - setAppState(newState) - } - useEffect(() => { + function onChange(newState: AppStateStatus) { + setAppState(newState) + } + AppState.addEventListener('change', onChange) return () => {